zoukankan      html  css  js  c++  java
  • bzoj3563: DZY Loves Chinese

    口口相传的搞笑题啊啊啊啊啊

    通过他的输入就可以得出第i个询问前联通的个数。。

    然后只需要求最后一个就行了。。。

    PS:肉老师告诉这题读入有毒。。自己看看吧

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    struct node
    {
        int x,y;
    }a[510000];
    int gt[510000];
    bool v[510000];
    int fa[510000];
    int findfa(int x)
    {
        if(fa[x]==x)return x;
        fa[x]=findfa(fa[x]);return fa[x];
    }
    char ss[21110000];
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)scanf("%d%d",&a[i].x,&a[i].y);
        
        int Q;
        scanf("%d
    ",&Q);
        for(int T=1;T<=Q;T++)
        {
            gets(ss+1);int len=strlen(ss+1);
            
            int sum=0;
            for(int i=1;i<=len;i++)
                if(ss[i]==' ')sum++;
                
            int k=0;
            for(int i=1;i<=len;i++)
            {
                if('0'<=ss[i]&&ss[i]<='9')k=k*10+ss[i]-'0';
                else break;
            }
            gt[T]=k^sum;
        }
        for(int T=2;T<=Q;T++)
        {
            if(gt[T]-gt[T-1]==1)printf("Connected
    ");
            else printf("Disconnected
    ");
        }
        
        int k=0,tp,len=strlen(ss+1);
        for(int i=1;i<=len;i++)
        {
            if('0'<=ss[i]&&ss[i]<='9')k=k*10+ss[i]-'0';
            else {k^=gt[Q];tp=i+1;break;}
        }
        memset(v,false,sizeof(v));
        for(int i=1;i<=k;i++)
        {
            int x=0,j=tp;
            while(ss[j]>='0'&&ss[j]<='9')x=x*10+ss[j]-'0',j++;
            tp=j+1;x^=gt[Q];
            v[x]=true;
        }
        int cnt=n;
        for(int i=1;i<=n;i++)fa[i]=i;
        for(int i=1;i<=m;i++)
            if(v[i]==false)
            {
                int fx=findfa(a[i].x),fy=findfa(a[i].y);
                if(fx!=fy)
                {
                    fa[fx]=fy;
                    cnt--;if(cnt==1)break;
                }
            }
        if(cnt==1)printf("Connected
    ");
        else printf("Disconnected
    ");
        return 0;
    }
  • 相关阅读:
    java中goto语句
    随机产生一个小写字母
    java移位操作符注意的问题
    +号操作符
    类名引用static变量好处
    自己做题的简单的算法
    read()方法读取的是一个字节,为什么返回是int,而不是byte
    一道判断题
    关于继承中静态代码块,构造代码块,构造函数执行顺序
    比较好的Redux和React-Redux学习资料
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/8921449.html
Copyright © 2011-2022 走看看