http://www.lydsy.com/JudgeOnline/problem.php?id=3569

题意:多次询问一个无向连通图当图中某k条边消失时这个图是否联通 强制在线


太神啦啦啦啦啦啦啦啦啦拉拉啦啦啦啦

求一棵生成树,给所有的非树边随机分配一个权值,树边的权值为所有覆盖它的非树边的权值的异或和

这样做之后,去掉k条边后原图不连通,当且仅当k条边的一个子集权值异或和为0

只有树边和覆盖它的非树边都消失了或者根本没有非树边才会造成非联通

因为权值是随机的,冲突的可能性很小....

求线性基就好了

如何计算树边的权值?

首先一个点异或上所有与他相连的非树边,然后一条树边u--->v的权值就是v子树点值异或和

注意:

1.分配非树边要记录$fa$因为有可能把与$fa$相连的边给分配了

2.我一直纠结于邻接表边从$1$开始编号然后正向边和反向边$>>1$结果不同,然后发现只要邻接表从$2$开始就好了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bitset>
using namespace std;
typedef long long ll;
const int N=1e5+,M=5e5+,INF=1e9;
inline int read(){
char c=getchar();int x=;
while(c<''||c>''){c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x;
}
int n,m,u,v,Q,cntans;
int a[],p,bin[];
void ini(){
for(int i=;i<=;i++) bin[i]=<<i;
}
struct edge{
int v,ne;
}e[M<<];
int h[N],cnt=;//magic
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
bool vis[N];
int w[M],d[N];
void dfs(int u,int fa){
vis[u]=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(v==fa) continue;
if(!vis[v]) dfs(v,u);
else if(!w[i>>]){
w[i>>]=rand();
d[u]^=w[i>>];
d[v]^=w[i>>];
}
}
}
void dfs2(int u){
vis[u]=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(vis[v]) continue;
dfs2(v);
d[u]^=d[v];
w[i>>]=d[v];
}
}
int now;
void Gauss(int n){
now=;
for(int i=;i>=;i--){
int j=now;
while(j<=n&&!(a[j]&bin[i])) j++;
if(j==n+) continue;
if(j!=now) swap(a[now],a[j]);
for(int k=;k<=n;k++)
if(k!=now&&(a[k]&bin[i])) a[k]^=a[now];
now++;
}
now--;
} int main(){
freopen("in","r",stdin);
srand();
ini();
n=read();m=read();
for(int i=;i<=m;i++) u=read(),v=read(),ins(u,v);
dfs(,);
//for(int i=1;i<=m;i++) printf("w %d %d\n",i,w[i]);
memset(vis,,sizeof(vis));
dfs2();
//for(int i=1;i<=m;i++) printf("w %d %d\n",i,w[i]);
Q=read();
while(Q--){
int k=read();p=;int x;
while(k--) x=read(),a[++p]=w[x^cntans];//,printf("x %d %d %d\n",x,cntans,x^cntans);
//for(int i=1;i<=p;i++) printf("a %d %d\n",i,a[i]);
Gauss(p);
//printf("now %d %d\n",now,p);
if(now<p) puts("Disconnected");
else cntans++,puts("Connected");
}
}

BZOJ 3569: DZY Loves Chinese II [高斯消元XOR 神题]的更多相关文章

  1. BZOJ 3569 DZY Loves Chinese II

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...

  2. BZOJ 3569 DZY Loves Chinese II 树上差分+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3569 Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅 ...

  3. BZOJ 3569 DZY Loves Chinese II ——线性基

    [题目分析] 腊鸡题目卡题面. 大概的意思就是给一张无向图,每次删掉其中一些边,问是否联通. 首先想到的是Bitset,可以做到n^2/64.显然过不了. 然而这是lyd在给我们讲线性基的时候的一道题 ...

  4. bzoj 3569 DZY Loves Chinese II 随机算法 树上倍增

    题意:给你一个n个点m条边的图,有若干组询问,每次询问会选择图中的一些边删除,删除之后问此图是否联通?询问之间相互独立.此题强制在线. 思路:首先对于这张图随便求一颗生成树,对于每一条非树边,随机一个 ...

  5. BZOJ 3569: DZY Loves Chinese II(线性基)

    传送门 解题思路 首先构造出一个生成树,考虑不连接的情况.假设连通两点的非树边和树边都断掉后不连通,那么可以给所有的非树边随机一个互不相同的值,然后树边的权值为过他两端点的非树边权值的异或和,这个可以 ...

  6. Codeforces 446D - DZY Loves Games(高斯消元+期望 DP+矩阵快速幂)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...

  7. BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

    以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...

  8. BZOJ 1923: [Sdoi2010]外星千足虫 [高斯消元XOR]

    1923: [Sdoi2010]外星千足虫 对于 100%的数据,满足 N≤1,000,M≤2,000. 裸高斯消元解异或方程组 给定方程顺序要求用从上到下最少的方程,那么找主元时记录一下最远找到哪个 ...

  9. BZOJ 1770: [Usaco2009 Nov]lights 燈 [高斯消元XOR 搜索]

    题意: 经典灯问题,求最少次数 本题数据不水,必须要暴搜自由元的取值啦 想了好久 然而我看到网上的程序都没有用记录now的做法,那样做遇到自由元应该可能会丢解吧...? 我的做法是把自由元保存下来,枚 ...

随机推荐

  1. cin与cout详解

    输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。C++的输出和输入是用" ...

  2. malloc函数用法

    malloc函数用法 函数声明(函数原型): void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间.返回类型是 void* 类型.void* ...

  3. 解决Perhaps you are running on a JRE rather than a JDK?问题

    Maven-No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JD ...

  4. Linux下安装PostgreSQL 转载linux社区

    Linux下安装PostgreSQL [日期:2016-12-25] 来源:Linux社区  作者:xiaojian [字体:大 中 小]   在Linux下安装PostgreSQL有二进制格式安装和 ...

  5. Linux下C++/C的编译调试

    这几天因为任务的原因我需要在ubuntu下编写程序.因此恶补了许多linux程序编写的知识.我分以下几个方面总结我所学的知识. gcc,g++,make命令的使用 gdb 调试 VScode的使用 c ...

  6. oracle游标的使用

    --游标的使用 步骤1.声明游标 .打开游标 .获取数据 .关闭游标 declare cursor cur is select * from emp; t_sal cur%rowtype; begin ...

  7. 番外篇--Moddule Zero多租户管理

    番外篇--Moddule Zero多租户管理 2.1.1 关于多租户 强烈建议阅读这个文件前阅读多租户文档. 2.1.2 启用多租户 ASP.NET Boilerplate和module-zero可以 ...

  8. 云主机与vps虚拟主机的区别

    云计算时代,云主机其可扩展性.价格便宜.安全可靠的特性深受企业和开发者欢迎,但目前有些IDC企业,新瓶装旧酒,将虚拟主机.VPS进行包装推出所谓的云主机服务,为了帮助用户更好的辨别和挑选云主机,下文详 ...

  9. dede 你所上传的软件类型不在许可列表,请更改系统对扩展名限定的配置

    后台,系统,系统基本参数,附件设置格式

  10. css3图片动画旋转

    body{ background-color:#021E36; text-align: center; } .container{margin:500px auto;} .round{position ...