BZOJ 3569: DZY Loves Chinese II

一開始看到這道題的時候 簡直懵逼
(我是摸着線性基這個標籤來的

然後去膜題解。。what?還有這種操作。。
神題啊QAQ

給一篇不錯的題解 (沒錯 我參考了他的代碼 因爲寫的挺不錯的。。)
upd: 講道理我也是覺得這個做法是需要一個證明的 於是去找了董先生QAQ
Orz董先生 董先生寫了個正確性證明 大家可以去看看

爲什麼會WA呢 因爲據說是有錯誤率的。。。
所以你可以把隨機數範圍弄到LL 或者 你想卡過去的話 換多幾個時間種子吧。。
所以說 3237也可以用這種做法過 嘿嘿嘿

#include<bits/stdc++.h>
#define me(a,x) memset(a,x,sizeof a)
using namespace std;
const int N=1e5+2;
char B[1<<14],*S=B,*T=B;
#define gc (S==T&&(T=(S=B)+fread(B,1,1<<14,stdin),S==T)?-1:*S++)
inline int read(){
    int x=0,f=1; char ch=gc;
    while(ch<'0' || ch>'9'){if(ch=='-')f=-1; ch=gc;}
    while(ch>='0' && ch<='9'){x=(x<<1)+(x<<3)+ch-'0'; ch=gc;}
    return x*f;
}
struct edge{int x,y,nex;}a[N*10]; int len,fir[N];
void ins(int x,int y){
    a[++len]=(edge){x,y,fir[x]},fir[x]=len;
}
bool v[N]; int num[N*10],c[N],p[32];
void dfs(int x,int fa){
    v[x]=1;
    for(int k=fir[x];k;k=a[k].nex){
        int y=a[k].y; if(y==fa)continue;
        if(!v[y])dfs(y,x);
        else num[k>>1]=rand();
    }
}
void sol(int x,int fa){
    v[x]=1;
    for(int k=fir[x];k;k=a[k].nex){
        int y=a[k].y; if(y==fa || v[y])continue;
        sol(y,x); c[x]^=c[y],num[k>>1]=c[y];
    }
}
int main(){
    srand(77821594); len=1;
    int n=read(),m=read(),i;
    for(i=1;i<=m;++i){
        int x=read(),y=read();
        ins(x,y),ins(y,x);
    }
    dfs(1,0);
    for(i=1;i<=m;++i) c[a[i<<1].x]^=num[i],c[a[i<<1].y]^=num[i];
    me(v,0);  sol(1,0);
    int q=read(),cnt=0;
    while(q--){
        int k=read();
        me(p,0); bool ok=1;
        for(i=1;i<=k;++i){
            int x=read()^cnt;
            x=num[x];
            for(int j=31;~j;--j) if(x>>j&1){
                if(!p[j]){p[j]=x; break;}
                else x^=p[j];
            }
            if(!x)ok=0;
        }
        if(ok)puts("Connected"),++cnt;
        else puts("Disconnected");
    }
    return 0;
}
發佈了173 篇原創文章 · 獲贊 203 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章