constint N = 1e5 + 10; int n, k; vector<int> e[N]; int l[N], r[N], id[N], sz[N], hs[N], tot;
inlinevoidadd(int u)//加入u对info的影响 { }
inlinevoiddel(int u)//清除u对info的影响 { }
inlinevoidquery(int k, int u) { }
voiddfs_init(int u,int f){ l[u] = ++tot; id[tot] = u; sz[u] = 1; hs[u] = -1; for (auto v : e[u]) { if (v == f) continue; dfs_init(v, u); sz[u] += sz[v]; if (hs[u] == -1 || sz[v] > sz[hs[u]]) hs[u] = v; } r[u] = tot; }
voiddfs_solve(int u, int f, bool keep){ for (auto v : e[u]) { if (v != f && v != hs[u]) { dfs_solve(v, u, false); } } if (hs[u] != -1) { dfs_solve(hs[u], u, true); }
for (auto v : e[u]) { if (v != f && v != hs[u]) { for (int x = l[v]; x <= r[v]; x++) query(id[x]); for (int x = l[v]; x <= r[v]; x++) add(id[x]); } } //query(u); add(u); if (!keep) { for(int x = l[u]; x <= r[u]; x++) del(id[x]); } }
voidsolve() { cin>>n; for (int i = 1; i < n; i++) { int u, v; cin>>u>>v; e[u].push_back(v); e[v].push_back(u); } dfs_init(1, 0); dfs_solve(1, 0, false); }
// AC one more times // nndbk #include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; constint mod = 1e9 + 7; constint N = 5e5 + 10; int n, m; vector<int> e[N]; int l[N], r[N], id[N], sz[N], hs[N], tot; string s; int c[N],cnt[N][30],dep[N],ans[N]; vector<array<int,2>>que[N]; inlinevoidadd(int u) { cnt[dep[u]][c[u]]++; }
voiddfs_solve(int u, int f, bool keep){ for (auto v : e[u]) { if (v != f && v != hs[u]) { dfs_solve(v, u, false); } } if (hs[u] != -1) { dfs_solve(hs[u], u, true); }
for (auto v : e[u]) { if (v != f && v != hs[u]) { // for (int x = l[v]; x <= r[v]; x++) // query(id[x]); for (int x = l[v]; x <= r[v]; x++) add(id[x]); } } add(u); query(u);
if (!keep) { for(int x = l[u]; x <= r[u]; x++) del(id[x]); } }
voidsolve() { cin>>n>>m; for (int v = 2; v <= n; v++) { int u; cin>>u; e[u].push_back(v); e[v].push_back(u); } cin>>s; s = "?"+s; for(int i = 1;i <= n; i++) c[i] = s[i]-'a';
for(int i = 1;i <= m; i++) { int u,h; cin>>u>>h;//以u为根的子树内深度为h的节点上的字母重排后能否构成回文 que[u].push_back({h,i}); }
dfs_init(1, 0); dfs_solve(1, 0, false);
for(int i = 1;i <= m; i++) { if(ans[i])cout<<"Yes\n"; else cout<<"No\n"; } }
// AC one more times // nndbk #include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; constint mod = 1e9 + 7; constint N = 1e5 + 10; int n, k; vector<int> e[N]; int l[N], r[N], id[N], sz[N], hs[N], tot; int w[N],mp[1048576 + 10][22][2]; ll res; inlinevoidadd(int k,int u) { for(int i = 0;i < 22; i++) mp[k][i][(u>>i)&1]++; }
inlinevoidquery(int k, int u) { for(int i = 0;i < 22; i++) if((u>>i)&1) res += (1ll<<i)*mp[k][i][0]; else res += (1ll<<i)*mp[k][i][1]; }
voiddfs_init(int u,int f){ l[u] = ++tot; id[tot] = u; sz[u] = 1; hs[u] = -1; for (auto v : e[u]) { if (v == f) continue; dfs_init(v, u); sz[u] += sz[v]; if (hs[u] == -1 || sz[v] > sz[hs[u]]) hs[u] = v; } r[u] = tot; }
voiddfs_solve(int u, int f, bool keep){ for (auto v : e[u]) { if (v != f && v != hs[u]) { dfs_solve(v, u, false); } } if (hs[u] != -1) { dfs_solve(hs[u], u, true); }
for (auto v : e[u]) { if (v != f && v != hs[u]) { for (int x = l[v]; x <= r[v]; x++) query(w[id[x]]^w[u],id[x]); for (int x = l[v]; x <= r[v]; x++) add(w[id[x]],id[x]); } } //query(u); add(w[u],u); if (!keep) { for(int x = l[u]; x <= r[u]; x++) del(w[id[x]],id[x]); } }
voidsolve() { cin>>n; for(int i = 1;i <= n; i++) cin>>w[i]; for (int i = 1; i < n; i++) { int u, v; cin>>u>>v; e[u].push_back(v); e[v].push_back(u); } dfs_init(1, 0); dfs_solve(1, 0, false); //cout<<sizeof(mp)/1024/1024<<'\n'; cout<<res<<"\n"; }