BZOJ 3563 DZY Loves Chinese

题解:为每条非树边赋一个权值

每条树边的权值为覆盖他的非树边权值异或和

如果边集的子集线性相关,相当于把树边和非树边拦腰砍断,则不连通

用线性基判断线性相关

问题:为什么srand(time(0))会RE?

#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
using namespace std;
const int maxn=1000009;

int n,m,T;

int rx[maxn],ry[maxn],vis[maxn],rd[maxn];

int ufsfa[maxn];
int Getf(int x){
	if(ufsfa[x]==x)return x;
	return ufsfa[x]=Getf(ufsfa[x]);
}
void Unionn(int x,int y){
	int fx=Getf(x);
	int fy=Getf(y);
	if(fx!=fy)ufsfa[fx]=fy;
}

int cntedge;
int head[maxn];
int to[maxn],nex[maxn],num[maxn];
void Addedge(int x,int y,int ide){
	nex[++cntedge]=head[x];
	to[cntedge]=y;
	num[cntedge]=ide;
	head[x]=cntedge;
}

int father[maxn];
int dep[maxn];
int fatheredge[maxn];
int Dfs(int now,int fa){
	father[now]=fa;
	dep[now]=dep[fa]+1;
	for(int i=head[now];i;i=nex[i]){
		if(to[i]==fa)continue;
		fatheredge[to[i]]=num[i];
		Dfs(to[i],now);
	}
}

int mar[maxn];
void Dp(int x,int fa){
	for(int i=head[x];i;i=nex[i]){
		if(to[i]==fa)continue;
		Dp(to[i],x);
		mar[x]^=mar[to[i]];
	}
}

int lastans;
int a[maxn];

int c[100];
int isOK(int n){
	memset(c,0,sizeof(c));
	for(int i=1;i<=n;++i){
		int x=rd[a[i]];
		for(int j=30;j>=1;--j){
			if(x&(1<<(j-1))){
				if(c[j]==0){
					c[j]=x;
					break;
				}else{
					x^=c[j];
				}
			}
		}
		if(x==0)return 0;
	}
//	for(int i=30;i>=1;--i)printf("%d ",c[i]);
//	cout<<endl;
	return 1;
}

void Minit(){
	lastans=0;
	memset(mar,0,sizeof(mar));
	dep[0]=0;
	memset(head,0,sizeof(head));
	memset(vis,0,sizeof(vis));
	cntedge=0;
}

