BZOJ 3569: DZY Loves Chinese II [高斯消元XOR 神题]
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 神题]的更多相关文章
- BZOJ 3569 DZY Loves Chinese II
		
Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...
 - BZOJ 3569 DZY Loves Chinese II 树上差分+线性基
		
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3569 Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅 ...
 - BZOJ 3569 DZY Loves Chinese II ——线性基
		
[题目分析] 腊鸡题目卡题面. 大概的意思就是给一张无向图,每次删掉其中一些边,问是否联通. 首先想到的是Bitset,可以做到n^2/64.显然过不了. 然而这是lyd在给我们讲线性基的时候的一道题 ...
 - bzoj 3569 DZY Loves Chinese II 随机算法 树上倍增
		
题意:给你一个n个点m条边的图,有若干组询问,每次询问会选择图中的一些边删除,删除之后问此图是否联通?询问之间相互独立.此题强制在线. 思路:首先对于这张图随便求一颗生成树,对于每一条非树边,随机一个 ...
 - BZOJ 3569: DZY Loves Chinese II(线性基)
		
传送门 解题思路 首先构造出一个生成树,考虑不连接的情况.假设连通两点的非树边和树边都断掉后不连通,那么可以给所有的非树边随机一个互不相同的值,然后树边的权值为过他两端点的非树边权值的异或和,这个可以 ...
 - Codeforces 446D - DZY Loves Games(高斯消元+期望 DP+矩阵快速幂)
		
Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...
 - BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]
		
以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高 ...
 - BZOJ 1923: [Sdoi2010]外星千足虫 [高斯消元XOR]
		
1923: [Sdoi2010]外星千足虫 对于 100%的数据,满足 N≤1,000,M≤2,000. 裸高斯消元解异或方程组 给定方程顺序要求用从上到下最少的方程,那么找主元时记录一下最远找到哪个 ...
 - BZOJ 1770: [Usaco2009 Nov]lights 燈 [高斯消元XOR 搜索]
		
题意: 经典灯问题,求最少次数 本题数据不水,必须要暴搜自由元的取值啦 想了好久 然而我看到网上的程序都没有用记录now的做法,那样做遇到自由元应该可能会丢解吧...? 我的做法是把自由元保存下来,枚 ...
 
随机推荐
- 布隆(Bloom)过滤器 JAVA实现
			
前言 Bloom过滤器,通过将字符串映射为信息指纹从而节省了空间.Bloom过滤器的原理为,将一个字符串通过一定算法映射为八个Hash值,将八个Hash值对应位置的Bitset位进行填充.在进行校验的 ...
 - 为什么ios手机安装好fiddler证书/charles证书还是抓不到https请求?
			
为什么ios手机安装好fiddler证书/charles证书还是抓不到https请求? 最近有不少人有此困惑, 因为你的ios系统应该是10.0以上的系统, 在手机系统设置---关于手机----证书信 ...
 - [国嵌攻略][070-095][Linux编程函数手册]
			
第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 ...
 - Core Animation 文档翻译(第三篇)
			
Core Animation 文档翻译(第三篇) 设置Layer对象 当我们使用核心动画时,Layer对象是一切的核心.Layers 管理我们APP的可视化content,Layer也提供了conte ...
 - APP测试时常用adb命令
			
ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备(手机),故在其实工作可以给我们 ...
 - 平安E行销扫脸打卡/人寿国寿e店云参会钉钉考勤,原来这么轻易被破解!
			
由于近几年人们的保险意识越来越强,身边有很多朋友都在中国人寿,中国平安等保险公司上班薪水高,工作自由,又可以学习很多保险理财的知识,每天早会个2~3个小时,剩下的基本都是自己的时间,(vx:99508 ...
 - sizeof(extern类型数组)
			
error: #70: incomplete type is not allowed 用sizeof计算数组大小,编译器提示不允许使用不完整的类型.在keil上编译直接报错,拿到vs2010上编译可 ...
 - Html Mailto标签详细使用方法
			
http://www.360doc.com/content/09/0805/14/16915_4684377.shtml Html Mailto标签详细使用方法 Html中mailto标签是一个非常实 ...
 - Aliase_小白学Python_Day0_前言
			
听到有老师介绍,说你为什么不把你的学习过程保存下来,一是当做总结,二是作为分享.我想,也对.这算是我的第一个博客,本次想写写我为什么选择学习Python. 很多人都问过我一个问题,行业那么多,你为什么 ...
 - Unix/Linux命令:SED
			
在Unix/Linux系统中,sed命令采用逐行处理的方式对文件进行查找.删除.替换.添加.插入等操作. 语法:sed [OPTION]... {script-only-if-no-other-scr ...