题目地址:CF1091E New Year and the Acquaintance Estimation

首先,易知 \(ans\) 的奇偶性与所有给出的数的和的奇偶性相同

其次,易证 \(ans\) 的取值为一段连续的奇偶性相同的数,因此只需要到一个上界和下界(或者判断出无解输出 \(-1\) )

接下来的问题就是怎么判断一个状态合不合法以及如果不合法需要加还是减

题目中给出了一个Wiki的链接:Graph realization problem

链接中给出了问题的解法:Erdős–Gallai theorem

Erdős–Gallai定理的基本内容为:

一个非负整数序列 \(d_1≥d_2≥\cdots≥d_n\) 可以表示为 \(n\) 个顶点的简单图度序列,当且仅当 \(\sum_{i=1}^{n}\ d_i\) 为偶数且对每个 \(k\in [1,n]\) 满足

\[\sum_{i=1}^{k}\ d_i ≤ k(k-1)+\sum_{i=k+1}^{n}\ min(d_i,k)\]

对这个公式的理解 伪证 : \(1\) ~ \(k\) 这 \(k\) 个点的度数和最大为——所有点之间两两连线产生的度数和,加上剩下每个点可连线数量的最大值,这保证了公式的必要性;而非严格单调递减则保证了公式的充分性

利用公式朴素判断一次需要 \(O(n^2)\) ,但是可以优化到 \(O(n)\) ,外层嵌套两个二分,这样可以在 \(O(n\ log\ n)\) 的时间复杂度内解决问题

上代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 500006;
int n, a[N], c[N], cc[N], ansl = -1, ansr = -1;

int pd(int x) {
    memcpy(cc, c, sizeof(cc));
    ++cc[x];
    int w = 0, t = 0;
    ll s = 0, k = 0;
    for (int i = 0; i <= n; i++) {
        int num = (i == t && (t == n || a[t] < x)) ? x : a[t++];
        s += num;
        --cc[num];
        k += n - i - (w += cc[i]) - min(num, i);
        if (s > k + (ll)i * (i + 1)) return (i == t) ? 1 : -1;
    }
    return 0;
}

bool cmp(int x, int y) {
    return x > y;
}

int main() {
    cin >> n;
    ll s = 0;
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
        s += a[i];
        ++c[a[i]];
    }
    s &= 1;
    sort(a, a + n, cmp);
    int l = 0, r = (n - s) >> 1;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (pd((mid << 1) + s) == -1) l = mid + 1;
        else {
            ansl = mid;
            r = mid - 1;
        }
    }
    l = ansl;
    r = (n - s) >> 1;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (pd((mid << 1) + s) == 1) r = mid - 1;
        else {
            ansr = mid;
            l = mid + 1;
        }
    }
    if (ansl == -1 || ansr == -1) puts("-1");
    else for (int i = ansl; i <= ansr; i++)
            printf("%lld ", (i << 1) + s);
    return 0;
}

另外线段树也可以优化,这样时间复杂度会多一个 \(log\) ,对 \(500000\) 的数据来说有些吃力,就不码了

CF1091E New Year and the Acquaintance Estimation的更多相关文章

  1. Codeforces 1091E New Year and the Acquaintance Estimation Erdős–Gallai定理

    题目链接:E - New Year and the Acquaintance Estimation 题解参考: Havel–Hakimi algorithm 和 Erdős–Gallai theore ...

  2. Codeforces 1091E New Year and the Acquaintance Estimation [图论]

    洛谷 Codeforces 思路 有一个定理:Erdős–Gallai定理. 然后观察样例,可以猜到答案必定是奇偶性相同的一段区间,那么二分左右端点即可. 定理和这个猜测暂时都懒得学/证,留坑. #i ...

  3. Good Bye 2018 (A~F, H)

    目录 Codeforces 1091 A.New Year and the Christmas Ornament B.New Year and the Treasure Geolocation C.N ...

  4. Codeforces 1091 Good Bye 2018

    占个坑先,希望不要掉的太惨了吧,不要掉到上一次之前的rating upt:flag竟然没到,开心. A - New Year and the Christmas Ornament 好像没什么可说的. ...

  5. Codeforces Good Bye 2018

    咕bye 2018,因为我这场又咕咕咕了 无谓地感慨一句:时间过得真快啊(有毒 A.New Year and the Christmas Ornament 分类讨论后等差数列求和 又在凑字数了 #in ...

  6. Good Bye 2018 Solution

    A. New Year and the Christmas Ornament 签到. #include <bits/stdc++.h> using namespace std; int a ...

  7. 萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)

    最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对"基数"以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了"HyperLo ...

  8. Noise Contrastive Estimation

    Notes from Notes on Noise Contrastive Estimation and Negative Sampling one sample: \[x_i \to [y_i^0, ...

  9. 手势估计- Hand Pose Estimation

    http://blog.csdn.net/myarrow/article/details/51933651 1. 目前进展 1.1 相关资料      1)HANDS CVPR 2016      2 ...

随机推荐

  1. 使用Linux搭建FTP服务器实现文件共享

    使用Linux搭建FTP服务器实现文件共享... ---------------- Linux中的文件共享:FTPVSFTPDVSFTPD虚拟用户 FTP可以用在Linux与Linux 和Window ...

  2. 使用Nexus配置Maven私有仓库

    使用Nexus配置Maven私有仓库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装配置Nexus 1>.下载nexus 下载地址:https://www.sonat ...

  3. Java NIO中的Buffer 详解

    Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

  4. ssh-keygen Linux 免密登录

    一.选择算法和密钥大小 rsa - 基于分解大数的难度的旧算法.RSA建议密钥大小至少为2048位,4096位更好.RSA正在变老,并且在保理方面取得了重大进展.可能建议选择不同的算法.在可预见的将来 ...

  5. 6.适配器模式(Adapter Pattern)

    适配(转换)的概念无处不在......适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口.例如:二转换为三箱插头,将高电压转换为低电压等.    动机(Motivate):    在 ...

  6. Hbase记录-备份与恢复方案推荐

    热备份和冷备份参考方案,如在生产环境,请结合业务情况考虑

  7. TIMESTAMP使用遇到得麻烦

    mysql按日期查询报空,怎么查看日志发现是14:36:01.709(Timestamp), 参数出了问题 2018-04-17 14:36:16,887 [http-nio-8080-exec-5] ...

  8. 使用eclipse粗略统计代码代数【原】

  9. solr简介与安装

    solr简介: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引 ...

  10. php中inset 和 和 empty 的区别

    inset函数 用途:检测变量是否设置判断:检测变量是否设置,并且不是 NULL.如果已经使用 unset() 释放了一个变量之后,它将不再是 isset().若使用 isset() 测试一个被设置成 ...