• codeforces246E Blood Cousins Return


    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

    本文作者:ljh2000
    作者博客:http://www.cnblogs.com/ljh2000-jump/
    转载请注明出处,侵权必究,保留最终解释权!

    题目链接:codeforces246E

    正解:$dsu$ $on$ $tree$

    解题报告:

      又是套路题…

      用一个$map$存一下每个深度的每种字符串出现次数,另外开一个数组记录一下每个深度的$ans$,然后离线做。

      

    //It is made by ljh2000
    //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <ctime>
    #include <vector>
    #include <queue>
    #include <map>
    #include <set>
    #include <string>
    #include <complex>
    #include <bitset>
    using namespace std;
    typedef long long LL;
    typedef long double LB;
    typedef complex<double> C;
    const double pi = acos(-1);
    const int MAXN = 200011;//数组开小了...
    const int MAXM = 400011;
    int n,m,father[MAXN],ecnt,first[MAXN],next[MAXM],to[MAXM],size[MAXN],son[MAXN];
    int ans[MAXN],Son,deep[MAXN],sum[MAXN];
    string ch[MAXN];
    struct node{ int id,x; }tmp;
    vector<node>w[MAXN];
    map<string,int>cnt[MAXN];
    
    inline void link(int x,int y){ next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=y; }
    inline int getint(){
        int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
        if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
    }
    
    inline void dfs(int x){
    	size[x]=1;
    	for(int i=first[x];i;i=next[i]) {
    		int v=to[i]; deep[v]=deep[x]+1;
    		dfs(v);	size[x]+=size[v];
    		if(size[v]>size[son[x]]) son[x]=v;
    	}
    }
    
    inline void add(int x,int type){
    	if(type==1) {
    		cnt[ deep[x] ][ ch[x] ]++;
    		if(cnt[ deep[x] ][ ch[x] ]==1) sum[ deep[x] ]++;
    	}
    	else {
    		cnt[ deep[x] ][ ch[x] ]--;
    		if(cnt[ deep[x] ][ ch[x] ]==0) sum[ deep[x] ]--;
    	}
    	for(int i=first[x];i;i=next[i]) {
    		int v=to[i]; if(v==Son) continue;
    		add(v,type);
    	}
    }
    
    inline void solve(int x,bool top){
    	for(int i=first[x];i;i=next[i]) {
    		int v=to[i]; if(v==son[x]) continue;
    		solve(v,1);
    	}
    
    	if(son[x])
    		solve(son[x],0),Son=son[x];
    
    	add(x,1);
    	Son=0;
    
    	for(int i=0,ss=w[x].size();i<ss;i++) {
    		tmp=w[x][i];
    		ans[tmp.id]=sum[deep[x]+tmp.x/*!!!*/];
    	}
    
    	if(top)
    		add(x,-1);
    }
    
    inline void work(){
    	n=getint();
    	for(int i=1;i<=n;i++) {
    		cin>>ch[i];
    		father[i]=getint();
    		link(father[i],i);
    	}
    	m=getint(); int x,y;
    	for(int i=1;i<=m;i++) { x=getint(); y=getint(); tmp.id=i; tmp.x=y; w[x].push_back(tmp); }
    	for(int i=1;i<=n;i++)
    		if(father[i]==0)
    			dfs(i);
    	for(int i=1;i<=n;i++)
    		if(father[i]==0) 
    			solve(i,1);
    
    	for(int i=1;i<=m;i++)
    		printf("%d
    ",ans[i]);
    }
    
    int main()
    {
        work();
        return 0;
    }
    //有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
    

      

  • 相关阅读:
    QT:不规则窗口的实现
    Sql Server (错误:7302)
    Qt源码分析之信号和槽机制
    Linux下如何发布Qt程序
    QT程序制作deb包并安装在应用程序菜单
    Another Look at Events(再谈Events)
    Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)
    新浪微博回归平静
    Qt中 QString 和int, char等的“相互”转换,关键是QString.toLocal8Bit().data();
    QT中异形窗口的绘制(winEvent处理WM_NCHITTEST消息)
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/6535131.html
Copyright © 2020-2023  润新知