QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#422417#8055. BalanceEric_caiWA 4ms50528kbC++143.9kb2024-05-27 14:08:052024-05-27 14:08:05

Judging History

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

  • [2024-05-27 14:08:05]
  • 评测
  • 测评结果:WA
  • 用时:4ms
  • 内存:50528kb
  • [2024-05-27 14:08:05]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
vector<int> g[maxn],tr[maxn];
int n,m,num[maxn],sump[maxn],sums[maxn];
int dfn[maxn],low[maxn],times;
stack<int> st;
int dot,sz[maxn],id[maxn];
void tarjan(int now,int fa)
{
	st.push(now);
	dfn[now]=low[now]=++times;
	int fl=0,tp;
	for(int i=0;i<g[now].size();i++)
	{
		if(g[now][i]==fa && fl==0)
		{
			fl=1;
			continue;
		}
		if(dfn[g[now][i]]==0)
		{
			tarjan(g[now][i],now);
			low[now]=min(low[now],low[g[now][i]]);
		}
		else low[now]=min(low[now],dfn[g[now][i]]);
	}
	if(low[now]>dfn[fa])
	{
		dot++;
		while(!st.empty())
		{
			tp=st.top();
			st.pop();
			sz[dot]++,id[tp]=dot;
			if(tp==now) break;
		}
	}
}
int tpre[maxn],tsuf[maxn],cnt;
int f[maxn][2],fr[maxn][2],a[maxn],h[maxn][2],gr[maxn][2],ff[maxn];
void dfs(int now,int fa)
{
	ff[now]=fa;
	for(int i=0;i<tr[now].size();i++)
	{
		if(tr[now][i]==fa) continue;
		dfs(tr[now][i],now);
		sz[now]+=sz[tr[now][i]];
	}
	if(tpre[sz[now]]==1) f[now][0]=1;
	if(tsuf[sz[now]]==1) f[now][1]=1;
	for(int i=0;i<tr[now].size();i++)
	{
		if(tr[now][i]==fa) continue;
		if(h[now][0]<h[tr[now][i]][0])
			h[now][0]=h[tr[now][i]][0],gr[now][0]=gr[tr[now][i]][0];
		if(h[now][1]<h[tr[now][i]][1])
			h[now][1]=h[tr[now][i]][1],gr[now][1]=gr[tr[now][i]][1];
		if(tpre[sz[now]]==h[tr[now][i]][0]+1)
			f[now][0]=tpre[sz[now]],fr[now][0]=gr[tr[now][i]][0];
		if(tsuf[sz[now]]==h[tr[now][i]][1]+1)
			f[now][1]=tsuf[sz[now]],fr[now][1]=gr[tr[now][i]][1];
	}
	if(h[now][0]<f[now][0]) h[now][0]=f[now][0],gr[now][0]=now;
	if(h[now][1]<f[now][1]) h[now][1]=f[now][1],gr[now][1]=now;
}
int prt[maxn],val[maxn],w[maxn];
void get_w(int now,int fa)
{
	if(w[now]==0) w[now]=w[fa];
	for(int i=0;i<tr[now].size();i++)
		if(tr[now][i]!=fa) get_w(tr[now][i],now);
}
void init()
{
	while(!st.empty()) st.pop();
	cnt=dot=times=0;
	for(int i=1;i<=n;i++)
	{
		g[i].clear(),tr[i].clear();
		ff[i]=num[i]=sump[i]=sums[i]=0;
		dfn[i]=low[i]=sz[i]=id[i]=0;
		tpre[i]=tsuf[i]=f[i][0]=f[i][1]=fr[i][0]=fr[i][1]=0;
		a[i]=prt[i]=val[i]=w[i]=h[i][0]=h[i][1]=gr[i][0]=gr[i][1]=0;
	}
}
int main()
{
	int u,v,T,s0,s1,pos,d,rt;
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		for(int i=1;i<=m;i++)
		{
			cin>>u>>v;
			g[u].push_back(v);
			g[v].push_back(u);
		}
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			num[a[i]]++;
		}
		for(int i=1;i<=n;i++)
		{
			sump[i]=sump[i-1]+num[i];
			if(num[i]!=0)
			{
				tpre[sump[i]]=++cnt;
				val[cnt]=i;
			}
		}
		cnt=0;
		for(int i=n;i>=1;i--)
		{
			sums[i]=sums[i+1]+num[i];
			if(num[i]!=0) tsuf[sums[i]]=++cnt;
		}
		tarjan(1,0);
		for(int now=1;now<=n;now++)
			for(int i=0;i<g[now].size();i++)
				if(id[now]!=id[g[now][i]]) tr[id[now]].push_back(id[g[now][i]]);
		dfs(1,0);
		s0=s1=0;
		for(int i=1;i<=n;i++) f[i][1]=cnt-f[i][1]+1,h[i][1]=cnt-h[i][1]+1;
		for(int now=1;now<=dot;now++)
		{
			tpre[0]=tsuf[cnt+1]=-1;
			for(int i=0;i<tr[now].size();i++)
			{
				if(tr[now][i]==ff[now]) continue;
				u=tr[now][i];
				if(h[u][0]!=0 && tsuf[h[u][0]+2]!=0) s0=gr[u][0],s1=tsuf[h[u][0]+2],d=h[u][0]+1,rt=now;
				if(h[u][1]>=2 && tpre[h[u][1]-2]!=0) s0=tpre[h[u][1]-2],s1=gr[u][1],d=h[u][1]-1,rt=now;
				tpre[h[u][0]]=gr[u][0],tsuf[h[u][1]]=gr[u][1];
			}
			for(int i=0;i<tr[now].size();i++) tpre[h[tr[now][i]][0]]=tsuf[h[tr[now][i]][1]]=0;
		}
		if(s0==0 && s1==0 && cnt>1) cout<<"No\n";
		else
		{
			cout<<"Yes\n";
			if(cnt==1)
			{
				for(int i=1;i<=n;i++) cout<<val[1]<<' ';
				cout<<'\n';
				init();
				continue;
			}
			if(s0==-1) s0=0;
			if(s1==-1) s1=0;
			pos=d-1;
			while(s0!=0)
			{
				w[s0]=val[pos];
				s0=fr[s0][0],pos--;
			}
			pos=d+1;
			while(s1!=0)
			{
				w[s1]=val[pos];
				s1=fr[s1][1],pos++;
			}
			get_w(1,0);
			for(int i=1;i<=dot;i++) if(w[i]==0) w[i]=val[d];
			for(int i=1;i<=n;i++) cout<<w[id[i]]<<' ';
			cout<<'\n';
		}
		init();
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 4ms
memory: 50528kb

input:

5
5 4
1 2
2 3
3 4
4 5
1 2 3 4 5
5 4
1 2
1 3
1 4
1 5
1 2 3 4 5
5 4
1 2
1 3
1 4
1 5
1 2 2 2 3
5 6
1 2
1 2
2 3
3 4
4 5
3 5
1 2 1 2 1
2 2
1 2
1 2
1 2

output:

Yes
5 4 1 2 3 
Yes
4 4 4 3 5 
Yes
2 2 2 1 3 
Yes
2 2 1 1 1 
No

result:

wrong answer max - min = 4, but sum of difference = 6 (test case 1)