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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值