rt,调了三天了没调出来
脑残大模拟题目
#include <bits/stdc++.h>
using namespace std;
int t,n,m,k,a[3000000],b[3000000],d[3000000],ls[400],q[3000000],y[3000000],c[400][2],op[3000000],c1[3000000],c2[3000000],l=1,r=0,cnt=0,ci=0,top=0,em=0;
bool iq[3000000];
void dec(int x)
{
if(d[x]%2==0)while(d[x]>0)op[++top]=1,c1[top]=1,d[x]--;
else if(d[x]%2==1)while(d[x]>1)op[++top]=1,c1[top]=1,d[x]--;
}
void addtop(int x,int s)
{
op[++top]=1,c1[top]=s;
if(c[s][0]==0)c[s][0]=b[x],y[b[x]]=s,ci++;
else if(c[s][1]==0&&c[s][0]!=b[x])c[s][1]=b[x],y[b[x]]=s,ci++;
else if(c[s][1]==b[x])c[s][1]=0,y[b[x]]=0,ci--,q[++r]=s,iq[s]=1;
else if(c[s][1]==0&&c[s][0]==b[x])c[s][0]=0,y[b[x]]=0,ci--;
}
void addbottom(int x,int to)
{
op[++top]=1,c1[top]=em;
op[++top]=2,c1[top]=em,c2[top]=to;
if(c[to][1]!=0)q[++r]=to,iq[to]=1;
c[to][0]=c[to][1],c[to][1]=0,ci--,y[b[x]]=0;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
cnt=0,top=0,l=1,r=0,ci=0,em=n;
for(int i=1;i<=n;i++)q[i]=c[i][0]=c[i][1]=0,iq[i]=0;
for(int i=1;i<=k;i++)y[i]=0;
for(int i=1;i<=m;i++)
{
scanf("%lld",&a[i]);
if(i==1||a[i]!=b[cnt])b[++cnt]=a[i],d[cnt]=1;
else d[cnt]++;
}
for(int i=1;i<=n;i++)q[++r]=i,iq[i]=1;
for(int i=1;i<=cnt;i++)
{
dec(i);
if(d[i]==0)continue;
if(q[l]==em)iq[q[l]]=0,q[l]=0,l++;
if(y[b[i]]!=0)
{
if(c[y[b[i]]][1]==b[i])addtop(i,y[b[i]]);
else addbottom(i,y[b[i]]);
continue;
}
if(ci<2*n-2)
{
addtop(i,q[l]);
if(c[q[l]][0]!=0&&c[q[l]][1]!=0)iq[q[l]]=0,q[l]=0,l++;
continue;
}
int le=++top,pr=i+1;
for(int j=i+1;j<=cnt;j++)
{
dec(j);
if(d[j]==0)continue;
if(!ls[b[j]])ls[b[j]]=y[b[j]];
if(b[j]==b[pr-1])
{
addtop(j,em);
addtop(pr-1,em),top--;
op[le]=1,c1[le]=em,i=j;
break;
}
if(c[ls[b[j]]][0]==b[j]&&c[ls[b[j]]][1]!=0)
{
addbottom(j,ls[b[j]]),iq[q[r]]=0,q[r]=0,r--;
addtop(pr-1,ls[b[j]]),top--;
op[le]=1,c1[le]=ls[b[j]],i=j;
break;
}
else
{
addtop(j,ls[b[j]]);
if(c[ls[b[j]]][0]==0&&c[ls[b[j]]][1]==0)
{
addtop(pr-1,em),top--;
op[le]=1,c1[le]=em;
if(!iq[em])q[++r]=em,iq[em]=1;
em=ls[b[j]],i=j;
break;
}
}
}
for(int j=pr;j<=i;j++)ls[b[j]]=0;
}
for(int i=l;i<=r;i++)q[i]=0;
printf("%d\n",top);
for(int i=1;i<=top;i++)
if(op[i]==1)printf("%d %d\n",op[i],c1[i]);
else if(op[i]==2)printf("%d %d %d\n",op[i],c1[i],c2[i]);
}
return 0;
}