How D
  • 板块学术版
  • 楼主w9095
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/8/21 00:36
  • 上次更新2024/8/21 10:46:11
查看原帖
How D
569235
w9095楼主2024/8/21 00:36

rt,这个蒟蒻赛时想了一个图论建模做法,但是假了。求是不是建模一类的思路。

这是假掉的代码。

#include <bits/stdc++.h>
using namespace std;
struct edge
{
	long long v,nxt;
}e[4000000];
long long t,n,a[400000],b[400000],c[400000],h[800000],ind[800000],ans[800000],cnt=0,tol=0;
set<long long>q;
void add_edge(long long u,long long v)
{
	e[++cnt].nxt=h[u];
	e[cnt].v=v;
	h[u]=cnt;
	ind[v]++;
}

void init()
{
	cnt=0,tol=0,q.empty();
	for(int i=1;i<=n;i++)b[i]=c[i]=0;
	for(int i=1;i<=2*n;i++)h[i]=ind[i]=0;
}

void topo_sort()
{
	for(int i=1;i<=2*n;i++)
	    if(ind[i]==0)
	       {
	       if(i<=n&&b[i]==0)continue;
		   q.insert(i);
		   }
	bool flag=0;
	while(!q.empty())
	   {
	   	set<long long>::iterator it=q.end();
	   	it--;
	   	if((*it)>n)
	   	   {
	   	   	long long x=(*it);
	   	   	q.erase(it);
	   	   	for(int i=h[x];i;i=e[i].nxt)
	   	   	    {
	   	   	    ind[e[i].v]--;
	   	   	    if(ind[e[i].v]==0)q.insert(e[i].v);
				}
			continue;
		   }
	    if(flag)
	       {
	       	it=q.begin();
	       	long long x=(*it);
	   	   	q.erase(it),ans[++tol]=x;
	   	   	for(int i=h[x];i;i=e[i].nxt)
	   	   	    {
	   	   	    ind[e[i].v]--;
	   	   	    if(ind[e[i].v]==0)q.insert(e[i].v);
				}
			flag=0;
		   }
		else if(!flag)
		   {
	       	it=q.end();
	       	it--;
	       	long long x=(*it);
	   	   	q.erase(it),ans[++tol]=x;
	   	   	for(int i=h[x];i;i=e[i].nxt)
	   	   	    {
	   	   	    ind[e[i].v]--;
	   	   	    if(ind[e[i].v]==0)q.insert(e[i].v);
				}
			flag=1;
		   }
	   }
}

int main()
{
	scanf("%lld",&t);
	while(t--)
	   {
	   	scanf("%lld",&n);
	   	init();
	   	for(int i=1;i<=n;i++)scanf("%lld",&a[i]),c[a[i]]++;
	   	for(int i=1;i<=n-1;i++)add_edge(n+i,n+i+1);
	   	for(int i=1;i<=n;i++)
	   	    {
	   	    c[a[i]]--;
	   	    if(c[a[i]]==0&&i!=n)add_edge(a[i],n+i+1);
	   	    if(b[a[i]]==0)add_edge(n+i,a[i]),b[a[i]]=1;
			}
		topo_sort();
		printf("%lld\n",tol);
		for(int i=1;i<=tol;i++)printf("%lld ",ans[i]);
		printf("\n");
	   }
	return 0;
} 
2024/8/21 00:36
加载中...