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 ...
随机推荐
- ZooKeeper分布式配置——看这篇就够了
ZooKeeper 的由来 PS:这一节不重要, 不感兴趣的小伙伴可以跳过 ZooKeeper 最早起源于雅虎研究院的一个研究小组,在当时,研究人员发现,在雅虎内部有很多的大型系统基本上都需要依赖一个 ...
- Noip模拟51 2021.9.12
T1 茅山道术 考场上卡在了一个恶心的地方, 当时以为每次施法都会产生新的可以施法的区间,然后想都没细想, 认为不可做,甚至$dfs$也无法打,考后一问发现是自己想多了.. 新产生的区间对答案根本没有 ...
- ST表 ----kzsn考挂后有感
ST表,一个十分神奇的东西,需要O(nlogn)的时间预处理,但是他查询只需要O(1). 看似与线段树等数据结构时间复杂度一样,但是ST表的复杂度只在于预处理,预处理之后可以当做不耗时! 而想线段树这 ...
- python re:正则表达式中使用变量
参考:https://www.cnblogs.com/songbiao/p/12422632.html Python中正则表达式的写法,核心就是一个字符串.如下:re.compile(r'表达式')所 ...
- 链表中倒数第K个结点 牛客网 剑指Offer
链表中倒数第K个结点 牛客网 剑指Offer 题目描述 输入一个链表,输出该链表中倒数第k个结点. # class ListNode: # def __init__(self, x): # self. ...
- 2021CCPC网络赛(重赛)题解
自己还是太菜了,五个小时一个题也没磕出来,还是队友牛逼!... Primality Test 先看这个题,可能一上去就被\(\frac{f(x)+f(f(x))}{2}\)向下取整吓住了,但仔细想想, ...
- c#复制数组的多种方法
方法一:使用for循环 int []pins = {9,3,7,2} int []copy = new int[pins.length]; for(int i =0;i!=copy.length;i+ ...
- popStar机机对战数据生成器代码(C#)
代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
- Docker安装配置Tomcat
1.使用docker pull tomcat下载镜像(不加tag则是下载最新版本) 2.运行容器(-d 后台运行:-p 指定端口映射),接的是镜像ID 3.进入容器执行命令,接的是容器ID 4.宿主机 ...
- CentOS7自动备份oracle数据库
1.环境 操作系统:CentOS 7 数据库:11.2.0.1.0 2.登录服务器 切换oracle用户,备份需要在oracle用户下进行 #su - oracle 在oracle家目录下创建bin目 ...