cf950f Curfew

news/2024/11/29 14:56:27/

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

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

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

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

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


http://www.ppmy.cn/news/322411.html

相关文章

NVIDIA GeForce 940M 设备是不可移动的,无法弹出或拔出问题解决办法

上个月在新入手的笔记本上安装了一个CUDA的开发环境&#xff0c;并选择安装了GeForce Experience工具&#xff0c;前两天打开GeForce Experience工具浏览时&#xff0c;工具提醒可以更新NVIDIA显卡驱动&#xff0c;于是便勾选并更新了NVIDIA显卡驱动&#xff0c;更新完成之后就…

Android运行报错avd,Android Studio出错:无法在模拟器中启动AVD

错误:调整分区e2fsck失败,退出代码为1. 我确保在设置AVD时完全遵循此视频.每当我使用x86_64系统映像运行AVD时,我都会收到以下消息: Cannot launch AVD in emulator. Output: Creating filesystem with parameters: Size: 69206016 Block size: 4096 Blocks per group: 32768…

MaoKePlayer猫客影音播放器

摘要&#xff1a; 市场上对音视频播放器的需求有很多&#xff0c;当然很多有趣的App都是与音视频播放有关&#xff0c;那么如何快速地打造一款适应市面上不同格式的音视频呢&#xff1f;MaoKePlayer猫客影音播放器便是一款非常简洁的音视频播放器插件&#xff0c;能够很方便地帮…

苹果cmsv8精仿好看的暴风影音影视深蓝色高端免费模板

苹果cmsv8精仿好看的暴风影音影视深蓝色高端免费模板主题介绍&#xff1a; 模板名称&#xff1a;苹果cmsv8精仿好看的暴风影音影视深蓝色高端免费模板模板程序&#xff1a;苹果cmsv8模板类型&#xff1a;pc模板空间支持&#xff1a;php5.6mysql模板颜色&#xff1a;白色模板来源…

Discuz X3.4 qq互联

QQ互联网站&#xff1a;

快播(QvodPlayer)最新版 v5.20.234 官方版

快播(QvodPlayer)最新版 v5.20.234 官方版 软件大小&#xff1a;30.8MB 软件语言&#xff1a;简体中文 软件性质&#xff1a;常用软件 软件授权&#xff1a;官方版 更新时间&#xff1a;2014-05-09 应用平台&#xff1a;/WinXP/|Win7|/Vista/|Win8 快播(QvodPlayer)最新版…

321影音代码

321影音代码(万能播放器)源码已经分享&#xff0c;点击链接进入直接可以下载&#xff1a; http://www.atguigu.com/online.shtml#online12

射手影音播放器android,射手影音播放器安卓版

休闲时光没事干&#xff1f;看你饥渴难耐的&#xff0c;来大片吧&#xff01;射手播放器中有超丰富的视频资源&#xff0c;用户在这里可以体验到超强大的在线字幕&#xff0c;包括可自动识别字幕文件的语言编码&#xff0c;避免字幕显示成乱码。射手影音播放器安卓版的福利也非…