cf950f Curfew
神贪心……写了一个晚上加一个早上。
先考虑只有一个宿管的情况。
- 首先,如果这个宿舍人多了,多余的人就跑到下一个宿舍。(如果这是最后一个宿舍的话,多的就躺床底下)
- 如果这个宿舍人少了,但是能从别的宿舍调过来人,那就调人。
- 如果这个宿舍人少了,从别的宿舍也调不过来足够的人,那就全跑到下一个宿舍去。
- 让宿管查宿。
关于调人,我们可以每次总是从当前能调过来人的最远宿舍调人,调成负的也无所谓。想一想,为什么。
还有一个神奇的事情:不同的人的路径不交。比如说,有 \(i \leq a \leq b \leq j\),要是 \(i\) 跑到 \(b\),\(j\) 跑到 \(a\),就不如 \(i\) 去 \(a\),\(j\) 去 \(b\)。
因此,有这样一个宿舍:这个宿舍左边的人都去对付第一个宿管,右边的人都去对付第二个宿管,这个宿舍的人有去对付第一个的也有去对付第二个的。
或者说,我们枚举有多少个人对付第一个宿管。每次枚举都 \(\mathrm{O}(n)\) 的求一下,总复杂度是 \(\mathrm{O}(n^2b)\),这样不好,考虑加速枚举。
可以发现,分去对付第一个宿管的人越多,宿管发现的赖宿舍数越少。
记 \(f(m)\) 是给第一个宿管分去 \(m\) 人然后发现的赖宿舍数,显然 \(f(m)\) 是非严格单调减的。记 \(g(m)\) 是给第一个宿管分去 \(m\) 人(也就是给第二个宿管分 \(nb-m\) 人)然后第二个宿管发现的赖宿舍数,显然 \(g(m)\) 是非严格单调增的。
欲最小化 \(\max(f(m),g(m))\),则记 \(z(m)=g(m)-f(m)\),则 \(z(m)\) 非严格单调增。二分找出那个合适的 \(m\) 即可。
需要注意的一点是,如果 \(z(m)=0\) 那当然好,那样答案就是 \(ans(m)\)。可是我们在二分的时候写的判定是 \(z(m) \geq 0\) 这种,有可能找出来的是 \(z(m) > 0\) 的最小 \(m\),因此还要看看 \(ans(m-1)\),看看到底哪个更小。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int aa[100005], n, d, b, qq[100005], cur=1, a[100005], mid;
int f(int hmn, int far){
int r=1, sum=0, re=0;
for(int i=1; i<=hmn; i++){
for(; r<=far && r<=i+d*i; r++)
sum += a[r];
if(a[i]>=b){
int tmp=a[i]-b;
a[i] -= tmp;
a[i+1] += tmp;
sum -= a[i];
}
else{
if(sum>=b){
a[r-1] -= b - a[i];
a[i] = b;
sum -= a[i];
}
else{
a[i+1] += a[i];
a[i] = 0;
re++;
}
}
}
return re;
}
int z(int x, int &tmp1, int &tmp2){
while(qq[cur-1]>=x && cur>1) cur--;
while(qq[cur]<x && cur<n) cur++;
memset(a, 0, sizeof(a));
for(int i=1; i<=cur; i++)
a[i] = aa[i];
a[cur] = x - qq[cur-1];
tmp1=f((n+1)/2, cur);
memset(a, 0, sizeof(a));
for(int i=n; i>=cur; i--)
a[n-i+1] = aa[i];
a[n-cur+1] = qq[cur] - x;
tmp2=f(n/2, n-cur+1);
return tmp2-tmp1;
}
int main(){
cin>>n>>d>>b;
for(int i=1; i<=n; i++){
scanf("%d", &aa[i]);
qq[i] = qq[i-1] + aa[i];
}
int l=0, r=n*b, re, tmp1, tmp2;
while(l<=r){
mid = (l + r) >> 1;
if(z(mid, tmp1, tmp2)>=0) re = mid, r = mid - 1;
else l = mid + 1;
}
z(re, tmp1, tmp2);
int ans=max(tmp1,tmp2);
z(re-1, tmp1, tmp2);
ans = min(ans, max(tmp1, tmp2));
cout<<ans<<endl;
return 0;
}
upd:从神犇代码学的
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, cnt1, cnt2, b, d;
ll a[100005];
ll sum(ll l, ll r){
if(l<1) l = 1;
if(r>n) r = n;
return a[r] - a[l-1];
}
int main(){
cin>>n>>d>>b;
for(int i=1; i<=n; i++){
scanf("%I64d", &a[i]);
a[i] += a[i-1];
}
for(int i=1; i<=n/2; i++){
if(sum(1, i+(ll)i*d)>=(ll)(cnt1+1)*b) cnt1++;
if(sum(n-i-(ll)i*d+1, n)>=(ll)(cnt2+1)*b) cnt2++;
}
cout<<max(n/2-cnt1, n/2-cnt2);
return 0;
}
cf950f Curfew的更多相关文章
- 【CF949D】Curfew(贪心)
[CF949D]Curfew(贪心) 题面 CF 洛谷 破池姐姐翻译好强啊 题解 今天菊开讲这题,我大力猜想一波说肯定从中间有个分界线,他还说可能是假的 大力贪心就好了,从两边往中间考虑,只要这个房间 ...
- CF949D Curfew
传送门 跟这个大佬学的->戳我 假设只有一个宿管,那么从前往后做的过程中,如果能到达某个寝室范围内的人数不够\(b\),那么不如把这个寝室空出来,这样更有利于后面的抉择;反之,就把这个寝室搞正好 ...
- 解题:CF949D Curfew
题面 整体的思路就是在均摊每个宿舍的人数,注意一个人可以跑好几次=.= 可以发现多的学生往中间跑一定能跑过宿管,所以只考虑学生们能不能及时跑到人不够的宿舍.对两边记录两个已经满足要求的宿舍,然后用前/ ...
- Codeforces Round #469 (Div. 2) F. Curfew
贪心 题目大意,有2个宿管分别从1和n开始检查房间,记录人数不为n的房间个数,然后锁住房间. 没有被锁的房间中的学生可以选择藏在床底,留在原地,或者转移(最远转移d个房间) 然后抄了网上大神的代码 ...
- CF 949D Curfew——贪心(思路!!!)
题目:http://codeforces.com/contest/949/problem/D 有二分答案的思路. 如果二分了一个答案,首先可知越靠中间的应该大约越容易满足,因为方便把别的房间的人聚集过 ...
- CF 949 D Curfew —— 二分答案
题目:http://codeforces.com/contest/949/problem/D 先二分一个答案,让两边都至少满足这个答案: 由于越靠中间的房间越容易满足(被检查的时间靠后),所以策略就是 ...
- $CF949D\ Curfew$ 二分/贪心
正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...
- Python 爬取所有51VOA网站的Learn a words文本及mp3音频
Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...
- Gym 100507D Zhenya moves from the dormitory (模拟)
Zhenya moves from the dormitory 题目链接: http://acm.hust.edu.cn/vjudge/contest/126546#problem/D Descrip ...
随机推荐
- [转]nopcommerce之权限模块
本文转自:http://www.nopchina.net/category/%E6%9E%B6%E6%9E%84.html 这篇文章简单介绍一下nopcommerce的权限模块,nopcommerce ...
- Linux下自动化测试环境的搭建
1.安装Linux虚拟机,详情参考 https://blog.csdn.net/qq_22770715/article/details/78558374 https://www.cnblog ...
- mvc 连接数据库但单复值得问题
1. The model backing the ‘MusicStoreDBContext‘ context has changed since the database was created. ...
- 企业CIO、CTO必读的34个经典故事
一. 用人之道 去过庙的人都知道,一进庙门,首先是弥陀佛,笑脸迎客,而在他的北面,则是黑口黑脸的韦陀.但相传在很久以前,他们并不在同一个庙里,而是分别掌管不同的庙.弥乐佛热情快乐,所以来的人非常多,但 ...
- iOS 字符串处理笔记
iOS字符串处理笔记,包括如何使用正则表达式解析,NSScanner扫描,设置和使用CoreParse解析器来解析处理自定义符号等内容 搜索 在一个字符串中搜索子字符串 最灵活的方法 - (NSRan ...
- 自己开发的在线视频下载工具,基于Java多线程
比如这个在线视频: 我们可以正常播放,但是找不到下载按钮. 打开Chrome开发者工具,在Network标签页里能看到很多网络传输请求: 随便看一个请求的响应,发现类型为video,大小为500多k. ...
- 如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)
在JavaScript里可以用ES6提供的FunctionGenerator这种黑科技来打印非波拉契数列,具体细节参考我这篇文章. 在ABAP里也有很多种方式实现这个需求. 下面这个report分别用 ...
- git快速入门(MAC系统,github,ssh key)
如果使用过svn的话,git大致可以认为是多了本地库的svn.git先本地提交commit到本地库,然后再push到远程服务器的库.git是分布式的代码管理工具,基于SSH协议.ssh的作用就是为了不 ...
- Vue-Quill-Editor 富文本编辑器的使用
步骤如下: 1.下载Vue-Quill-Editor npm install vue-quill-editor --save 2.下载quill(Vue-Quill-Editor需要依赖) npm i ...
- 相机 感光度iso,焦距,光圈,ccd 和 噪点, 景深关系表格
表格 矩阵 感官度iso: 越低曝光速度越慢,所谓慢工出细活,成像质量会好,如果形成的话. 但是因为慢,所以要更多的光量,才能画完. 就需要更慢的快门 (但是太慢手抖的话就糊掉,或者动的物体形成轨迹. ...