異或圖

異或圖

傳送門

思路:

簡單推一下:

len=1len=1時:

要滿足a[u]a[v]=ka[u]\oplus a[v]=k

len>1len>1時:

ep:len=2ep:len=2

a[u]a[x]a[v]=ka[v]=a[u]ka[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]ka[x]=a[u]\oplus k

len>2len>2

ep:len=3ep:len=3

a[u]a[x]a[y]a[v]=a[u]ka[v]=0a[u]a[v]=ka[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

這樣顯然可以直接用len=1len=1

此題的坑點是很容易超時,要用快讀,而且牛客的評測機快讀也容易超時,相同的代碼,我交兩遍一份ACAC,一份超時。。

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章