求条
查看原帖
求条
753640
封禁用户楼主2024/7/11 20:29

本地跑能对,cf评测上是WA。

实现有点抽象,,,

#include<bits/stdc++.h>
// #define int long long
#define inf 0x3f3f3f3f
#define linf 1e18
#define db double
#define ldb long double
#define F(i,a,b) for(int i=(a);i<=(b);i++)
// #define f(i,a,b) for(int i=(a);i>=(b);i--)
#define me(x,y) memset(x,y,sizeof x)
#define MAX(x,y) (x>y?x:y)
#define MIN(x,y) (x<y?x:y)
#define pii sd pair<int,int>
#define X first
#define Y second
#define Fr(a) for(auto it:a)
#define kg putchar(' ')
#define dbg(a) sd cout<<#a<<":"<<a<<sd endl
#define il inline
#define sd std::
il int read(){int w=1,c=0;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) c=(c<<3)+(c<<1)+ch-48;return w*c;}
void printt(int x){if(x>9) printt(x/10);putchar(x%10+48);}
void print(int x){if(x<0) x=-x,putchar('-');printt(x);}
void printk(int x){print(x);kg;}
void put(int x){print(x);puts("");}
const int N=2e5+10;
struct dsu
{
	int fa[N];
	int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
	void merge(int x,int y){int u=find(x),v=find(y);if(u==v) return;fa[u]=v;return;}
}D;
int n,p,cnt;
sd vector<int> v[N],st[N];
sd deque<pii> q;
pii b[N];
struct node
{
	int nex;
	int to;
}a[N<<1];
int tot,head[N];
void add(int u,int v)
{
	a[++tot]={head[u],v};
	head[u]=tot;
}
int vis[N],pos[N];
void dfs(int u)//找环
{
	st[cnt].push_back(u);
	pos[u]=cnt;
	for(int i=head[u];i;i=a[i].nex)
	{
		int v=a[i].to;
		if(vis[v]) return;
		vis[v]=1;
		dfs(v);
	}
}
il void solve()
{
	n=read();
	tot=0;cnt=1;
	F(i,1,n) v[i].clear(),st[i].clear(),head[i]=vis[i]=0,D.fa[i]=i;
	F(i,1,n) v[read()].push_back(i);
	int flag=0;pii c={0,0};
	F(i,1,n)
	{
		if(v[i].size()&1)
		{
			if(flag) return puts("NO"),void();
			else
			{
				flag=1;p=0;
				Fr(v[i])
				{
					if(!c.Y) c={i,it};
					else p?q.push_back({i,it}):q.push_front({i,it});
					p=!p;
				}
			}
		}
		else
		{
			p=0;
			Fr(v[i])
			{
				p?q.push_back({i,it}):q.push_front({i,it});
				p=!p;
			}
		}
	}
	F(i,1,n)
	{
		if(!flag||(i!=n/2+1)) b[i]=q.front(),q.pop_front();
		else b[i]=c;
	}
	F(i,1,n) add(i,b[i].Y);
	F(i,1,n) if(!vis[i]) vis[i]=1,dfs(i),cnt++;
	cnt--;
	//1~cnt即为环
	for(int i=1;i<=n-i+1;i++)//优化1
	{
		if(D.find(pos[b[i].Y])!=D.find(pos[b[n-i+1].Y]))
		{
			sd swap(b[i].Y,b[n-i+1].Y);
			Fr(st[D.find(pos[b[i].Y])]) st[D.find(pos[b[n-i+1].Y])].push_back(it);
			st[D.find(pos[b[i].Y])].clear();
			D.merge(pos[b[i].Y],pos[b[n-i+1].Y]);
			cnt--;
		}
	}
	for(int i=2;i<=n-i+1;i++)
	{
		int j=i-1;
		if((n&1)&&(i==(n+1)/2||j==(n+1)/2)) continue;
		if(D.find(pos[b[i].Y])!=D.find(pos[b[j].Y]))
		{
			sd swap(b[i],b[j]);
			sd swap(b[n-i+1],b[n-j+1]);
			Fr(st[D.find(pos[b[j].Y])]) st[D.find(pos[b[i].Y])].push_back(it);
			st[D.find(pos[b[j].Y])].clear();
			D.merge(pos[b[i].Y],pos[b[j].Y]);
			cnt--;
			
		}
	}
	if(cnt==1)
	{
		puts("YES");
		F(i,1,n) printk(b[i].Y);
		puts("");
	}
	else puts("NO");
}
int main()
{
	int T;
	T=read();
	while(T--) solve();
}
2024/7/11 20:29
加载中...