Codeforces Round #316 (Div. 2) D. Tree Requests dfs_clock,二分

将每一层的字符保存下来,并算出没个节点的时间戳,然后就可以二分查找了,当奇数个字符<=1就可以构成回文,用二进制处理一下。
【Codeforces Round #316 (Div. 2) D. Tree Requests dfs_clock,二分】

#include #include #include #include #include #include #include #include #include #include #include #include #include #define fi first #define se second #define pii pair #define inf (1<<30) #define eps 1e-8 #define ll long long using namespace std; const int maxn=510005; int n,m; vectorg[maxn]; char s[maxn]; vectordep[maxn]; vectorop[maxn]; int id[maxn][2]; int deep[maxn]; int mx[maxn]; int dfs_clock=1; void dfs(int u,int d) { deep[u]=mx[u]=d; id[u][0]=dfs_clock++; dep[d].push_back(1<<(s[u]-'a')); op[d].push_back(id[u][0]); for(int i=0; imx[u]) { printf("Yes\n"); } else { int i=upper_bound(op[h].begin(),op[h].end(),id[u][0])-op[h].begin(); int j=upper_bound(op[h].begin(),op[h].end(),id[u][1])-op[h].begin()-1; int a; if(i-1>=0) a=dep[h][j]^dep[h][i-1]; else a=dep[h][j]; int num=0; for(int i=0; i<26; i++) { if(a&(1<



    推荐阅读