昨晚Good Bye 2018D题没做出来,车翻大了……

官方题解      传送门

初赛知识:一个无向图所有顶点度数之和为偶数。然而这东西还有一个高端的名字:Handshaking lemma

但是这并不是本题的重点,另外一个看上去很高端的东西才是本题的重点:Erdős–Gallai theorem

对于一个无向图的度数序列$d$,先从大到小排序,即满足$d_1 \geq d_2 \geq d_3 \geq \dots \geq d_n$,

那么对于$\forall k \in [1, n]$,均满足

$$\sum_{i = 1}^{k}d_i \leq k(k - 1) + \sum_{i = k + 1}^{n}min(k, d_i)$$

意思就是先选出度数前$k$大的点然后让它们生成一张完全图,然后剩下的点无论怎么连一定是一张合法的无向图。

我们注意到在这题中,如果$x,y$是两个合法的答案(不妨设$x<y$),那么如果$z$满足$z \in (x, y)$并且$x \mod 2 == z \mod 2$,$z$也是一个合法的答案。也就是说,我们只要做出这个答案的区间$[L, R]$,然后检验每一个$i \in [L, R]$是否满足那个初赛知识就好了。

考虑如何找这个区间。

首先把度数序列从大到小排个序然后弄个前缀和,我们去扫描每一个位置,把当前扫到的位置$i$作为Erdős–Gallai theorem中的$k$,因为后面都是有序序列,所以那个$min$只要二分找到一个分界点$j$使左边都大于$i$,右边都小于等于$i$,结合前缀和就可以算出式子两边的值。

假设左边的和为$a$,右边的和为$b$,考虑$n + 1$个点可以放在哪个位置(假设第$n + 1$个点的度数为$x$),有以下几种情况:

1、$a > b$,如果$a > b + i$,那么直接无解。

2、观察到当$n + 1$个点放在$3$的时候,有$b + x \geq a$,那么$x \geq a - b$。

3、当$n + 1$个点放在$1$的时候,第$i$个位置实际上变成了第$i + 1$个位置,但是这并不影响前缀和的计算,这时候满足$a - d_i + x \leq b + i$,那么$x \leq b + i - a + d_i$。

时间复杂度$O(nlogn)$。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll; const int N = 5e5 + ; int n;
ll a[N], sum[N];
vector <int> ans; bool cmp(ll x, ll y) {
return x > y;
} template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for (; ch > ''|| ch < ''; ch = getchar())
if (ch == '-') op = -;
for (; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} template <typename T>
inline void chkMin(T &x, T y) {
if (y < x) x = y;
} template <typename T>
inline void chkMax(T &x, T y) {
if (y > x) x = y;
} int main() {
read(n);
for (int i = ; i <= n; i++) read(a[i]);
sort(a + , a + + n, cmp);
for (int i = ; i <= n; i++) sum[i] = sum[i - ] + a[i]; ll ln = , rn = n;
for (int i = ; i <= n; i++) {
int j = lower_bound(a + + i, a + + n, i, cmp) - a;
ll lsum = sum[i], rsum = 1LL * (j - i - ) * i + sum[n] - sum[j - ] + 1LL * i * (i - );
if (lsum > rsum) {
if (lsum - rsum > i) return puts("-1"), ;
chkMax(ln, lsum - rsum);
}
chkMin(rn, a[i] + rsum + i - lsum);
} for (int i = ln; i <= rn; i++)
if (!((i - sum[n]) & )) ans.push_back(i); if (ans.empty()) puts("-1");
else {
int siz = ans.size();
for (int i = ; i < siz; i++)
printf("%d%c", ans[i], i == siz - ? '\n' : ' ');
} return ;
}

CF 1091E New Year and the Factorisation Collaboration的更多相关文章

  1. CodeForces 1091G. New Year and the Factorisation Collaboration

    题目简述:若你获得“超能力”:固定$n$,对任意$a$,可以快速求出$x \in [0, n)$(若存在),使得$x^2 \equiv a \pmod n$,若存在多个$x$满足条件,则返回其中一个( ...

  2. spark MLlib 概念 4: 协同过滤(CF)

    1. 定义 协同过滤(Collaborative Filtering)有狭义和广义两种意义: 广义协同过滤:对来源不同的数据,根据他们的共同点做过滤处理. Collaborative filterin ...

  3. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  6. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  7. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  8. CF memsql Start[c]UP 2.0 A

    CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...

  9. CF memsql Start[c]UP 2.0 B

    CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...

随机推荐

  1. NIO:异步非阻塞I/O,AIO,BIO

    Neety的基础使用及说明 https://www.cnblogs.com/rrong/p/9712847.html BIO(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一 ...

  2. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  3. 6 字典和集合——《Swift3.0从入门到出家》

    字典和集合 字典 字典是集合类型存放多个键值对,其中键是唯一的,不能重复 字典中存放的键值对是无序的,写入的顺序和读取的顺序可能不同 字典中存放的数据是任意类型 字典可以分为可变字典和不可变字典 创建 ...

  4. Oracle数据文件和临时文件的管理

    一.数据文件概述在Oracle数据库中,SYSTEM和SYSAUX表空间至少需要包含一个数据文件,此外还将包含多个其他表空间及与其相关的数据文件和临时文件.Oracle的数据文件和临时文件是操作系统文 ...

  5. 前端后端json技术整理

    前端: json对象,例如 var data = { c:, person:[ {name:}, {name:}, {name:}, {name:}, {name:} ] }; 转化为,json串 J ...

  6. 使用ajax提交form表单,formData

    http://www.cnblogs.com/zhuxiaojie/p/4783939.html formDatahttps://developer.mozilla.org/zh-CN/docs/We ...

  7. mysql复制原理与机制一

    复制原理:复制需要二进制日志记录数据库上的改变 slave的IO线程复制把master上的Binary log读取到本地的relay log里SQL线程负责把relay log恢复到数据库数据里 sh ...

  8. 工具软件集合 Adobe AE PS Pr CC 2018 2019 破解教程

    来源https://mp.weixin.qq.com/s/zeq1sTmaPsKt7Bsok0Ldrg(若链接失效,请关注软件安装管家公众号) 相关链接 Office 2019破解教程 Adobe 2 ...

  9. N卡控制面板把physx设置为cpu

    一般笔记本官方配置独显都会强于核显,若是独显不够强这里教你一个小技巧来缓解独显的压力:N卡控制面板把physx设置为cpu,可以试试看.对于不强大的独显有点效果.

  10. 【linux】下载命令lftp\sftp\wget

    sftp sftp(安全文件传输协议)与ftp 有着几乎一样的语法和功能.FTP 为 SSH的一部份,是一种传输档案至 Blogger 伺服器的安全方式.它并不使用ftp守护进程(ftpd或wu-ft ...