Codeforces 505E - Mr. Kitayuta vs. Bamboos(二分+堆)
首先很显然的一点是,看到类似于“最大值最小”的字眼就考虑二分答案 \(x\)(这点我倒是想到了)
然鹅之后就不会做了/wq/wq/wq
注意到此题正着处理不太方便,故考虑倒着处理,那么原题相当于,初始 \(b_i=x\),每次操作有以下步骤:
- \(\forall i,b_i\leftarrow b_i-a_i\) 并且要求修改过后的 \(b_i\geq 0\)
- 选择 \(k\) 个 \(b_i\) 并将它们加上 \(p\)
- 要求最后 \(\forall i,b_i\geq h_i\)
我们考虑建一个堆,堆里面维护所有元素的 \(\lfloor\dfrac{b_i}{a_i}\rfloor\) 的值,也就是每个元素最多减多少个 \(b_i\) 就会变到 \(0\)。然后我们每次贪心地选择 \(\lfloor\dfrac{b_i}{a_i}\rfloor\) 最小的元素并将其加上 \(p\),如果选完了还是发现有元素减去 \(a_i\) 后小于 \(0\) 就直接返回不合法即可。
最后考虑怎么判最终 \(b_i\geq h_i\) 是否成立。其实我们只需加一个小小的优化即可,不难发现对于某个 \(b_i\),如果我们给其加了 \(c_i\) 次 \(p\),并且满足 \(h_i+ma_i\leq x+c_ip\),那么我们就不用管这个元素了,因为不论怎样它最终都是大于 \(0\) 的,也就是说我们每次将某个 \(b_i\) 加上 \(p\) 之后如果发现 \(h_i+ma_i\leq x+c_ip\) 成立,那么我们就不用再将该元素压入堆了,最后检验堆是否为空即可。
时间复杂度 \((n+mk)\log n\log a_i\)。
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
const int MAXN=1e5;
int n,m,k,p,h[MAXN+5],a[MAXN+5];
int cnt[MAXN+5];
bool check(ll x){
memset(cnt,0,sizeof(cnt));
priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > > q;
for(int i=1;i<=n;i++) if(h[i]+1ll*a[i]*m>x) q.push(mp(x/a[i],i));
if(!q.empty()&&q.top().fi==0) return 0;
for(int i=1;i<=m&&!q.empty();i++){
for(int j=1;j<=k&&!q.empty();j++){
pair<ll,int> pp=q.top();q.pop();
int id=pp.se;cnt[id]++;
if(h[id]+1ll*a[id]*m>x+1ll*p*cnt[id])
q.push(mp((x+1ll*p*cnt[id])/a[id],id));
}
if(!q.empty()&&q.top().fi<=i) return 0;
} return q.empty();
}
int main(){
scanf("%d%d%d%d",&n,&m,&k,&p);
for(int i=1;i<=n;i++) scanf("%d%d",&h[i],&a[i]);
ll l=0,r=1e18,x=0,mid;
while(l<=r) check(mid=l+r>>1)?x=mid,r=mid-1:l=mid+1;
printf("%lld\n",x);
return 0;
}
Codeforces 505E - Mr. Kitayuta vs. Bamboos(二分+堆)的更多相关文章
- @codeforces - 506C@ Mr. Kitayuta vs. Bamboos
目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个竹子,第 i 个竹子初始高度 hi,在每天结束时将长高 a ...
- Mr. Kitayuta vs. Bamboos
Mr. Kitayuta vs. Bamboos 题目链接:http://codeforces.com/problemset/problem/505/E 参考:http://blog.csdn.net ...
- 「CF505E」 Mr. Kitayuta vs. Bamboos
「CF505E」 Mr. Kitayuta vs. Bamboos 传送门 如果没有每轮只能进行 \(k\) 次修改的限制或者没有竹子长度必须大于 \(0\) 的限制那么直接贪心就完事了. 但是很遗憾 ...
- CodeForces 505B Mr. Kitayuta's Colorful Graph
Mr. Kitayuta's Colorful Graph Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d ...
- codeforces 505B Mr. Kitayuta's Colorful Graph(水题)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Mr. Kitayuta's Colorful Graph Mr. Kitayut ...
- [Codeforces 505C]Mr. Kitayuta, the Treasure Hunter
Description The Shuseki Islands are an archipelago of 30001 small islands in the Yutampo Sea. The is ...
- Codeforces 505A Mr. Kitayuta's Gift 暴力
A. Mr. Kitayuta's Gift time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Codeforces 506D Mr. Kitayuta's Colorful Graph(分块 + 并查集)
题目链接 Mr. Kitayuta's Colorful Graph 把每种颜色分开来考虑. 所有的颜色分为两种:涉及的点的个数 $> \sqrt{n}$ 涉及的点的个数 $<= ...
- CodeForces - 505B Mr. Kitayuta's Colorful Graph 二维并查集
Mr. Kitayuta's Colorful Graph Mr. Kitayuta has just bought an undirected graph consisting of n verti ...
随机推荐
- 这样学BAT必面之软件设计原则,还不会就是我的问题
学习设计原则是学习设计模式的基础.在实际开发过程中,并不要求所有代码都遵循设计原则,我们要考虑人力.时间.成本.质量,不能刻意追求完美,但要在适当的场景遵循设计原则,这体现的是一种平衡取舍,可以帮助我 ...
- Github Actions 实践
Github Actions 实践 Github Actions 是 Github 的持续集成服务,通过在 repo 发生特定的行为时执行指定的命令实现自动测试.自动部署等功能. 基本术语 workf ...
- 【二食堂】Alpha - Scrum Meeting 11
Scrum Meeting 11 例会时间:4.21 18:00~18:20 进度情况 组员 进度 今日任务 李健 1. 登录注册页面前后端对接issue 1. 登录注册页面前后端对接issue2. ...
- CSDN app分析
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) (北京航空航天大学 - 计算机学院) 这个作业的要求在哪里 个人博客作业-软件案例分析 我的教学班级 005 说说csd ...
- 2020BUAA软工热身作业
2020BUAA软工热身作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 热身作业 我在这个课程的目标是 学习软件工 ...
- ip_local_port_range 和 ip_local_reserved_ports
问题:启动应用程序时,发现网络端口被占用,原因是什么?如何避免? 原因:Linux 系统设置了随机使用的端口范围 echo "40000 60000" > /proc/. ...
- numpy读取本地数据和索引
1.numpy读取数据 np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False) 做一个 ...
- Asp.Net 熟悉 Spring
注:(为加强记忆,所以记录下来,对于有些地方为什么那样写,我也不太理解) 一.我们先创建个窗体应用程序Demos,事先熟悉它是这么实现的 第一步,先在项目的根目录下建一个library文件夹,目的是放 ...
- ELK 脚本自动化删除索引
kibana有自带接口,可通过自带的API接口 通过传参来达到删除索引的目的. # 删除15天前的索引 curl -XDELETE "http://10.228.81.161:9201/pa ...
- 使用getopt 解析参数
getopt被用来解析命令行选项参数. #include <unistd.h> extern char *optarg; //选项的参数指针 extern int optind, //下一 ...