玄关求捞 模拟 只过 11 12 14
查看原帖
玄关求捞 模拟 只过 11 12 14
1082583
allyears楼主2024/5/22 22:22
#include<bits/stdc++.h> 
#define ll long long 
using namespace std;
const ll N=1e6+10;

ll T,n;
ll a[N],b[N],ma[N],mb[N];// ma,mb 记录原对列 
bool A[N],B[N];  // 判断一个人是否被改变过 
ll zh=0; //  使 A队获胜时 a,b 交替改变 

int main()
{
	cin>>T;// 输入 
 	while(T--)
	{
		cin>>n;
		int S=0; //记录 平局或输了多少次  即使a队全胜改变了多少次 
		for(int i=1;i<=2*n;i++) A[i]=B[i]=false,ma[i]=mb[i]=0;
		//初始化 
		for(int i=1;i<=2*n;i++)
		{
			cin>>a[i];
			ma[i]=a[i];
		}
		for(int i=1;i<=2*n;i++)
		{
			cin>>b[i];
			mb[i]=b[i];
			
			if(b[i]==1)
			{
				if(a[i]==2||a[i]==1)//平局或输  下同 
				{	
					S++;
					if(zh==1) a[i]=3,A[i]=true,zh=0;
					else
					{
						if(a[i]==2)b[i]=3;
						else b[i]=2;
						zh=1;
						B[i]=true;
					}	
				 }
				  
			}
			if(b[i]==2)
			{
				if(a[i]==2||a[i]==3)
				{
					S++;
					if(zh==1)a[i]=1,A[i]=true,zh=0;
					else
					{
						if(a[i]==2)b[i]=3;
						else b[i]=1;
						zh=1;
						B[i]=true;
					}	
				 } 
			}
			if(b[i]==3)
			{
				if(a[i]==3||a[i]==1)
				{
					S++;
					if(zh==1)a[i]=2,A[i]=true,zh=0;
					else
					{
						if(a[i]==3)b[i]=1;
						else b[i]=2;
						zh=1;
						B[i]=true;
					}	
				 } 
			}
		}
		
		ll t=2*n-S;
		ll Ta=t/2,Tb=t/2;
		if(t%2!=0) Ta++;//因为是先改变b 所以如果是奇数  a队剩余的次数会多一 
		for(int i=1;i<=2*n;i++)
		{
			if(Ta==0&&Tb==0) break;
			
			if(A[i]==false&&Ta>0)//没被变过 并且可以被改变 
			{
				if(B[i]==false&&Tb>0) //对应的b 也没变过 
				{
					if(a[i]!=1) a[i]=1,b[i]=2;
					else a[i]=2,b[i]=3;
					
					Ta--;Tb--; 
				}
				else //b队变过 
				{
					if(a[i]==mb[i])//如果变前是平局 避免改变后与原来一样 
					{
						if(a[i]==1) a[i]=2,b[i]=3;
						else if(a[i]==2) a[i]=3,b[i]=1;
						else if(a[i]==3) a[i]=1,b[i]=2;
					}
					else// 否则输 交换输赢即可
					{	
						b[i]=a[i];
						a[i]=mb[i]; 
					}
					Ta--;//因为 b 队这个人 已经用过一次 a队--就行了 
				}
			}
			else if(B[i]=false&&Tb>0)// a队被改变 b队没变 上一个已经有两个都没变的情况 
			{// 所以 a 队被改变 
				 if(ma[i]==b[i])// 同理 
					{
						if(ma[i]==1) a[i]=2,b[i]=3;
						else if(ma[i]==2) a[i]=3,b[i]=1;
						else if(ma[i]==3) a[i]=1,b[i]=2;
					}
					else
					{
						a[i]=b[i];
						b[i]=ma[i];
					}
					Tb--;
			}	
		}
		

		cout<<2*n<<endl;// 输出 
		for(int i=1;i<=2*n;i++)
		{
			cout<<a[i]<<" ";
		}
		cout<<endl;
		for(int i=1;i<=2*n;i++)
		{
			cout<<b[i]<<" ";
		}	
	}
	return 0;
 } 
2024/5/22 22:22
加载中...