[codechef]WEASELTX
来源:互联网 发布:java m5解密 编辑:程序博客网 时间:2024/06/06 02:05
题目大意
有一颗点权树。
每过一天,就会自上而下更新,更新的含义是点权变成子树内点权异或和。
若干个询问询问第d天根节点的点权。
分析
很显然深度相同的可以缩在一起。
我们设a[i][j]表示第i天深度为j的节点点权是否会给根节点带来影响。
容易发现
也就是
那么
根据库默尔定理有
可以考虑到把值域分块。
用f[A,B]表示后半部分为B的前半部分与Aand结果为0的点权异或和。
询问时枚举后半部分即可。
#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;const int maxn=200000+10;int h[maxn],go[maxn*2],nxt[maxn*2],dep[maxn];ll a[maxn],val[maxn],f[512+20][512+20],ans,num;int i,j,k,l,t,n,m,tot,top,mx,A,B;ll read(){ ll x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x*f;}void add(int x,int y){ go[++tot]=y; nxt[tot]=h[x]; h[x]=tot;}void dfs(int x,int y){ val[dep[x]]^=a[x]; mx=max(mx,dep[x]); int t=h[x]; while (t){ if (go[t]!=y){ dep[go[t]]=dep[x]+1; dfs(go[t],x); } t=nxt[t]; }}int main(){ n=read();m=read(); fo(i,1,n-1){ j=read();k=read(); j++;k++; add(j,k);add(k,j); } fo(i,1,n) a[i]=read(); dfs(1,0); fo(i,0,mx){ A=i/512;B=i%512; fo(j,0,511) if ((A&j)==0) f[j][B]^=val[i]; } while (m--){ t=(read()-1)%262144; if (t==-1){ printf("%lld\n",a[1]); continue; } A=t/512;B=t%512; ans=0; fo(j,0,511) if ((B&j)==0) ans^=f[A][j]; printf("%lld\n",ans); }}
阅读全文
1 0
- [codechef]WEASELTX
- CodeChef
- CodeChef
- CodeChef
- CodeChef
- (CodeChef
- CodeChef
- CodeChef
- CodeChef
- CodeChef
- CodeChef
- CodeChef
- CodeChef CIELQUIZ
- 【codechef除草】
- CODECHEF::FCTRL
- CodeChef A
- codechef Flooring
- codechef Wall
- hadoop相关常用配置
- Java面试笔试指南(四)---基本类型、字符串、数组与运算
- View事件分发机制——requestDisallowInterceptTouchEvent的用法
- toolButton 及 toolButton emit自己的指针
- android开机动画源文件配置
- [codechef]WEASELTX
- hdu 4398 X mod f(x)(数位DP)
- 把一个对象的属性值拷贝到另一个对象上去
- setup time的一些思考点
- HDU1013
- 例题6-16 单词(Play On Words, UVa 10129)
- mysql_数据完整性
- 卡尔曼滤波算法分析
- HDU 4821 字符串哈希