codeforces 856a

A. Set Theory
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Masha and Grisha like studying sets of positive integers.

One day Grisha has written a set A containing n different integers ai on a blackboard. Now he asks Masha to create a set B containingn different integers bj such that all n2 integers that can be obtained by summing up ai and bj for all possible pairs of i and j are different.

Both Masha and Grisha don't like big numbers, so all numbers in A are from 1 to 106, and all numbers in B must also be in the same range.

Help Masha to create the set B that satisfies Grisha's requirement.

Input

Input data contains multiple test cases. The first line contains an integer t — the number of test cases (1 ≤ t ≤ 100).

Each test case is described in the following way: the first line of the description contains one integer n — the number of elements in A(1 ≤ n ≤ 100).

The second line contains n integers ai — the elements of A (1 ≤ ai ≤ 106).

Output

For each test first print the answer:

  • NO, if Masha's task is impossible to solve, there is no way to create the required set B.
  • YES, if there is the way to create the required set. In this case the second line must contain n different positive integers bj — elements of B (1 ≤ bj ≤ 106). If there are several possible sets, output any of them.
Example
input
3
3
1 10 100
1
1
2
2 4
output
YES
1 2 3 
YES
1 
YES
1 2 

将所有a+b都不相等转换为|ai-aj|!=|bq-bp|,暴力。


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
bool vis[1000005];   //表示这个差值有没有产生过 
int a[105];
int b[105];
int n;
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		memset(vis,0,sizeof(vis));
		scanf("%d",&n);
		for(int i=0;i<n;i++)
			scanf("%d",&a[i]);
		if(n==1)
		{
			printf("YES\n");
			printf("1\n");
			continue;
		}
		sort(a,a+n);
		for(int i=0;i<n;i++)         //存储数组a产生所有差值 
			for(int j=i+1;j<n;j++)
				vis[a[j]-a[i]]=1;
		b[0]=1;
		int cnt=1;
		for(int i=2;i<1000005;i++)
		{
			bool flag=false;
			for(int j=0;j<cnt;j++)       //只要bk与之前所有的数字产生的差值都没有被记录过这个bk就是可以的 
			{
				if(vis[i-b[j]])
				{
					flag=true;
					break;
				}
			}
			if(!flag)
			{
				b[cnt++]=i;
			}
			if(cnt>=n)break;
		}
		if(cnt>=n)
		{
			printf("YES\n");
			for(int i=0;i<n-1;i++)printf("%d ",b[i]);
			printf("%d\n",b[n-1]);
		}
		else
		{
			printf("NO\n");
		}
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值