CodeForces - 1478C - Nezzar and Symmetric Array (思维+规律)

简介: 笔记

Nezzar and Symmetric Array


题意

11.png

思路

举个例子−4,−3,−2,−1,1,2,3,4 可以发现规律 :一个数到一个较小的数和这个较小的数的相反数的距离是自身的两倍 比如 4 到 -3 和 4 到 3 距离为 8


并且一个绝对值较小的数和两个绝对值比它大的正负数的距离和 = 二倍大数的绝对值


所以可以从大到小考虑依次还原数组 判断是否符合条件即可又发现了一个规律


首先记录d数组中每个数出现的次数 稍微想一下可以知道 一个数肯定是两个两个出现 并且是偶数


用 sum 记录 当前数到比它绝对值大的数的距离t.first 减去sum 后得到的为 当前数到所有绝对值小于等于自己的数(这样的数有n个 每次找到后 n–)的距离 可以得到 x= (t.first−sum)/ 2 / n


记录上一个找到的数为las 因为是从大到小找且找正的那个 所以 如果x>=las  ∣∣  x<=0 就不合题意了


代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
//#define mod 1000000007
using namespace std;
typedef  long long LL;
typedef pair<int, int>PII;
inline LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; }
const int N = 200010;
int n;
LL a[N];
bool cmp(LL a, LL b) {
  return a > b;
}
void solve() {
  bool flag = true;
  cin >> n;
  map<LL, LL, greater<LL>>mp;
  for (int i = 1; i <= 2 * n; ++i) {
    cin >> a[i];
    mp[a[i]]++;
  }
  LL las = LLONG_MAX;
  LL sum = 0;
  for (auto &t : mp) {
    //cout << "t.first == " << t.first << endl;
    if (t.second != 2) {
      flag = false;
      break;
    }
    else if (t.first & 1) {
      flag = false;
      break;
    }
    else {
      if (((t.first - sum) / 2) % n) {
        flag = false;
        break;
      }
      LL x = (t.first - sum)/ 2 / n;
      //cout << "x == " << x << endl;
      if (x <= 0 || x >= las) {
        flag = false;
        break;
      }
      n--;
      sum += 2 * x;
      las = x;
    }
  }
  if (flag)puts("YES");
  else puts("NO");
}
int main() {
  int t; cin >> t;
  while (t--)
    solve();
  return 0;
}


目录
相关文章
codeforces722——C.Destroying Array(并查集+栈+逆向思维)
codeforces722——C.Destroying Array(并查集+栈+逆向思维)
55 0
codeforces722——C.Destroying Array(并查集+栈+逆向思维)
|
1月前
|
Python
使用array()函数创建数组
使用array()函数创建数组。
28 3
|
1月前
|
存储 安全 Swift
在Swift中,数组(Array)
在Swift中,数组(Array)
37 3
|
1月前
|
JavaScript 前端开发
总结TypeScript 的一些知识点:TypeScript Array(数组)(下)
一个数组的元素可以是另外一个数组,这样就构成了多维数组(Multi-dimensional Array)。
|
1月前
|
存储 JavaScript 前端开发
总结TypeScript 的一些知识点:TypeScript Array(数组)(上)
数组对象是使用单独的变量名来存储一系列的值。
|
1月前
|
Ruby
|
1天前
|
存储 安全 算法
C++的内置数组和STL array、STL vector
C++的内置数组和STL array、STL vector
|
1月前
|
JavaScript 前端开发 索引
在JavaScript中,可以使用数组字面量或Array构造函数来创建一个数组对象
【4月更文挑战第16天】在JavaScript中,可以使用数组字面量或Array构造函数来创建一个数组对象
28 4
|
7月前
|
算法 Python
数组倍增(Array Doubling
数组倍增(Array Doubling)是一种常见的算法技术,用于解决数组相关的查找、插入、删除等问题。该技术的核心思想是将数组的大小乘以 2,新数组的长度是原数组长度的两倍,然后将原数组中的元素复制到新数组中。在某些情况下,这种技术可以提高算法的效率,尤其是对于动态数据结构的问题。
156 1
|
1月前
|
存储 索引 Python
多数pythoneer只知有列表list却不知道python也有array数组
多数pythoneer只知有列表list却不知道python也有array数组
32 0