zoukankan      html  css  js  c++  java
  • DZY Loves Chinese / DZY Loves Chinese II

    题面在这里!

        这两个其实是一个题啦。。双倍经验加成23333

        可以很简单的发现如果把一条树边和所有覆盖它的非树边都删去的话,那么图会不连通;

        如果再手玩一下可以发现,如果把两个被非树边覆盖的集合相同的树边删去,图也是会不连通的。

        于是大胆猜想一波,我们给每条边附上一个非树边集合,里面的边就是它被哪些非树边覆盖,特殊的如果这条边本来就是非树边那么这个集合里只有它一个。。。

        只有询问中删去的边的集合存在至少一个子集,满足里面所有边的非树边集合的异或为空(应该说对称差?),那么图不连通。

        显然bitset可以保证正确性,但是太慢了会GG掉。。。

        于是我们可以延用某oj某月的月赛的一道叫对称数的题的套路,给每条非树边随机一个 < 2^64 的边权,然后集合的权值可以表示成集合内所有非树边边权的异或,于是集合异或为空就相当于要所有集合的权值的异或和为0,线性基判一判就好啦。

       

        如果想让这个算法出现偏差,那么当且仅当 存在一个非树边的集合 使得集合的权值为0。

        也就是二进制每一位都是0,那么这个概率显然是 1/2^64  (注意这个集合大小无关,因为杨辉三角同一行的奇数列的和永远是总和的1/2 (第0行除外))。

        并且就算存在了,询问也不一定询问的到啊QWQ,所以就当成几乎不会错啦。

    #include<bits/stdc++.h>
    #define ll unsigned long long
    using namespace std;
    const int N=100005;
    
    inline int read(){
    	int x=0; char ch=getchar();
    	for(;!isdigit(ch);ch=getchar());
    	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    	return x;
    }
    
    int hd[N],to[N*10],ne[N*10],dc;
    int num=1,n,m,Q,cnt,K,L,dfn[N];
    ll val[N*10],a[66],Xor[N],c[66];
    bool flag;
    
    inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;}
    
    inline ll getrand(){ return (ll)floor(rand()/(double)RAND_MAX*(double)1e19);}
    
    void dfs(int x,int fa){
    	dfn[x]=++dc;
    	for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa)
    	    if(!dfn[to[i]]){
    	    	dfs(to[i],x),Xor[x]^=Xor[to[i]];
    	    	val[i]=val[i^1]=Xor[to[i]];
    		}
    		else if(dfn[to[i]]<dfn[x]){
    			val[i]=val[i^1]=getrand();
    			Xor[x]^=val[i],Xor[to[i]]^=val[i];
    		}
    }
    
    inline bool ins(ll x){
    	for(int i=63;i>=0;i--) if(c[i]&x){
    		if(!a[i]){ a[i]=x; return 1;}
    		x^=a[i];
    	}
    	return 0;
    }
    
    int main(){
    	srand(20010207);
    	c[0]=1; for(int i=1;i<64;i++) c[i]=c[i-1]+c[i-1];
    	
    	n=read(),m=read();
    	for(int i=1,uu,vv;i<=m;i++){
    		uu=read(),vv=read();
    		add(uu,vv),add(vv,uu);
    	}
    	
    	dfs(1,0);
    	
    	for(Q=read();Q;memset(a,0,sizeof(a)),Q--){
    		K=read();
    		for(flag=1;K;K--){
    			L=read()^cnt;
    			if(!ins(val[L<<1])) flag=0;
    		}
    		cnt+=flag,puts(flag?"Connected":"Disconnected");
    	}
    	
    	return 0;
    }
    

      

    #include<bits/stdc++.h>
    #define ll unsigned long long
    using namespace std;
    const int N=100005;
    
    inline int read(){
    	int x=0; char ch=getchar();
    	for(;!isdigit(ch);ch=getchar());
    	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    	return x;
    }
    
    int hd[N],to[N*10],ne[N*10],dc;
    int num=1,n,m,Q,cnt,K,L,dfn[N];
    ll val[N*10],a[66],Xor[N],c[66];
    bool flag;
    
    inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;}
    
    inline ll getrand(){ return (ll)floor(rand()/(double)RAND_MAX*(double)1e19);}
    
    void dfs(int x,int fa){
    	dfn[x]=++dc;
    	for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa)
    	    if(!dfn[to[i]]){
    	    	dfs(to[i],x),Xor[x]^=Xor[to[i]];
    	    	val[i]=val[i^1]=Xor[to[i]];
    		}
    		else if(dfn[to[i]]<dfn[x]){
    			val[i]=val[i^1]=getrand();
    			Xor[x]^=val[i],Xor[to[i]]^=val[i];
    		}
    }
    
    inline bool ins(ll x){
    	for(int i=63;i>=0;i--) if(c[i]&x){
    		if(!a[i]){ a[i]=x; return 1;}
    		x^=a[i];
    	}
    	return 0;
    }
    
    int main(){
    	srand(20010207);
    	c[0]=1; for(int i=1;i<64;i++) c[i]=c[i-1]+c[i-1];
    	
    	n=read(),m=read();
    	for(int i=1,uu,vv;i<=m;i++){
    		uu=read(),vv=read();
    		add(uu,vv),add(vv,uu);
    	}
    	
    	dfs(1,0);
    	
    	for(Q=read();Q;memset(a,0,sizeof(a)),Q--){
    		K=read()^cnt;
    		for(flag=1;K;K--){
    			L=read()^cnt;
    			if(!ins(val[L<<1])) flag=0;
    		}
    		cnt+=flag,puts(flag?"Connected":"Disconnected");
    	}
    	
    	return 0;
    }
    

      

     

  • 相关阅读:
    js中拼接字符串
    js中的fliter(),map(),forEach()方法
    美化下拉框select箭头部分(不彻底)
    offsetWidth、clientWidth、scrollWidth、scrollTop、scrollLeft等属性图示
    js事件代理(事件委托)最简单的理解
    ubuntu14.04 caffe+cuda-7.0配置
    ubuntu 中安装和删除软件总结
    C++中的容器可以同时保存各种数据类型
    string的用法
    linux查看GPU的配置和使用信息
  • 原文地址:https://www.cnblogs.com/JYYHH/p/9287807.html
Copyright © 2011-2022 走看看