ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BZOJ3569 DZY Loves Chinese II

2019-08-14 22:00:10  阅读:258  来源: 互联网

标签:return bas int dif II read valid DZY BZOJ3569


DZY Loves Chinese II

给一张无向图,每次删掉一些边(非永久操作),问图是否连通。

N≤100000 M≤500000 Q≤50000 1≤K≤15

数据保证没有重边与自环

题解

取一个生成树,对每条非树边取一个随机权值,对每条树边设为“覆盖它的所有非树边”的权值的xor,这个可以用类似树上差分的方式实现。

对于每次询问,只要某个子集的所有边xor值是0,那么就不连通,否则连通。

判断用线性基就好了。时间复杂度\(O(n+\Sigma k \times 64)\)。

#include<bits/stdc++.h>
#define co const
#define il inline
template<class T> T read(){
    T x=0,w=1;char c=getchar();
    for(;!isdigit(c);c=getchar())if(c=='-') w=-w;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*w;
}
template<class T> T read(T&x){
    return x=read<T>();
}
using namespace std;
typedef long long LL;

il LL van(){
    return rand()|rand()<<15|(LL)rand()<<30|(LL)rand()<<45|(LL)rand()<<60;
}

co int N=100000+10;
int n,m;
struct edge{int y,next;}pool[10*N];
int head[N],tot;

il void add_edge(int x,int y){
    pool[++tot]=(edge){y,head[x]},head[x]=tot;
}
int dep[N],adj[N];
LL dif[N],val[5*N];
void dfs(int x,int fa){
    for(int i=head[x];i;i=pool[i].next){
        int y=pool[i].y;
        if(y==fa) continue;
        if(!dep[y]){
            dep[y]=dep[x]+1,adj[y]=(i+1)>>1;
            dfs(y,x),
            dif[x]^=dif[y];
        }
        else if(dep[y]<dep[x]){
            int id=(i+1)>>1;
            val[id]=van();
            dif[x]^=val[id],dif[y]^=val[id];
        }
    }
    val[adj[x]]=dif[x];
}

LL bas[64];
bool insert(LL v){
    for(int i=63;v&&i>=0;--i)if(v>>i&1){
        if(!bas[i]) return bas[i]=v,1;
        else v^=bas[i];
    }
    return 0;
}
int main(){
    srand(20030506);
    read(n),read(m);
    for(int i=1;i<=m;++i){
        int x=read<int>(),y=read<int>();
        add_edge(x,y),add_edge(y,x);
    }
    dfs(1,0);
    int ans=0;
    for(int q=read<int>();q--;){
        int k=read<int>();
        bool valid=1;
        memset(bas,0,sizeof bas);
        for(int i=1;i<=k;++i)
            if(!insert(val[read<int>()^ans])) valid=0;
        ans+=valid,puts(valid?"Connected":"Disconnected");
    }
    return 0;
}

标签:return,bas,int,dif,II,read,valid,DZY,BZOJ3569
来源: https://www.cnblogs.com/autoint/p/11354980.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有