萌新太弱
查看原帖
萌新太弱
370599
why_cb楼主2022/10/9 20:58

做法正确

只A了4个点,其他所有测试点显示 ax<aya_x<a_y

不知道是哪里错

#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
using namespace std;

typedef long long ll;
const int N=1e5+86;

int t,n,cnt,op[N<<1][2],tot;
ll a[N],sum;

template<typename T>
inline void read(T &x)
{
	T k=1;char ch=getchar();x=0;
	while(ch<'0'||ch>'9'){if(ch=='-') k=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
	x*=k;
}

int main()
{
	read(t);
	while(t--)
	{
		read(n);
		cnt=sum=tot=0;
		for(int i=1;i<=n;i++)
			read(a[i]),sum+=a[i];
		while((sum&1)==0) sum>>=1;
		bool f=false;
		for(int i=1;i<=n;i++)
		{
			if(a[i]==0) continue;
			if(a[i]%sum)
			{
				printf("NO\n");
				f=true;
				break;
			}
			a[i]/=sum;
			cnt++;
		}
		if(f) continue;
		printf("YES\n");	
		while(cnt!=1)
		{
			for(int i=1;i<=n;i++)
			{
				if(a[i]==0) continue;
				if((a[i]&1)==1)
				{
					int j=i+1;
					while((a[j]&1)==0) j++;
					if(a[i]<a[j])
					{
						op[++tot][0]=j;
						op[tot][1]=i;
						a[j]-=a[i];
						if(a[j]==0) cnt--;
						a[i]<<=1;
					}
					else
					{
						op[++tot][0]=i;
						op[tot][1]=j;
						a[i]-=a[j];
						if(a[i]==0) cnt--;
						a[j]<<=1;
					}
					i=j;
				}
			}
			for(int i=1;i<=n;i++)
				if(a[i]) a[i]>>=1;
		}
		printf("%d\n",tot);
		for(int i=1;i<=tot;i++)
			printf("%d %d\n",op[i][0],op[i][1]);
	}
	return 0;
}

2022/10/9 20:58
加载中...