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的做法,那样做遇到自由元应该可能会丢解吧...? 我的做法是把自由元保存下来,枚 ...
随机推荐
- Android studio启动后卡在refreshing gradle project(包解决)
这个问题几乎每个刚使用Android studio的同学都会碰到过,网上有各式各样的方法,有的说使用本地gradle,我试过多次,每次启动android studio时还是会检查更新,所以根本上解决的 ...
- SSH中后台传到前台一个信息集合,tr td中怎么进行排列,类似在一个div里排列书籍
总觉得描述问题不对,这里详细说一下,就是把下面图片变成排列整齐,一行四个,多出来的两个排到下一行. 我问过群里的,给的答案都有些简介:1:后台排好了,前台循环出来: 2:前台直接循环,多出来的加< ...
- [国嵌攻略][090][linux网络编程模型]
编程模型 Socket的实质就是一个接口,利用该接口,用户在使用不同的网络协议时,操作函数得以统一.而针对不同协议的差异性操作,则交给了Socket去自行解决. TCP编程模型 UDP编程模型
- kafka producer生产数据到kafka异常:Got error produce response with correlation id 16 on topic-partition...Error: NETWORK_EXCEPTION
kafka producer生产数据到kafka异常:Got error produce response with correlation id 16 on topic-partition... ...
- Spring学习之路二——概念上理解Spring
一.概念. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Develop ...
- linux_磁盘分区
分区并没有数据内容只是改变分区表,保存在0磁头,0磁道1扇区除MBR引导后64bytes中,只能有4个组分区,4个以上要一个扩展分区 引导MBR,保存在446字节中 磁盘想要存放数据,首先要分区,可以 ...
- python_开发规范
对于python有哪些开发规范? 1. 每行代码不超过80字符 2. 不要在逗号, 分号, 冒号前加空格, 应该之后加空格 3. 列表, 索引,切片的左括号前不加空格 4. 比较运算前后 加一个空格 ...
- 更改Patrol Agent的密码
大家可以使用P3console去做,具体方法请见:http://wenku.baidu.com/link?url=HbSzxNV2SPrlpk_Bfmcg0CNZuAlyX4jgdp4vbrxmynv ...
- android studio获取sha1签名
转载 :http://blog.csdn.net/kezhongke/article/details/42678077
- IO (四)
1 深度遍历文件夹 示例: package java20; import java.io.File; import java.io.FilenameFilter; import java.text.S ...