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 ...
随机推荐
- 更好的 java 重试框架 sisyphus 的 3 种使用方式
回顾 我们前面学习了 更好的 java 重试框架 sisyphus 入门简介 更好的 java 重试框架 sisyphus 配置的 2 种方式介绍 更好的 java 重试框架 sisyphus 背后的 ...
- 如何接入 K8s 持久化存储?K8s CSI 实现机制浅析
作者 王成,腾讯云研发工程师,Kubernetes contributor,从事数据库产品容器化.资源管控等工作,关注 Kubernetes.Go.云原生领域. 概述 进入 K8s 的世界,会发现有很 ...
- 【技术博客】利用handler实现线程之间的消息传递
[技术博客]利用handler实现线程之间的消息传递 一.handler简介 在Android Studio的开发中,经常需要启动多个线程.比如向远程发送请求时,必须新开一个子线程,否则会造成程序崩溃 ...
- netty入门实现简单的echo程序
最近看以往在程序中编写的代码,发现有一个功能是使用socket通讯来实现的,而那个时候使用的是基于bio的阻塞io来实现的,最近在看netty,发现可以使用netty来使用nio的方式来实现,此博客记 ...
- 疯狂Java基础Day1
--每过一遍基础,都是一次提升! 太多遗忘了,慢慢补... 推一个Java学习教程--->b站搜:狂神说Java系列(排序完毕) 推荐原因:讲的不错,会涉及到底层,也会讲讲面试. 一.注释 主要 ...
- HttpContext.Current.Request.Url 地址:获取域名
假设当前页完整地址是:http://www.test.com/aaa/bbb.aspx?id=5&name=kelli 协议名----http://域名 ---- www.test.com站 ...
- stop: Job failed while stopping start: Job is already running: networking eth0 not configured
再给ubuntu系统重启网络服务的时候出现失败,"stop: Job failed while stopping start: Job is already running: network ...
- F. Mattress Run 题解
F. Mattress Run 挺好的一道题,对于DP的本质的理解有很大的帮助. 首先要想到的就是将这个拆成两个题,一个dp光求获得足够的夜晚的最小代价,一个dp光求获得足够的停留的最小代价. 显然由 ...
- songwenxin
# -*- coding: utf-8 -*- import wx from modelmngr_frame import MyFrame1 ############################# ...
- InnoDB存储引擎的锁
InnoDB存储引擎的锁 锁的类型 锁的类型包括: 1. 共享锁(S lock),允许事务读取一行数据 2. 排他锁(X lock),允许事务删除或更新一行数据 锁的兼容性a X S ...