int main(){
//	int fuck=time(0);
	srand(19260917);
	scanf("%d%d",&n,&m);
	Minit();

	for(int i=1;i<=n;++i)ufsfa[i]=i;
	for(int i=1;i<=m;++i){
		scanf("%d%d",&rx[i],&ry[i]);
		if(Getf(rx[i])!=Getf(ry[i])){
			Unionn(rx[i],ry[i]);
			vis[i]=1;
			Addedge(rx[i],ry[i],i);
			Addedge(ry[i],rx[i],i);
		}
	}
	Dfs(1,0);
	for(int i=1;i<=m;++i){
		if(vis[i])continue;
		if(dep[rx[i]]>dep[ry[i]])swap(rx[i],ry[i]);
		int dist=(int)(1LL*rand()*rand()%1000000000+1);
//		cout<<dist<<endl;
		rd[i]=dist;
		mar[ry[i]]^=dist;
		mar[rx[i]]^=dist;
	}
	Dp(1,0);
	for(int i=2;i<=n;++i){
		rd[fatheredge[i]]=mar[i];
	}
//	for(int i=1;i<=m;++i)printf("%d ",rd[i]);
//	cout<<endl;
	scanf("%d",&T);
	while(T--){
		int k;
		scanf("%d",&k);k^=lastans;
		for(int i=1;i<=k;++i)scanf("%d",&a[i]);
		for(int i=1;i<=k;++i)a[i]^=lastans;

		if(isOK(k))++lastans,printf("Connected\n");
		else printf("Disconnected\n");
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/zzyer/p/8454421.html

时间: 2024-11-08 21:51:05

BZOJ 3563 DZY Loves Chinese的相关文章

BZOJ 3563 DZY Loves Chinese 并查集

题目大意:给定一个无向联通图,q次询问当图中某k条边消失时图是否联通 强制在线 逗比题233 不明白什么意思的去看DZY Loves Chinese II的红字就明白这题为何逗比了0.0 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 100100 using namespace std; struct edges{ int x,y

BZOJ 3563 DZY Loves Chinese / BZOJ 3569 DZY Loves Chinese II 随机化+高斯消元解异或方程组

题目大意:给出一个无向图,问删掉k条边的时候,图是否联通. 思路:虽然我把这两个题放在了一起,但是其实这两个题可以用完全不同的两个解法来解决. 第一个题其实是DZY出错了...把每次的边数也异或了,那就直接用这个性质一个一个往后推就行了..最后一个暴力求一下.. 第二个题才是本意啊. 听到做法的时候我惊呆了.. 首先是将整个图中拆出一个树,那么所有边就分为树边和非树边.将所有非树边都加一个随机权值.树边的权值是所有能够覆盖它的非树边的权值的异或和. 把整个图拆开的充要条件是拆掉一条树边,同时将所

3563: DZY Loves Chinese - BZOJ

Description神校XJ之学霸兮,Dzy皇考曰JC.摄提贞于孟陬兮,惟庚寅Dzy以降.纷Dzy既有此内美兮,又重之以修能.遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上有N座祭坛,又有M条膴蠁边.时而Dzy狂WA而怒发冲冠,神力外溢,遂有K条膴蠁边灰飞烟灭.而后俟其日A50题则又令其复原.(可视为立即复原)然若有祭坛无法相互到达,Dzy之神力便会大减,于是欲知其是否连通.Input第一行N,M接下来M行x,y:表示M条膴蠁边,依次编号接下来一行Q接下来Q行:每行第一个数K

bzoj 3569: DZY Loves Chinese II

链接 3569: DZY Loves Chinese II 题目大意:给出一张\(n\)个点\(m\)条边的无向图,进行\(q\)次询问,问删掉某\(k\)条边后图是否联通,强制在线. \(N≤100000 \ M≤500000\ Q≤50000\ 1≤K≤15\) 先考虑一下离线怎么做: \(cdq\)分治. 首先把所有没有影响的边都建出来 分治过程: 1.把左边没有右边有的边建出来 2.分治左边 3.把并查集恢复至初始的样子 4.把右边没有左边有的边建出来 5.分治右边 虽然每次\(cdq\

BZOJ 3569 DZY Loves Chinese II 高斯消元

题目大意:给定一个[魞歄连通图],多次询问当图中某k条边消失时这个图是否联通 强制在线 我们找到这个图的任意一棵生成树 然后对于每条非树边将其的权值赋为一个随机数 对于每条树边 我们将这条树边的权值设为所有覆盖这条树边的边权的异或和 那么图不连通当且仅当删除一条树边和覆盖这条树边的所有边集 而由于刚才的处理一条树边和覆盖这条边的所有边集的异或和为零 于是问题转化成了对于给定的k条边是否存在一个边权的异或和为零的子集 果断高斯消元 由于使用了随机化所以碰撞率极低 好方法学习了...构思真是巧妙 记

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

题意:给你一个n个点m条边的图,有若干组询问,每次询问会选择图中的一些边删除,删除之后问此图是否联通?询问之间相互独立.此题强制在线. 思路:首先对于这张图随便求一颗生成树,对于每一条非树边,随机一个权值.树边的权值为所有覆盖这条树边的非树边的权值异或和.覆盖是指这条边是个返祖边,并且一端在父节点方向,一端在子节点方向.这样,我们选出若干条边,看一下他们异或起来是不是0,如果是0,那么相当于把一条树边和它的所有子节点方向的返祖边全部断开,那么图就不连通了. 代码: #include <bits/

【BZOJ3563/3569】DZY Loves Chinese II 线性基神题

[BZOJ3563/3569]DZY Loves Chinese II Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上有N座祭坛,又有M条膴蠁边. 时而Dzy狂WA而怒发冲冠,神力外溢,遂有K条膴蠁边灰飞烟灭. 而后俟其日A50题则又令其复原.(可视为立即复原) 然若有祭坛无法相互到达,Dzy之神力便会大减,于是欲知其是否连通. Input 第

[BZOJ3569]DZY Loves Chinese II(随机化+线性基)

3569: DZY Loves Chinese II Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1515  Solved: 569[Submit][Status][Discuss] Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上有N座祭坛,又有M条膴蠁边. 时而Dzy狂WA而怒发冲冠,神力外溢,

bzoj 3309 DZY Loves Math

LINK:DZY Loves Math 一道比较有意思的数论题 原谅我的智障多调了40min. 可以简单的推式子推出 答案为\(\sum{w=1}^n\frac{n}{w}\frac{m}{w}\sum{x|w}\mu(x)f(\frac{w}{x})\) f函数定义和题目中一致. 考虑后面前缀和怎么求 发现光求f(x)复杂度都比较高.如果我们把f(x)求出再调和级数预处理 那得GG 1e7过不了log+根号 考虑考虑一下\(\mu\)和f的这种形式肯定值有局限 设后面的东西为g(x) 不难发现