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;
}
转载于:https://www.cnblogs.com/poorpool/p/8547683.html
cf950f Curfew相关推荐
- 【CF949D】Curfew(贪心)
[CF949D]Curfew(贪心) 题面 CF 洛谷 破池姐姐翻译好强啊 题解 今天菊开讲这题,我大力猜想一波说肯定从中间有个分界线,他还说可能是假的 大力贪心就好了,从两边往中间考虑,只要这个房间 ...
- [渝粤教育] 南开大学 思辨式英文写作 参考 资料
教育 -思辨式英文写作-章节资料考试资料-南开大学[] 随堂小测:What are the characteristics of critical essays? 1.[多选题]Which of th ...
- java打印直角三角形解析_编写java程序,打印3个5行直角三角形图案 运行效果如下: 使用 方法 实现 代码截图,必须含有2位学号+姓名_学小易找答案...
[判断题] 项目评估的程序包括准备和执行. [单选题]下列表述正确的是______________ [单选题]Which fallacy is at work in the following? & ...
- 终极单词index 排序 C-D
终极英语单词12000 1 变身口语达人3000词 1-3000 终极英语单词12000 2 成为英语学霸3000词 3001-6000 终极英语单词12000 3 畅读英文报刊3000词 6001- ...
- NLTK基础基础教程学习笔记(十四)
对于文本分类,最简单的定义就是基于文本内容来对其进行分类.通常情况算法是根据数字/变量特征来写的. 先从https://archive.ics.uci.edu/ml/datasets/SMS+SPam ...
- 李阳英语228句口语要素 +校园英语迷你惯用语 +1000句最常用英语口语
1. It's up to you.(由你决定.) 2. I envy [羡慕]you.(我羡慕你.) 3. How can I get in touch with you? 4. Where can ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- 视频正在os x使用中_如何在OS X中使用家长控制来保护孩子
视频正在os x使用中 Parental controls are great once you set them up and use them. Busy parents get to breat ...
- Elegy written in a country church-yard
分享一首好诗:托马斯·格雷的<墓地哀歌>. "ELEGY WRITTEN IN A COUNTRY CHURCH-YARD" The curfew tolls the ...
- Harry Potter and the Half-Blood Prince
书名:Harry Potter and the Half-Blood Prince 作者:J.K. Rowling 篇幅: 671页 蓝思值:1030L 用时: 16天 工具: 有道词典 [ ...
最新文章
- uva 515 King
- 【Linux】一步一步学Linux——unalias命令(206)
- 误删表数据,如何恢复过来
- 软件工程复习提纲——第二章
- 人类无法抗拒的10种心理
- Ubuntu打印机控制命令笔记
- 个人永久性免费-Excel催化剂功能第31波-数量金额分组凑数功能,财务表哥表姐最爱...
- 常见Linux发行版本(转载)
- 买硬盘如何避免买到二手翻新的硬盘,ICMAX教你分辨翻新硬盘
- 码农小汪-锁 LOCK
- Thoughts On To The Moon
- 移位和循环移位指令 shl, shr sal, sar, sol, sor, scl, scr, shld, shrd
- 深度学习平台的分布式实现综述
- 4点策略教你如何做好社群营销
- 一文8个步骤从0到1教你基于数据驱动的接口自动化框架封装
- 内容为王时代,你还在用畅言评论吗?
- 传输层的主要功能和协议
- 用jmeter压测tcp
- 视频服务器(8) Kurento[3] unity客户端
- python输出时间代码_Python获取世界多地时间怎么写代码呢?
热门文章
- 【神经网络架构】Pyramid Convolution(金字塔卷积模块)论文笔记
- 【webRTC】一个基于 tornado 和 webRTC 的点对点视频语音文字聊天室
- 军用产品环境可靠性试验-环境适应性检测
- 开机提示grub可咋办啊
- 诈骗短信报警12110
- 阿沐帮大家总结了自动化基本操作——selenium_常见技巧
- d3d11初窥(Introduction to 3D Game Programming with DirectX 11下载)
- 同样是学编程,为什么别人十几岁就成了黑客,而你还在做码农
- 二维矩形件排样算法之最低水平线算法实现
- 半透明导航栏css代码,纯CSS实现的紫罗兰风格导航条效果代码