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;
}