BZOJ3563 DZY Loves Chinese

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

题目链接:BZOJ3563

正解:并查集

解题报告:

  这道题真是有趣…

  直接通过读入的数的个数一路推出每次做完之后的$ans$,只需要暴力做最后一次,然后回答询问就可以了,并查集维护…

  $BZOJ$的字符串读入真是各种鬼畜,调了好久才没$RE$…

//It is made by ljh2000
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <complex>
#include <bitset>
using namespace std;
typedef long long LL;
typedef long double LB;
typedef complex<double> C;
const double pi = acos(-1);
const int MAXN = 300011;
const int MAXM = 1000011;
int n,m,q,a[MAXN],ans[MAXN],b[MAXN],stop[MAXN],father[MAXN];
char ch[MAXN];
struct edge{ int x,y; }e[MAXM];
inline int find(int x){ if(father[x]!=x) father[x]=find(father[x]); return father[x]; }
inline bool ok(char c){ if(c<=‘9‘ && c>=‘0‘) return true; return false; }
inline int getint(){
    int w=0,q=0; char c=getchar(); while((c<‘0‘||c>‘9‘) && c!=‘-‘) c=getchar();
    if(c==‘-‘) q=1,c=getchar(); while (c>=‘0‘&&c<=‘9‘) w=w*10+c-‘0‘,c=getchar(); return q?-w:w;
}

inline void work(){
	n=getint(); m=getint(); for(int i=1;i<=m;i++) { e[i].x=getint(); e[i].y=getint(); }
	q=getint(); int len,now,r1,r2;
	for(int i=1;i<=q;i++) {
		a[i]=getint(); gets(ch); len=strlen(ch); ch[len+1]=‘ ‘;
		for(int j=0;j<len;j++) if(ok(ch[j]) && !ok(ch[j+1])) b[i]++;
	}
	for(int i=q-1;i>=1;i--) ans[i]=b[i+1]^a[i+1];
	for(int i=1;i<q;i++) if(ans[i]==ans[i-1])/*!!!*/ puts("Disconnected"); else puts("Connected");

	now=0;
	for(int i=0;i<len;i++) {
		if(ok(ch[i])) now=now*10+ch[i]-‘0‘;
		else if(ok(ch[i-1])) stop[now^ans[q-1]]=1,now=0;
	}
	stop[now^ans[q-1]]=1;//!!!
	for(int i=1;i<=n;i++) father[i]=i;
	for(int i=1;i<=m;i++) {
		if(stop[i]) continue;
		r1=find(e[i].x); r2=find(e[i].y);
		if(r1==r2) continue;//!!!
		father[r1]=r2;
	}
	for(int i=2;i<=n;i++) if(find(1)!=find(i)) { puts("Disconnected"); return ; }
	puts("Connected");
}

int main()
{
    work();
    return 0;
}
//有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。

  

时间: 2024-11-16 21:40:23

BZOJ3563 DZY Loves Chinese的相关文章

【dfs】bzoj3563 DZY Loves Chinese

因为我们可以通过把某一行读到末尾来获取真正的K,所以把它和假K异或之后就是之前联通的次数(异或的逆运算为其本身).最后一次的暴力一下. #include<cstdio> #include<cstring> using namespace std; #define N 100001 #define M 500001 int n,m,K,q,ans; char s[1001]; bool del[M<<1]; int en,v[M<<1],first[N],ne

【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 第

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 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

[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 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\

[BZOJ3563&amp;3569]DZY Loves Chinese

bzoj 加强版 sol 其实前一题还有一种解法的,具体方法请见bzoj讨论版. 以下是正解(?) 建一棵生成树. 考虑什么时候图会不连通:当且仅当存在一条树边被删除,同时所有覆盖了他的非树边也被删除. 所以考虑给每条非树边随机一个权值,然后把每条树边的权值设为所以覆盖了这条边的非树边的边权异或和. 这样一来在要删除的边集中,若存在一个异或和为零的子集则说明图会不连通. 线性基维护一下.复杂度\(O(n+Qk*30)\) code 我WA了半天结果是随机种子出锅了... #include<cst

BZOJ3569: DZY Loves Chinese II

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

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

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