异或图

异或图

传送门

思路:

简单推一下:

l e n = 1 len=1 时:

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

l e n > 1 len>1 时:

e p : l e n = 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 [ v ] , \rightarrow a[u]==a[v], 且存在 a [ x ] = a [ u ] k a[x]=a[u]\oplus k

l e n > 2 len>2

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

扫描二维码关注公众号,回复: 11378396 查看本文章

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

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

此题的坑点是很容易超时,要用快读,而且牛客的评测机快读也容易超时,相同的代码,我交两遍一份 A C 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/106980963