首页 > 其他 > 详细

[CF1478C] Nezzar and Symmetric Array - 构造

时间:2021-02-28 21:56:22      阅读:28      评论:0      收藏:0      [点我收藏+]

[CF1478C] Nezzar and Symmetric Array - 构造

Description

给出一个长度为 \(2n\) 的数组,问是否存在一个满足条件的 \(a\) 数组,其中的元素按相反数成对出现,并且满足给出的 \(d\) 数组(di 表示 ai 与 a 中每个元素之差的绝对值之和)。(\(1≤n≤10^5,0≤d_i≤10^{12}\)

Solution

考虑从外向内逐层构造

对于内层来说,外面每一层 j 的贡献都是 2aj,减掉这一部分后,剩下的又相当于一个新的外层,利用 an=dn/n 计算出 an

#include <bits/stdc++.h>
using namespace std;

#define int long long

void solve()
{
    int n;
    cin >> n;

    vector<int> d(n * 2);
    for (int i = 0; i < n * 2; i++)
        cin >> d[i];

    sort(d.begin(), d.end());

    vector<int> e;
    e.push_back(0);
    for (int i = n * 2 - 2; i >= 0; i -= 2)
    {
        if (d[i] == d[i + 1])
        {
            e.push_back(d[i]);
        }
        else
        {
            cout << "NO" << endl;
            return;
        }
    }

    d = e;

    vector<int> a(n + 2);
    int s = 0;
    for (int i = 1; i <= n; i++)
    {
        if (d[i] - s <= 0 || (d[i] - s) % (2 * (n - i + 1)))
        {
            cout << "NO" << endl;
            return;
        }
        a[i] = (d[i] - s) / (2 * (n - i + 1));
        if (a[i] == a[i - 1])
        {
            cout << "NO" << endl;
            return;
        }
        s += 2 * a[i];
    }
    cout << "YES" << endl;
}

signed main()
{
    ios::sync_with_stdio(false);

    int t;
    cin >> t;

    while (t--)
    {
        solve();
    }
}

[CF1478C] Nezzar and Symmetric Array - 构造

原文:https://www.cnblogs.com/mollnn/p/14459717.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!