这题呢,就是知道异或的性质就可以了
一:
相同为0,不同为1,即
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
二:
(1)交换律: A ^ B = B ^ A
(2)结合律: ( A ^ B ) ^ C = A ^ ( B ^ C )
(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)
(本题就是用的这个性质,对于操作一除了开头与结尾异或一次,其余异或两次,故不变,所以直接维护点就可以了)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
#define int long long
int g[N];
int n,q;
int u,v,w;
int a,b,c;
signed main()
{std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);cin>>n>>q;for(int i=1;i<n;i++){cin>>u>>v>>w;g[u]^=w;g[v]^=w;}while(q--){int op;cin>>op;if(op==1){cin>>a>>b>>c;g[a]^=c,g[b]^=c;}else {cin>>a;cout<<g[a]<<'\n';}}return 0;
}
其他操作性质
按位或运算符(|)(有1为1,全0则0)
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。
例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。
按位与运算符(&)(有0为0,全1则1)
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。