QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#508919#8029. Traveling MerchantFugiPigWA 0ms29904kbC++142.9kb2024-08-07 21:55:392024-08-07 21:55:39

Judging History

你现在查看的是最新测评结果

  • [2024-08-07 21:55:39]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:29904kb
  • [2024-08-07 21:55:39]
  • 提交

answer

#include<iostream>
#include<vector>
#define ls ch[x][0]
#define rs ch[x][1]
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(l);i>=(r);i--)
using namespace std;
const int maxn=2e5+5,inf=0x3f3f3f3f;
vector<int> G[maxn],G2[maxn],T[maxn<<1];
int mp[maxn],low[maxn],bel[maxn],st[maxn],dfn[maxn],jum[maxn<<1][25],dep[maxn<<1],tot,scc,top,in,im;
void tarjan(int cur,int fa)
{
	//if(!fa&&G2[cur].empty())cout<<"ls"<<endl;
	low[cur]=dfn[cur]=++tot;
	st[++top]=cur;
	int cnt=0;
	rep(v1,0,int(G2[cur].size())-1){
		int v=G2[cur][v1];
		if(!dfn[v]){
			tarjan(v,cur);
			low[cur]=min(low[cur],low[v]);
			if(low[v]>=dfn[cur]){
				cnt++;
				T[++scc].clear();
				if(fa||cnt>1){
					if(bel[cur]&&bel[cur]!=cur){
						T[cur].push_back(bel[cur]);
						T[bel[cur]].push_back(cur);
					} 
					bel[cur]=cur;
					T[cur].push_back(scc);
					T[scc].push_back(cur);
				}
				else bel[cur]=scc;
				for(int x=0;x!=v;top--){
					x=st[top];
					if(bel[x]==x){
						T[scc].push_back(x);
						T[x].push_back(scc);
					}
					bel[x]=scc;
				}
			}
		}
		else low[cur]=min(low[cur],dfn[v]);
	}
}
void dfs(int cur,int fa){
	dep[cur]=dep[fa]+1;
	jum[cur][0]=fa;
	rep(v1,1,20)jum[cur][v1]=jum[jum[cur][v1-1]][v1-1];
	for(int v1=0;v1<T[cur].size();v1++){
		int v=T[cur][v1];
		if(v!=fa)dfs(v,cur);
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	per(v1,20,0)if(dep[jum[x][v1]]>=dep[y])x=jum[x][v1];
	if(x==y)return x;
	per(v1,20,0)if(jum[x][v1]!=jum[y][v1]){
		x=jum[x][v1];
		y=jum[y][v1];
	} 
	return jum[x][0];
}
int main()
{
	//freopen("travel.in","r",stdin);
	//freopen("travel.out","w",stdout);
	int it,cnt=0;
	cin>>it;
	while(it--)
	{
		cnt++;
		scanf("%d %d",&in,&im);
		rep(v1,1,in){
			G[v1].clear();
			G2[v1].clear();
			T[v1].clear();
			dfn[v1]=low[v1]=bel[v1]=0;
		}
		tot=top=0;
		scc=in;
		char c=getchar();
		while(c<'A'||c>'Z')c=getchar();
		rep(v1,1,in){
			mp[v1]=(c=='H');
			c=getchar();
		}
		rep(v1,1,im){
			int ix,iy;
			scanf("%d %d",&ix,&iy);
			if(mp[ix]==mp[iy]){
				G[ix].push_back(iy);
				G[iy].push_back(ix);
			}
			else{
				G2[ix].push_back(iy);
				G2[iy].push_back(ix); 
			}
		}
		//cout<<"zs"<<endl;
		tarjan(1,0);
		dfs(bel[1],0);
		//cout<<"zs"<<endl;
		bool flag=false;
		rep(v1,1,in){
			if(!dfn[v1])continue;
			for(int v2=0;v2<G[v1].size();v2++){
				int to=G[v1][v2];
				if(!dfn[to])continue;
				int lc=lca(bel[v1],bel[to]);
//				if(cnt==23){
//					int t=bel[v1];
//					cout<<in<<'-'<<im<<' '<<v1<<' '<<to<<' '<<bel[v1]<<' '<<bel[to]<<endl; 
//					while(jum[t][0])cout<<(t=jum[t][0])<<' ';
//					cout<<endl;
//					t=bel[to];
//					while(jum[t][0])cout<<(t=jum[t][0])<<' ';
//					cout<<endl;
//				}
				if(lc==bel[to]||lc==bel[v1]){
					flag=true;
					break;
				}
			}
			if(flag)break;
		}
		if(flag)printf("yes\n");
		else printf("no\n");
		//if(cnt==23)break;
	}
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 29904kb

input:

2
4 4
LHLH
0 1
1 2
1 3
2 3
3 3
LHH
0 1
0 2
1 2

output:

yes
yes

result:

wrong answer 2nd lines differ - expected: 'no', found: 'yes'