bzoj 3563: DZY Loves Chinese

来源:互联网 发布:上海地铁免费查询软件 编辑:程序博客网 时间:2024/06/05 01:55

题解

这题很搞笑。。
想了一下发现,这个强制在线可以帮我出答案
难点就是怎么找到每个询问是什么
问了下做过的人,没有行末回车
于是就可以很愉快地乱搞了,具体看代码。。
然后最后一次暴力搞就行了

#include<cstdio>#include<cstring>const int M=500000;int n,m,q;char ss[1005];int ans=0;//之前有多少个bool ok[M];int f[M];int X[M],Y[M];int find (int x){    return f[x]==x?f[x]:f[x]=find(f[x]);}int main(){    scanf("%d%d",&n,&m);    for (int u=1;u<=m;u++)  scanf("%d%d",&X[u],&Y[u]);    scanf("%d\n",&q);    for (int u=1;u<=q;u++)    {        gets(ss);        int len=strlen(ss);        int lalal=0;        int now=0;        while (ss[now]>='0'&&ss[now]<='9') {lalal=lalal*10+ss[now]-'0';now++;}        int cnt=0;//有多少个         for (int i=now;i<len;i++)//直接扫过去         {            if (ss[i]>='0'&&ss[i]<='9')            {                cnt++;                while (ss[i]>='0'&&ss[i]<='9') i++;            }        }        int shen=(lalal^cnt);        if (u!=1)        {            if (shen==ans) printf("Disconnected\n");            else printf("Connected\n");        }        ans=shen;    }    int len=strlen(ss);    int lalal=0,now=0;    while (ss[now]>='0'&&ss[now]<='9') {lalal=lalal*10+ss[now]-'0';now++;}    memset(ok,true,sizeof(ok));    for (int i=now;i<len;i++)//直接扫过去     {        if (ss[i]>='0'&&ss[i]<='9')        {            int lalal=0;            while (ss[i]>='0'&&ss[i]<='9')             {                lalal=lalal*10+(ss[i]-'0');                i++;            }            ok[lalal^ans]=false;        }    }    for (int u=1;u<=n;u++) f[u]=u;    for (int u=1;u<=m;u++)    {        if (ok[u])        {            int x=find(X[u]),y=find(Y[u]);            f[x]=y;        }    }    bool tf=true;    int x=find(1);    for (int u=2;u<=n;u++)        if (x!=find(u))         {            tf=false;            break;        }    if (!tf) printf("Disconnected\n");    else printf("Connected\n");    return 0;}
原创粉丝点击