40 pts wa 求调
查看原帖
40 pts wa 求调
779369
lijianqiao楼主2024/6/9 16:56

比较智障,将()或)(设为白边,((设为红边,))设为蓝边 判断成立的条件是全走白边,或先走奇数条红边再走奇数条黄边,或先走偶数条红边再走偶数条黄边 于是用分层图+并查集 code

#include<bits/stdc++.h>
using namespace std;
#define int long long

int fa[4000005],fa2[4000005],fa3[4000005],n,m,q;
char kh[4000005],ans[4000005];

int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}

void merge(int x,int y){
	x=find(x),y=find(y);
	if(x!=y)fa[x]=y;
}

int find2(int x){
	return fa2[x]==x?x:fa2[x]=find2(fa2[x]);
}

void merge2(int x,int y){
	x=find2(x),y=find2(y);
	if(x!=y)fa2[x]=y;
}

int find3(int x){
	return fa3[x]==x?x:fa3[x]=find3(fa3[x]);
}

void merge3(int x,int y){
	x=find3(x),y=find3(y);
	if(x!=y)fa3[x]=y;
}

signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)cin>>kh[i];
	for(int i=1;i<=5*n+2;i++)fa[i]=fa2[i]=fa3[i]=i;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		if(kh[u]!=kh[v]){
			merge(u,v);
			merge2(u,v);
			merge2(u+n,v+n),merge2(u+2*n,v+2*n);
			merge3(u,v);
			merge3(u+n,v+n),merge3(u+2*n,v+2*n);
			merge3(u+3*n,v+3*n),merge3(u+4*n,v+4*n);
		}
		if(kh[u]=='('&&kh[v]=='('){
			merge2(u,v+n);
			merge2(u+n,v);
			merge3(u,v+n);merge3(u+n,v);
			merge3(u+n,v+2*n);merge3(u+2*n,v+n);
		}
		if(kh[u]==')'&&kh[v]==')'){
			merge2(u+2*n,v+n);
			merge2(u+n,v+2*n);
			merge3(u+2*n,v+3*n);merge3(u+3*n,v+2*n);
			merge3(u+4*n,v+3*n);merge3(u+3*n,v+4*n);
		}
//		add(u,v);
	}
//	cout<<find3(1)<<" "<<find3(3+n)<<" "<<find3(2+2*n)<<" "<<find3(4+2*n)<<" "<<find3(5+3*n)<<" "<<find3(4+4*n);
	for(int i=1;i<=q;i++){
		int u,v;
		cin>>u>>v;
		ans[i]='0';
		if(kh[u]=='('&&kh[v]==')'){
			if(find(u)==find(v)||find2(u)==find2(v+2*n)||find3(u)==find3(v+4*n)){
				ans[i]='1';
			}
		}
//		cout<<ans[i]<<endl;
	}
	for(int i=1;i<=q;i++){
		cout<<ans[i];
	} 
}

比较丑陋,将就读一下,谢谢

2024/6/9 16:56
加载中...