CF505E Mr. Kitayuta vs. Bamboos
要使得最高的柱子高度最小,考虑二分这个高度,那么剩下的就是要指定一个操作方案,使得最终每个柱子高度\(\le mid\)
因为有个柱子高度不会\(<0\)的限制,所以正着模拟不太方便维护.考虑倒着模拟,那么问题可以转化成一开始有\(n\)个高度为\(mid\)的柱子,有\(m\)天,每天每个柱子先会减少\(a_i\)高度(还要保证柱子高度每个时刻\(\ge 0\)),然后每个可以操作\(k\)次,每次选一个柱子使得其高度增加\(p\),要使得最终每个柱子高度\(\ge h_i\)
现在要知道每次操作应该选哪个柱子操作.因为要保证柱子高度每个时刻\(\ge 0\),所以应该优先选择高度最快会\(<0\)的柱子操作,形式化的讲就是如果\(t\)时刻有柱子高度为\(he\),如果中途不操作,那么这个柱子在\(t+\lfloor\frac{he}{a_i}\rfloor+1\)时刻会\(<0\),所以要在这个时刻前增加他的高度.然后显然是选择高度马上就要\(<0\)的操作最优.注意过程中已经有高度\(<0\)就不合法,如果有往后一直不操作,最终高度可以\(\ge h_i\)的柱子就不用管了.这个可以用堆维护,最后看堆是否为空即可
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double
using namespace std;
const int N=1e5+10,M=5000+10;
LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,m,kk;
LL h[N],a[N],cv3;
struct node
{
int x,t;
LL h,d;
bool operator < (const node &bb) const {return d>bb.d;}
};
priority_queue<node> hp;
int main()
{
///cfzmhs
n=rd(),m=rd(),kk=rd(),cv3=rd();
LL l=0,r=(LL)1e9*(m+1);
for(int i=1;i<=n;++i)
{
h[i]=rd(),a[i]=rd();
l=max(l,a[i]);
}
while(l<=r)
{
LL mid=(l+r)>>1;
while(!hp.empty()) hp.pop();
for(int i=1;i<=n;++i)
if(mid-a[i]*m<h[i])
hp.push((node){i,1,mid-a[i],mid/a[i]});
bool ok=1;
for(int i=1;ok&&i<=m;++i)
{
int rs=kk;
while(!hp.empty()&&rs)
{
node nw=hp.top();
hp.pop();
int x=nw.x;
if(nw.h-a[x]*(m-nw.t)>=h[x]) continue;
--rs;
nw.h-=a[x]*(i-nw.t);
if(nw.h<0) {ok=0;break;}
nw.h+=cv3;
hp.push((node){x,i,nw.h,i+nw.h/a[x]});
}
if(hp.empty()) break;
}
while(!hp.empty()&&hp.top().h-a[hp.top().x]*(m-hp.top().t)>=h[hp.top().x]) hp.pop();
ok&=hp.empty();
if(ok) r=mid-1;
else l=mid+1;
}
printf("%lld\n",r+1);
return 0;
}
CF505E Mr. Kitayuta vs. Bamboos的更多相关文章
- 「CF505E」 Mr. Kitayuta vs. Bamboos
「CF505E」 Mr. Kitayuta vs. Bamboos 传送门 如果没有每轮只能进行 \(k\) 次修改的限制或者没有竹子长度必须大于 \(0\) 的限制那么直接贪心就完事了. 但是很遗憾 ...
- Mr. Kitayuta vs. Bamboos
Mr. Kitayuta vs. Bamboos 题目链接:http://codeforces.com/problemset/problem/505/E 参考:http://blog.csdn.net ...
- Mr. Kitayuta vs. Bamboos CodeForces - 505E (堆,二分答案)
大意: 给定$n$棵竹子, 每棵竹子初始$h_i$, 每天结束时长$a_i$, 共$m$天, 每天可以任选$k$棵竹子砍掉$p$, 若不足$p$则变为0, 求$m$天中竹子最大值的最小值 先二分答案转 ...
- 506C Mr. Kitayuta vs. Bamboos
分析 代码 #include<bits/stdc++.h> using namespace std; #define int long long ],h[],now[],cnt[]; in ...
- @codeforces - 506C@ Mr. Kitayuta vs. Bamboos
目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个竹子,第 i 个竹子初始高度 hi,在每天结束时将长高 a ...
- Codeforces 505E - Mr. Kitayuta vs. Bamboos(二分+堆)
题面传送门 首先很显然的一点是,看到类似于"最大值最小"的字眼就考虑二分答案 \(x\)(这点我倒是想到了) 然鹅之后就不会做了/wq/wq/wq 注意到此题正着处理不太方便,故考 ...
- ACM: Mr. Kitayuta's Colorful Graph-并查集-解题报
Mr. Kitayuta's Colorful GraphTime Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...
- CodeForces 505B Mr. Kitayuta's Colorful Graph
Mr. Kitayuta's Colorful Graph Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d ...
- Codeforces Round #286 (Div. 2) B. Mr. Kitayuta's Colorful Graph dfs
B. Mr. Kitayuta's Colorful Graph time limit per test 1 second memory limit per test 256 megabytes in ...
随机推荐
- mac mysql重置root用户密码
苹果机安装的MySQL后,设置初始密码 引子:.在苹果机上安装的MySQL之后,通过MySQLWorkBench登录本地数据连接,发现没有密码,而在安装MySQL的过程中,是没有设置过密码的其实,刚刚 ...
- 前端知识点回顾之重点篇——CORS
CORS(cross origin resource sharing)跨域资源共享 来源:http://www.ruanyifeng.com/blog/2016/04/cors.html 它允许浏览器 ...
- RDS数据库全量恢复方案
一.全量恢复 恢复最近的快照,将快找之前的数据全量恢复 二.增量恢复 下载对应的binlog日志导入到数据库 三.还没有备份的binlog日志获取方法 首先连接 RDS for MySQL 后查看当前 ...
- Rsync数据同步工具及sersync同步工具
Rsync简介 Rsync英文全称Remote synchronization,从软件的名称就可以看出来,Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像,远程备份的功能,这个功能类似s ...
- 02 MySQL之数据表的基本操作
01-创建数据表 # 切换数据库 use test_db; # 创建数据表 语法规则如下: create table 表名 ( 字段名1, 数据类型 [列级别约束条件] [默认值], 字段名2, 数据 ...
- 一百二十二:CMS系统之页面抽离和登录页面
将登录和注册需要的共性标签抽离出来做父模板 将css改名为base base模板 {% from 'common/_macros.html' import static %}<!DOCTYPE ...
- 一百一十四:CMS系统之图形验证码生成
安装Pillow库,用于生成图形验证码:pip install Pillow 字体文件来源 生成一个验证码图片 import randomimport stringfrom PIL import Im ...
- Delphi编写的等长加密与解密
最近在看一本关于网络游戏服务端开发的书,虽然该书是个空架子,里面没有多少实际的内容(此书评价不好),但其中关于等长加密与解密的代码还是有一定的借鉴作用的.他山之石,可以攻玉.因为书中是C++的代码,所 ...
- mysql数据库设置密码
1.用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass'); ...
- 【miscellaneous】多播的实现和需要注意的问题
多播的实现和需要注意的问题 前段时间研究了一小段时间的网络多播问题,自己很有感触,把自己的经历写出来,希望有需要的可以少走一些弯路. 先说一下原理,我觉得这个还是需 ...