天天看点

异或图

异或图

思路:

简单推一下:

当 l e n = 1 len=1 len=1时:

要满足 a [ u ] ⊕ a [ v ] = k a[u]\oplus a[v]=k a[u]⊕a[v]=k

当 l e n > 1 len>1 len>1时:

e p : l e n = 2 ep:len=2 ep:len=2时

a [ u ] ⊕ a [ x ] ⊕ a [ v ] = k ⊕ a [ v ] = a [ u ] ⊕ k a[u]\oplus a[x]\oplus a[v]=k\oplus a[v]=a[u]\oplus k a[u]⊕a[x]⊕a[v]=k⊕a[v]=a[u]⊕k

→ a [ u ] = = a [ v ] , \rightarrow a[u]==a[v], →a[u]==a[v],且存在 a [ x ] = a [ u ] ⊕ k a[x]=a[u]\oplus k a[x]=a[u]⊕k

l e n > 2 len>2 len>2时

e p : l e n = 3 ep:len=3 ep:len=3

a [ u ] ⊕ a [ x ] ⊕ a [ y ] ⊕ a [ v ] = a [ u ] ⊕ k ⊕ a [ v ] = 0 → a [ u ] ⊕ a [ v ] = k a[u]\oplus a[x]\oplus a[y]\oplus a[v]=a[u]\oplus k\oplus a[v]=0\rightarrow a[u]\oplus a[v]=k a[u]⊕a[x]⊕a[y]⊕a[v]=a[u]⊕k⊕a[v]=0→a[u]⊕a[v]=k

这样显然可以直接用 l e n = 1 len=1 len=1。

此题的坑点是很容易超时,要用快读,而且牛客的评测机快读也容易超时,相同的代码,我交两遍一份 A C AC AC,一份超时。。

#include<bits/stdc++.h>     using namespace std;     typedef long long ll;     const int N=1e6+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;     #define mst(a) memset(a,0,sizeof a)     #define lx x<<1     #define rx x<<1|1     #define reg register     #define PII pair<int,int>     #define fi first     #define se second     int a[N];     inline void read(int &x){         x=0;int w=1;         char ch=getchar();         while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}         for(;ch>='0'&&ch<='9';ch=getchar())             x=(x<<3)+(x<<1)+(ch&15);         x*=w;     }     unordered_map<int,bool>mp;     int main(){         int n,q;         read(n),read(q);         for(int i=1,x;i<=n;i++) read(a[i]),mp[a[i]]=1;         while(q--){             int k,x,y;             read(k),read(x),read(y);             if((a[x]^a[y])==k) printf("1\n");             else if(a[x]==a[y]&&mp[a[x]^k]) printf("2\n");             else printf("-1\n");         }         return 0;     }           

继续阅读