【Codeforces Round #698 (Div. 2) C】Nezzar and Symmetric Array

题目链接

链接

翻译

给你 2n 个数字, 每个数字各不相同,如果 a[i] 存在的话,那么 a[i] 也会存在于这个数组中。

定义 diai 和所有数字的差的绝对值之和。

现在告诉你 di,让你还原出来原始的 ai

题解

我们假设 a1,a2,a3...an 分别为最大的 n 个正数(会对应 n 个负数),且从大到小排序。

那么,a1 对应的 di 的值中绝对值的形式就可以去掉了,因为不管减还是加上某个数都是正的了。

a1+x,a1x...

可以想见最后的 di 的值就是 2na1

然后考虑 a2

会发现除了 |a2a1| 是负数,会变为 a2+a1 之外,其他的项都是正数,绝对值可以去掉。

而这可以和 a2(a1)a2+a1 抵消掉 a2

那么 d2 的值就为 2a1+(n2)a2, 发现了吧,以此类推 d3=2a1+2a2+(n4)a3

并且 d 的值也是单调递减的。根据能否整除,以及 a1an 都是正数且下降这些性质验证一下算出来的 ai 是不是对的就好了。

代码

#include <bits/stdc++.h>
#define LL long long
using namespace std;
 
const int N = 2e5;
 
int T,n;
LL d[N + 10],a[N+10];
 
int main() {
	#ifdef LOCAL_DEFINE
		freopen("in.txt", "r", stdin);
	#endif // LOCAL_DEFINE
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> T;
	
	while (T--) {
		cin >> n;
		for (int i = 1; i <= 2 * n; i++) {
			cin >> d[i];
		}
		sort(d + 1, d + 1 + 2*n);
		bool check = true;
		for (int i = 2; i <= 2 * n; i += 2) {
			if (d[i] != d[i - 1]) {
				check = false;
			}
		}
		reverse(d + 1, d + 1 + 2*n);
		int cur = 2*n;
		LL temp = 0;
		for (int i = 1; i <= n; i++) {
			int j = 2 * i;
			d[j] -= temp;
			if (d[j] % cur != 0) {
				check = false;
			}
			a[i] = d[j] / cur;
			if (a[i] <= 0) {
				check = false;
			}
			if (i > 1 && a[i] >= a[i - 1]) {
				check = false;
			}
 
			temp += 2 * a[i];
			cur -= 2;
		}
 
		if (!check) {
			cout << "NO" << endl;
		}
		else {
			cout << "YES" << endl;
		}
	}
	return 0;
}
posted @   AWCXV  阅读(99)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2019-03-04 【Codeforces 375B】Maximum Submatrix 2
2019-03-04 【Codeforces 490C】Hacking Cypher
点击右上角即可分享
微信分享提示