神贪心……写了一个晚上加一个早上。

先考虑只有一个宿管的情况。

  • 首先,如果这个宿舍人多了,多余的人就跑到下一个宿舍。(如果这是最后一个宿舍的话,多的就躺床底下)
  • 如果这个宿舍人少了,但是能从别的宿舍调过来人,那就调人。
  • 如果这个宿舍人少了,从别的宿舍也调不过来足够的人,那就全跑到下一个宿舍去。
  • 让宿管查宿。

关于调人,我们可以每次总是从当前能调过来人的最远宿舍调人,调成负的也无所谓。想一想,为什么。

还有一个神奇的事情:不同的人的路径不交。比如说,有 \(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相关推荐

  1. 【CF949D】Curfew(贪心)

    [CF949D]Curfew(贪心) 题面 CF 洛谷 破池姐姐翻译好强啊 题解 今天菊开讲这题,我大力猜想一波说肯定从中间有个分界线,他还说可能是假的 大力贪心就好了,从两边往中间考虑,只要这个房间 ...

  2. [渝粤教育] 南开大学 思辨式英文写作 参考 资料

    教育 -思辨式英文写作-章节资料考试资料-南开大学[] 随堂小测:What are the characteristics of critical essays? 1.[多选题]Which of th ...

  3. java打印直角三角形解析_编写java程序,打印3个5行直角三角形图案 运行效果如下: 使用 方法 实现 代码截图,必须含有2位学号+姓名_学小易找答案...

    [判断题] 项目评估的程序包括准备和执行. [单选题]下列表述正确的是______________ [单选题]Which fallacy is at work in the following? & ...

  4. 终极单词index 排序 C-D

    终极英语单词12000 1 变身口语达人3000词 1-3000 终极英语单词12000 2 成为英语学霸3000词 3001-6000 终极英语单词12000 3 畅读英文报刊3000词 6001- ...

  5. NLTK基础基础教程学习笔记(十四)

    对于文本分类,最简单的定义就是基于文本内容来对其进行分类.通常情况算法是根据数字/变量特征来写的. 先从https://archive.ics.uci.edu/ml/datasets/SMS+SPam ...

  6. 李阳英语228句口语要素 +校园英语迷你惯用语 +1000句最常用英语口语

    1. It's up to you.(由你决定.) 2. I envy [羡慕]you.(我羡慕你.) 3. How can I get in touch with you? 4. Where can ...

  7. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  8. 视频正在os x使用中_如何在OS X中使用家长控制来保护孩子

    视频正在os x使用中 Parental controls are great once you set them up and use them. Busy parents get to breat ...

  9. Elegy written in a country church-yard

    分享一首好诗:托马斯·格雷的<墓地哀歌>. "ELEGY WRITTEN IN A COUNTRY CHURCH-YARD" The curfew tolls the ...

  10. Harry Potter and the Half-Blood Prince

    书名:Harry Potter and the Half-Blood Prince  作者:J.K. Rowling 篇幅: 671页 蓝思值:1030L 用时:    16天 工具:  有道词典 [ ...

最新文章

  1. uva 515 King
  2. 【Linux】一步一步学Linux——unalias命令(206)
  3. 误删表数据,如何恢复过来
  4. 软件工程复习提纲——第二章
  5. 人类无法抗拒的10种心理
  6. Ubuntu打印机控制命令笔记
  7. 个人永久性免费-Excel催化剂功能第31波-数量金额分组凑数功能,财务表哥表姐最爱...
  8. 常见Linux发行版本(转载)
  9. 买硬盘如何避免买到二手翻新的硬盘,ICMAX教你分辨翻新硬盘
  10. 码农小汪-锁 LOCK
  11. Thoughts On To The Moon
  12. 移位和循环移位指令 shl, shr sal, sar, sol, sor, scl, scr, shld, shrd
  13. 深度学习平台的分布式实现综述
  14. 4点策略教你如何做好社群营销
  15. 一文8个步骤从0到1教你基于数据驱动的接口自动化框架封装
  16. 内容为王时代,你还在用畅言评论吗?
  17. 传输层的主要功能和协议
  18. 用jmeter压测tcp
  19. 视频服务器(8) Kurento[3] unity客户端
  20. python输出时间代码_Python获取世界多地时间怎么写代码呢?

热门文章

  1. 【神经网络架构】Pyramid Convolution(金字塔卷积模块)论文笔记
  2. 【webRTC】一个基于 tornado 和 webRTC 的点对点视频语音文字聊天室
  3. 军用产品环境可靠性试验-环境适应性检测
  4. 开机提示grub可咋办啊
  5. 诈骗短信报警12110
  6. 阿沐帮大家总结了自动化基本操作——selenium_常见技巧
  7. d3d11初窥(Introduction to 3D Game Programming with DirectX 11下载)
  8. 同样是学编程,为什么别人十几岁就成了黑客,而你还在做码农
  9. 二维矩形件排样算法之最低水平线算法实现
  10. 半透明导航栏css代码,纯CSS实现的紫罗兰风格导航条效果代码