CF1091E New Year and the Acquaintance Estimation
题目地址: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的更多相关文章
- 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 ...
- Codeforces 1091E New Year and the Acquaintance Estimation [图论]
洛谷 Codeforces 思路 有一个定理:Erdős–Gallai定理. 然后观察样例,可以猜到答案必定是奇偶性相同的一段区间,那么二分左右端点即可. 定理和这个猜测暂时都懒得学/证,留坑. #i ...
- Good Bye 2018 (A~F, H)
目录 Codeforces 1091 A.New Year and the Christmas Ornament B.New Year and the Treasure Geolocation C.N ...
- Codeforces 1091 Good Bye 2018
占个坑先,希望不要掉的太惨了吧,不要掉到上一次之前的rating upt:flag竟然没到,开心. A - New Year and the Christmas Ornament 好像没什么可说的. ...
- Codeforces Good Bye 2018
咕bye 2018,因为我这场又咕咕咕了 无谓地感慨一句:时间过得真快啊(有毒 A.New Year and the Christmas Ornament 分类讨论后等差数列求和 又在凑字数了 #in ...
- Good Bye 2018 Solution
A. New Year and the Christmas Ornament 签到. #include <bits/stdc++.h> using namespace std; int a ...
- 萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)
最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对"基数"以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了"HyperLo ...
- Noise Contrastive Estimation
Notes from Notes on Noise Contrastive Estimation and Negative Sampling one sample: \[x_i \to [y_i^0, ...
- 手势估计- Hand Pose Estimation
http://blog.csdn.net/myarrow/article/details/51933651 1. 目前进展 1.1 相关资料 1)HANDS CVPR 2016 2 ...
随机推荐
- socket编程 ------ UDP服务器
void vLANcommunication( void *pvParameters ) { int32 listenfd; do{ listenfd = socket(AF_INET, SOCK_D ...
- Qt ------ excel 操作
写 excel // step1:连接控件 QAxObject* excel = new QAxObject(this); excel->setControl("Excel.Appli ...
- DB9 ------ 接口定义
下图是母座和公座的接口定义: 特别提醒:以上是公座和母座的接口定义,如果是串口线,RXD就变成TXD,以此类推.
- OpenDayLight——HelloWorld
OpenDayLight——HelloWorld 既然学习OpenDayLight编程这个鬼,就得像学语言一样来一个HelloWorld来试试水,经过几天的折腾,总算成功输出HelloWorld了,这 ...
- docker 基础之网络管理
docker网络基础. docker使用到的与linux网络有关的主要技术 Network Namespace(网络命名空间) Veth设备对 Iptables/NetFilter 网桥 路由 标准的 ...
- 关于Mui严格模式下的报错解决方案
前言:作为一名程序员遇到Bug总是在所难免的,但是记住"不二过",今天在Vue开发中遇到了一个报错让我纠结了许久,找了许久, 报错的原因是使用了mui导入其js文件导致的. 报错信 ...
- HTTP status constants
HTTP status constants value = ngx.HTTP_CONTINUE (100) (first added in the v0.9.20 release) value = n ...
- Spring boot 使用多个RedisTemplate
问题描述 想在一个JAVA Class 向同一个Redis实例的不同 dbindex 写入数据,非常类似于StackOverflowe上的[How can select dbIndex when I ...
- FormatMessage
FormatMessage 获取GetLastError 函数返回的错误代码对应的字符串描述. #include <Windows.h>#include <tchar.h> V ...
- JavaSE回顾及巩固的自学之路(三)——————所有语言的都存在的基本运算
在上一篇的博客中,我回顾到Java中的关键字,标识符等知识点,而今天这篇博文将回顾Java的,哦,不,不止Java,据本人了解,几乎在所有的语言中的基础阶段,都会存在这些运算,只是语法不一样而已. 今 ...