关于校园图书馆网站建设,推广公司业务发朋友圈,wordpress添加端口访问不了,博物馆布展设计公司E-Eert Esiwtib
位运算考虑贡献时分0/1按位模拟考虑 fu,0/1/2f_{u,0/1/2}fu,0/1/2表示子树u中点#xff08;包括u#xff09;到u所有路径的或/与/异或值。
转移的时候我们要考虑两个东西#xff0c;一个是位运算对于路径值的影响#xff0c;另一个是位运算对于所有路径…E-Eert Esiwtib
位运算考虑贡献时分0/1按位模拟考虑 fu,0/1/2f_{u,0/1/2}fu,0/1/2表示子树u中点包括u到u所有路径的或/与/异或值。
转移的时候我们要考虑两个东西一个是位运算对于路径值的影响另一个是位运算对于所有路径值的或/与/异或和的影响。
合并子树的时候自己稍微推下式子即可按位并且0/1拆分考虑贡献更容易帮助理解。
Alkaid~题解
#includebits/stdc.h
using namespace std;
using lllong long;
template class Tint T rd()
{T res0;T fg1;char chgetchar();while(!isdigit(ch)) {if(ch-) fg-1;chgetchar();}while( isdigit(ch)) res(res1)(res3)(ch^48),chgetchar();return res*fg;
}
const int N200010;
int h[N],e[N],ne[N],op[N],idx;
void add(int a,int b,int c){e[idx]b,ne[idx]h[a],op[idx]c,h[a]idx;}
int n,m;
ll val[N];
vectorpairint,int q[105];
ll f[N][3],g[N][3];
ll ans[N][3];
int sz[N];
void update(int u,int v,int op)
{if(op0){f[u][0]|f[v][0]|val[u];f[u][1]f[v][1]|val[u];f[u][2]^(sz[v]1?val[u]:0)|(~val[u]f[v][2]);}else if(op1){f[u][0]|f[v][0]val[u];f[u][1]f[v][1]val[u];f[u][2]^f[v][2]val[u];}else{f[u][0]|(f[v][0]~val[u])|(~f[v][1]val[u]);f[u][1](f[v][1]~val[u])|(~f[v][0]val[u]);f[u][2]^(sz[v]1?val[u]:0)^f[v][2];}
}
void dfs(int u,int fa)
{sz[u]1;f[u][0]0; // 或f[u][1]-1;// 与f[u][2]0; // 异或for(int ih[u];i!-1;ine[i]){int ve[i];if(vfa) continue;dfs(v,u);sz[u]sz[v];update(u,v,op[i]);}memcpy(g[u],f[u],sizeof f[u]);f[u][0]|val[u];f[u][1]val[u];f[u][2]^val[u];
}
int main()
{nrd(),mrd();memset(h,-1,sizeof h);for(int i1;in;i) val[i]rdll();for(int i2;in;i) {int urd(),oprd();add(u,i,op);}for(int i1;im;i){int drd(),urd();q[d].push_back({u,i});}for(int d0;d100;d){if(d) for(int i1;in;i) val[i]i;dfs(1,0);for(auto[u,k]:q[d]) memcpy(ans[k],g[u],sizeof g[u]);}for(int i1;im;i) printf(%lld %lld %lld\n,ans[i][0],ans[i][1],ans[i][2]);return 0;
}