比较智障,将()或)(设为白边,((设为红边,))设为蓝边 判断成立的条件是全走白边,或先走奇数条红边再走奇数条黄边,或先走偶数条红边再走偶数条黄边 于是用分层图+并查集 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];
}
}
比较丑陋,将就读一下,谢谢