CF505E Mr. Kitayuta vs. Bamboos 二分+貪心
阿新 • • 發佈:2020-07-14
又是一個倒著處理的問題.
2900 的神仙二分+貪心可還行......
code:
#include <cstdio> #include <cstring> #include <queue> #define N 100009 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,m,K,P; int h[N],a[N],c[N]; struct node { int id,day; node(int id=0,int day=0):id(id),day(day){} bool operator<(const node b) const { return day>b.day; } }; priority_queue<node>q; int check(ll val) { memset(c,0,sizeof(c)); while(!q.empty()) q.pop(); for(int i=1;i<=n;++i) { if(val-1ll*a[i]*m<h[i]) { q.push(node(i,val/a[i])); } } for(int i=1;i<=m&&!q.empty();++i) { for(int j=1;j<=K&&!q.empty();++j) { node e=q.top(); q.pop(); if(e.day<i) return 0; ++c[e.id]; if(val-1ll*a[e.id]*m+1ll*c[e.id]*P<h[e.id]) { q.push(node(e.id,(val+1ll*c[e.id]*P)/a[e.id])); } } } return q.empty(); } int main() { // setIO("input"); scanf("%d%d%d%d",&n,&m,&K,&P); ll l=1,r=0,mid,ans=0; for(int i=1;i<=n;++i) { scanf("%d%d",&h[i],&a[i]); r=max(r,1ll*m*a[i]+h[i]); } while(l<=r) { mid=(l+r)>>1; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } printf("%lld\n",ans); return 0; }