D. Game With Triangles

  • 了解了goto语句的用法。传言goto被视为“洪水猛兽”,但在OI中它是否真的没有可取之处呢
#include <bits/stdc++.h>
using namespace std;
int a[200005],b[200005];
long long s[200005];
int n,m;
int K(int n,int m)
{
	int kmax=0;
	while(n>0&&m>0&&n+m>2)
	{
		if(n<m)
		{
			swap(n,m);
		}
		n-=2;
		m-=1;
		kmax++;
	}
	return kmax;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		sort(a+1,a+n+1);
		for(int i=1;i<=m;i++)
		{
			cin>>b[i];
		}
		sort(b+1,b+m+1);
		int kmax=K(n,m);
		cout<<kmax<<"\n";
		int p=0,q=0;
		for(int i=1;i<=kmax;i++)
		{
			s[i]=s[i-1];
			label:
			if(n-2*p-q>1&&m-p-2*q>1)
			{
				if(a[n-p]-a[p+1]>b[m-q]-b[q+1])
				{
					s[i]=s[i]+a[n-p]-a[p+1];
					p++;
				}
				else
				{
					s[i]=s[i]+b[m-q]-b[q+1];
					q++;
				}
			}
			else if(n-2*p-q>1&&m-p-2*q>0)
			{
				s[i]=s[i]+a[n-p]-a[p+1];
				p++;
			}
			else if(n-2*p-q>0&&m-p-2*q>1)
			{
				s[i]=s[i]+b[m-q]-b[q+1];
				q++;
			}
			else if(n-2*p-q>1)
			{
				q--;
				s[i]=s[i]-(b[m-q]-b[q+1]);
				s[i]=s[i]+a[n-p]-a[p+1];
				p++;
				goto label;
			}
			else
			{
				p--;
				s[i]=s[i]-(a[n-p]-a[p+1]);
				s[i]=s[i]+b[m-q]-b[q+1];
				q++;
				goto label; 
			}
			cout<<s[i]<<" ";
		}
		if(kmax)
		{
			cout<<"\n";
		}
	}
	return 0;
}
posted @ 2025-01-30 17:04  D06  阅读(24)  评论(0)    收藏  举报
//雪花飘落效果