zoukankan      html  css  js  c++  java
  • 246E.Bloods Counsin Return(离线+树上启发式合并)

    给出一棵树,每个节点上有一个字符串。

    每次询问子树x内的第y层儿子中不重复名字的个数。

    题解:

    树上启发式合并的过程中,数组f维护第i层中有多少种不同的字符串。

    这里不太好直接维护,用set维护f数组即可。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=2e5+100;
    int c[maxn];
    vector<int> g[maxn];
    set<string> f[maxn];
    int L[maxn],R[maxn],id[maxn];
    int dep[maxn];
    int size[maxn];
    int tot;
    int son[maxn];
    int n,m;
    int ans[maxn];
    vector<pair<int,int> > q[maxn];
    string s[maxn];
    
    void dfs1 (int x,int pre) {
    	dep[x]=dep[pre]+1;
    	size[x]=1;
    	L[x]=++tot;
    	id[tot]=x;
    	for (int y:g[x]) {
    		if (y==pre) continue;
    		dfs1(y,x);
    		size[x]+=size[y];
    		if (size[son[x]]<size[y]) son[x]=y;
    	}
    	R[x]=tot;
    }
    void cal (int x,int pre) {
    	f[dep[x]].insert(s[x]);
    	for (int y:g[x]) {
    		if (y==son[x]||y==pre) continue;
    		for (int j=L[y];j<=R[y];j++) {
    			int z=id[j];
    			f[dep[z]].insert(s[z]);
    		}
    	}
    	for (pair<int,int> y:q[x]) {
    		ans[y.second]=f[y.first].size();
    	}
    }
    void dfs2 (int x,int pre,int kp) {
    	for (int y:g[x]) {
    		if (y==son[x]||y==pre) continue;
    		dfs2(y,x,0);
    	}
    	if (son[x]) {
    		dfs2(son[x],x,1);
    	}
    	cal(x,pre); 
    	if (!kp) for (int i=L[x];i<=R[x];i++) f[dep[id[i]]].clear();
    }
    int rt;
    int main () {
    	scanf("%d",&n);
    	for (int i=1;i<=n;i++) {
    		int x;
    		cin>>s[i]>>x;
    		g[x].push_back(i);
    	}
    	
    	scanf("%d",&m);
    	dfs1(0,0);
    	//for (int i=1;i<=n;i++) printf("%d ",dep[i]);
    	//printf("
    ");
    	for (int i=1;i<=m;i++) {
    		int x,y;
    		scanf("%d%d",&x,&y);
    		//printf("%d %d
    
    ",dep[x],y);
    		q[x].push_back(make_pair(dep[x]+y,i));
    	} 
    	dfs2(0,-1,1);
    	for (int i=1;i<=m;i++) printf("%d
    ",ans[i]);
    }
  • 相关阅读:
    UVa 725 Division --- 简单枚举
    最短路之Floyd算法
    最短路之Bellman-Ford算法
    快速排序算法
    Dijkstra算法 --- 单源最短路
    HDU 2553 N皇后问题 --- 经典回溯
    HDU 2072 单词数
    HDU 1241 Oil Deposits --- 入门DFS
    jq val() 和 html() 用法注意
    jq 登录正则验证
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/14610839.html
Copyright © 2011-2022 走看看