2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明
题目描述
今天,冰雪聪明的栗酱终于玩到了她梦寐很久的文明游戏。
不过作为一个萌新,兔头獐脑的栗酱自然不愿意第一次玩就遇到一个尴尬的开局,于是希望通过你来寻找一个完美开局。
已知开始时场上有n个国家,每个国家有一个初始人口基数ai,2个人口基数均不为0的国家间可以进行一场战争,而战争会使这两个国家的人口基数分别下降1,任意2个国家之间最多进行一场战争。
完美开局的定义是:存在一种战争集合,当这些战争完成以后,所有国家的人口基数总和取得最小值。
现在请你输出完美开局下所有国家的人口基数之和。
输入描述:
输出描述:
- 对于每一个询问,输出一个数,即完美开局下所有国家的人口基数之和。
输入
- 2
- 4
- 3 3 3 3
- 8
- 3 4 3 4 1 3 3 4
输出
- 0
- 1
说明
- 对于第一个样例:
国家1与国家2之间进行一场战争,剩下的人口基数为:2 2 3 3,
国家1与国家3之间进行一场战争,剩下的人口基数为:1 2 2 3,
国家1与国家4之间进行一场战争,剩下的人口基数为:0 2 2 2,
国家2与国家3之间进行一场战争,剩下的人口基数为:0 1 1 2,
国家2与国家4之间进行一场战争,剩下的人口基数为:0 0 1 1,
国家3与国家4之间进行一场战争,剩下的人口基数为:0 0 0 0。
任意两个国家之间恰好分别发生一场战争,剩余人口基数和取得最小值0。
备注:
题解
线段树,贪心,Havel-Hakimi定理。
操作步骤和Havel-Hakimi定理相同,只是要拿线段树优化一下操作。
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 100000 + 10;
- int T, n;
- int a[maxn];
- int s[maxn * 4];
- int f[maxn * 4];
- void pushDown(int rt) {
- if(f[rt] == 0) return;
- s[2 * rt] = s[2 * rt] - f[rt];
- s[2 * rt + 1] = s[2 * rt + 1] - f[rt];
- f[2 * rt] = f[2 * rt] + f[rt];
- f[2 * rt + 1] = f[2 * rt + 1] + f[rt];
- f[rt] = 0;
- }
- void pushUp(int rt) {
- s[rt] = max(s[2 * rt], s[2 * rt + 1]);
- }
- void build(int l, int r, int rt) {
- f[rt] = 0;
- if(l == r) {
- s[rt] = a[l];
- return;
- }
- int mid = (l + r) / 2;
- build(l, mid, 2 * rt);
- build(mid + 1, r, 2 * rt + 1);
- pushUp(rt);
- }
- int get(int p, int l, int r, int rt) {
- if(l == r) {
- return s[rt];
- }
- int res;
- int mid = (l + r) / 2;
- pushDown(rt);
- if(p <= mid) res = get(p, l, mid, 2 * rt);
- else res = get(p, mid + 1, r, 2 * rt + 1);
- pushUp(rt);
- return res;
- }
- void update(int L, int R, int val, int l, int r, int rt) {
- if(L <= l && r <= R) {
- f[rt] = f[rt] + val;
- s[rt] = s[rt] - val;
- return;
- }
- int mid = (l + r) / 2;
- pushDown(rt);
- if(L <= mid) update(L, R, val, l, mid, 2 * rt);
- if(R > mid) update(L, R, val, mid + 1, r, 2 * rt + 1);
- pushUp(rt);
- }
- int first(int l, int r, int rt) {
- if(l == r) {
- return l;
- }
- int mid = (l + r) / 2;
- int res;
- pushDown(rt);
- if(s[2 * rt] > 0) res = first(l, mid, 2 * rt);
- else res = first(mid + 1, r, 2 * rt + 1);
- pushUp(rt);
- return res;
- }
- int main() {
- scanf("%d", &T);
- while(T --) {
- scanf("%d", &n);
- for(int i = 1; i <= n; i ++) {
- scanf("%d", &a[i]);
- }
- sort(a + 1, a + 1 + n);
- build(1, n, 1);
- for(int i = n; i >= 1; i --) {
- int y = first(1, n, 1);
- if(y >= i) break;
- int x = get(i, 1, n, 1);
- if(x >= i - y) {
- update(i, i, i - y, 1, n, 1);
- update(y, i - 1, 1, 1, n, 1);
- } else {
- update(i, i, x, 1, n, 1);
- update(i - x, i - 1, 1, 1, n, 1);
- if(get(i - x - 1, 1, n, 1) > get(i - x, 1, n, 1)) {
- int L1, R1 = i - x - 1;
- int L2 = i - x, R2;
- int left, right;
- left = y, right = i - x - 1;
- while(left <= right) {
- int mid = (left + right) / 2;
- if(get(mid, 1, n, 1) < get(i - x - 1, 1, n, 1)) {
- left = mid + 1;
- } else {
- right = mid - 1;
- L1 = mid;
- }
- }
- left = i - x, right = i - 1;
- while(left <= right) {
- int mid = (left + right) / 2;
- if(get(mid, 1, n, 1) > get(i - x, 1, n, 1)) {
- right = mid - 1;
- } else {
- left = mid + 1;
- R2 = mid;
- }
- }
- //[L1, R1] [L2, R2];
- if(R1 - L1 == R2 - L2) {
- update(L1, R1, 1, 1, n, 1);
- update(L2, R2, -1, 1, n, 1);
- } else if(R1 - L1 > R2 - L2) {
- update(L2, R2, -1, 1, n, 1);
- update(L1, L1 + R2 - L2, 1, 1, n, 1);
- } else {
- update(L1, R1, 1, 1, n, 1);
- update(R2 + L1 - R1, R2, -1, 1, n, 1);
- }
- }
- }
- }
- long long ans = 0;
- for(int i = 1; i <= n; i ++) {
- ans = ans + (long long)get(i, 1, n, 1);
- }
- printf("%lld\n", ans);
- }
- return 0;
- }
2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明的更多相关文章
- 2017年浙江工业大学大学生程序设计迎新赛热身赛-J-Forever97与寄信
Forever97与未央是一对笔友,他们经常互相写信.有一天Forever97去邮局寄信,发现邮局的收费方式变成了按字收费,收取的费用为总字数除了其自身以外的最大因子.虽然Forever97是一个有情 ...
- 2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)
问题 I: qwb VS 去污棒 时间限制: 2 Sec 内存限制: 256 MB 提交: 74 解决: 26 [提交][状态][讨论版] 题目描述 qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底 ...
- 2017年浙江中医药大学大学生程序设计竞赛(重现赛)D - CC的神奇背包
题目描述 cc最近收到了好多礼物,对着满地大小不一的礼物,她想要一个包来装,于是dd就掏出了一个会说话的神奇背包给cc装礼物.cc为了一次性装尽可能多的礼物,于是跟这个背包定下了一个规则,对每个礼物, ...
- 中国(北方)大学生程序设计训练赛(第二周) (A B D G)
比赛链接 A题是KMP,先把A拼接到B的后面,然后利用next数组的意义(包括其具体含义,以及失配时的应用),得到ans #include<bits/stdc++.h> using nam ...
- 中国(北方)大学生程序设计训练赛(第一周) (D E)
比赛链接 D题是个二分,每次check复杂度为O(n),类似于xdu_1068,只是一个是求积,一个是求商 #include<bits/stdc++.h> using namespace ...
- 2017中国大学生程序设计竞赛-哈尔滨站 H - A Simple Stone Game
A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- 2020年“感恩杯”台州学院第十三届大学生程序设计竞赛D、H、I题解(后续补充)
D题:小z与他的袜子 描述 小z每天会穿一双新袜子. 开始他的衣柜里有n双袜子,袜子会从1-n进行编号.每天早上他都会从衣柜里拿编号最小的袜子来穿.每天晚上他会把今天穿的袜子扔进篮子里,如果篮子里有n ...
- ACM 五一杭电赛码"BestCoder"杯中国大学生程序设计冠军赛小记
对于这项曾经热爱的竞赛,不得不说这是我最后一年参加ACM比赛了,所以要珍惜每一次比赛的机会. 五一去杭电参加了赛码"BestCoder"杯中国大学生程序设计冠军赛,去的队伍包括了今 ...
- 2016年中国大学生程序设计竞赛(合肥)-重现赛1001 HDU 5961
传递 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
随机推荐
- 《Apache HttpClient 4.3开发指南》
转载自:http://blog.csdn.net/chszs/article/details/16854747 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chs ...
- Handlebars 使用
引入js <script src="js/json3.min.js"></script> <script src="js/handlebar ...
- Spring Boot 使用IntelliJ IDEA创建一个web开发实例(一)
.新建项目File-->New-->Project-->Spring Initializr 点击Finish,一个Spring Boot web应用就创建好了.
- aidl.exe'' finished with non-zero exit value 1问题解决【转载】
PS:Android Studio用AIDL时,碰到一个非常棘手的问题,但是百度之,压根非法解决,FQ出去,终于找到了一篇解决问题的文章,特地转载之. 之前使用aidl传递的都是基本的数据类型比如in ...
- 重构改善既有代码设计--重构手法05:Introduce Explaining Variable (引入解释性变量)
发现:你有一个复杂的表达式. 解决:将该复杂的表达式(或其中的部分)的结果放进一个临时变量,并以此变量名称来解释表达式用途. //重构前 if((platform.toUpperCase().in ...
- 使用itextpdf提取pdf内容
package test; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList ...
- 如何编写高质量的 jQuery 代码?
想必大家对于jQuery这个最流行的javascript类库都不陌生,而且只要是前端开发人员肯定或多或少的使用或者接触过,在今天的这篇文章中,我们将介绍一些书写高质量jQuery代码的原则,我们不单单 ...
- [php]http响应头解析
(Status-Line) HTTP/ OK Cache-Control no-cache Content-Length Content-Type image/gif Date Sat, Dec :: ...
- 【CodeForces】960 F. Pathwalks 主席树+动态规划
[题目]F. Pathwalks [题意]给定n个点m条边的有向图,可能不连通有重边有自环.每条边有编号 i 和边权 wi ,求最长的路径(可以经过重复节点)满足编号和边权都严格递增.n,m,wi&l ...
- wampserver 虚拟主机
转载:http://blog.csdn.net/knight_quan/article/details/51830683 1.背景: 在进行网站开发的时候,通常需要以http://localhost或 ...