35pts 球调(悬2关)
查看原帖
35pts 球调(悬2关)
569235
w9095楼主2024/8/18 23:57

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;
} 
2024/8/18 23:57
加载中...