• CF1478C-Nezzar and Symmetric Array


    题目

    给出一个长度为 (2n) 的数组,问是否存在一个满足条件的 (a) 数组,满足给出的 (d) 数组。((1≤n≤10^5,0≤d_i≤10^{12})

    题目链接:https://codeforces.com/contest/1478/problem/C

    分析

    首先,(d) 数组中的数必须是成对出现,两两相同。一开始从小的数入手,推了很久的公式都没有解决。其实,从最大的 (a_i) 入手就很好写。可以发现,有:

    [a_i=frac{d_{i}-2sum_{j=i+1}^{n}{a_j}}{2i} ]

    按照公式,求出 (a) ,然后按照题目条件依次判断即可。

    代码

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    const int N=2e5+5;
    ll d[N],a[N];
    map<ll,int>mp;
    int main()
    {
        int t,n;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            mp.clear();
            for(int i=1;i<=2*n;i++)
                scanf("%lld",&d[i]);
            sort(d+1,d+1+2*n);
            int f=0,cnt=0;
            for(int i=1;i<=2*n;i+=2)
            {
                if(d[i]!=d[i+1]||d[i]%2==1)
                {
                    f=1;
                    break;
                }
                d[++cnt]=d[i];
            }
            if(f==0)
            {
                ll sum=0;
                for(int i=n;i>=1;i--)
                {
                    if((d[i]-2*sum)%(2*i))
                    {
                        f=1;
                        break;
                    }
                    a[i]=(d[i]-2*sum)/(2*i);//cout<<i<<":"<<a[i]<<endl;
                    if(mp.count(a[i])||a[i]<=0)
                    {
                        f=1;
                        break;
                    }
                    mp[a[i]]=1;
                    sum+=a[i];
                }
                if(f) printf("NO
    ");
                else printf("YES
    ");
            }
            else printf("NO
    ");
        }
        return 0;
    }
    
    
  • 相关阅读:
    poj 2516 Minimum Cost (最小费用流 )
    new start
    关于c语言中的声明和定义
    多态性与虚函数之对象切片
    C专家编程之typedef
    QGroupBox设置边框
    多态性与虚函数之继承中的virtual 晚捆绑
    使用Map
    遍历控件
    C专家编程之枚举
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/14349736.html
Copyright © 2020-2023  润新知