题意解释:
这道题就是给一些线段连着的点,然后有两个操作:
1.将x到y之间的所有线段的值w与z异或
2.计算所有连着x点的线段的异或值
对于操作1我们发现,只改变了x,y点处的值,二者中间的点由于连接的两边都要异或一下,两次异或等于本身,故不变。
我们用一个数组a对每个点的异或值进行存储一下,即可。
代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define int long long
const int N=5e5+10;
int n,q,x,y,w,z,op;
int a[N];
signed main()
{
scanf("%lld%lld",&n,&q);
for(int i=1;i<n;i++)
{
scanf("%lld%lld%lld",&x,&y,&w);
a[x]^=w;
a[y]^=w;//存储初始连接边的异或值
}
while(q--)
{
scanf("%lld",&op);
if(op==1)
{
scanf("%lld%lld%lld",&x,&y,&z);
a[x]^=z;
a[y]^=z;//修改边界点的异或值
}
else if(op==2)
{
scanf("%lld",&x);
printf("%lld\n",a[x]);
}
}
return 0;
}
这道题对时间要求比较严格,建议使用scanf,printf输入输出,另外,过不了可以换换编译器试试。