Mr. Kitayuta vs. Bamboos

迷途竹林事实上就是经TiwAirOAO\color{red}{TiwAirOAO}TiwAirOAO巨佬扩大数据范围强化后的版本。真的是强化了吗
不过做了两遍都不会做的我还是埋了吧

题解

很明显,由于我们每次砍树是让树高从hhh变成max⁡(0,h−p)\max(0,h-p)max(0,h−p),每次减少的树高不是固定的,这就很难做了,况且它的树高还是会根据时间增加的。
既然我们已经无法简单地知道我们当前删哪个是最优的,不如考虑倒着来。
很显然,我们可以先二分我们的答案,也就是最后的最高的树高度是多少,看如果是这个高度的话能否达到我们的初始状态。
转化回到初始状态,我们的操作相当于也跟原来倒着来的。
我们可以先将所有树的最终高度都设为midmidmid,我们每次生长相当于所有树的高度减少aia_{i}ai​,而每次砍树相当于让我们树的高度加上ppp。
很明显,我们树的高度不可能为负数,所以当我们需要时刻保证我们的树高时时刻刻⩾0\geqslant 0⩾0。
而我们最后的树高也是必须⩾hi\geqslant h_{i}⩾hi​的,否则我们的答案树高一定更高。
很明显,我们倒退回去的方式肯定可以转化成一种正着砍过来的方式,而如果我们的最终高度⩾hi\geqslant h_{i}⩾hi​,那么我们最终高度为hih_{i}hi​时一定也是有解的。
由于我们过程中需要满足hi⩾0h_{i}\geqslant 0hi​⩾0的要求,所以我们可以每次选择一个会最快变得小于000的点,将它的高度加上ppp。最终⩾hi\geqslant h_{i}⩾hi​的要求,我们可以在最后时刻,将所有还没有用出的操作全部用出,看能否达到条件。
上面的过程我们可以通过优先队列来维护,但优先队列是log⁡\loglog的,事实上我们完全可以直接记录下来在每个时刻,有哪些位置即将不合法,将之后的操作加上去,再将它放到下一个可能不合法的位置就行了。

时间复杂度很明显的O((n+mk)logA)O\left((n+mk)log\,A\right)O((n+mk)logA)。

源码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 100005
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
typedef long long LL;
typedef unsigned long long uLL;
const LL INF=0x3f3f3f3f;
const int mo=1e9+7;
const int inv2=499122177;
const int jzm=2333;
const int lim=1e9;
const int zero=10000;
const int orG=3,invG=332748118;
const double Pi=acos(-1.0);
const double eps=1e-5;
typedef pair<LL,int> pii;
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x<0){x=(~x)+1;putchar('-');}if(x>9)print(x/10);putchar(x%10+'0');}
LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);}
int add(int x,int y,int p){return x+y<p?x+y:x+y-p;}
void Add(int &x,int y,int p){x=add(x,y,p);}
int qkpow(int a,int s,int p){int t=1;while(s){if(s&1LL)t=1ll*a*t%p;a=1ll*a*a%p;s>>=1LL;}return t;}
int n,m,k,cnt[MAXN];LL p;
struct ming{LL h,a;}s[MAXN];
vector<int>vec[MAXN];
bool check(LL mid){//printf("check %lld\n",mid);;for(int i=1;i<m;i++)vec[i].clear();int summ=0;for(int i=1;i<=n;i++){cnt[i]=0;LL tmp=mid/s[i].a;if(tmp<m)vec[tmp].pb(i);}for(int i=1;i<m;i++){summ+=k;//printf("arrive %d\n",i);for(int j=0;j<(int)vec[i].size();j++){int u=vec[i][j];cnt[u]++;summ--;if(summ<0||!s[u].a)return 0;LL tmp=(mid+1ll*cnt[u]*p)/s[u].a;if(tmp<m)vec[tmp].pb(u);}}summ+=k;for(int i=1;i<=n;i++)while(mid+1ll*cnt[i]*p-1ll*m*s[i].a<s[i].h&&summ>=0)cnt[i]++,summ--;return summ>=0;
}
signed main(){ read(n);read(m);read(k);read(p);LL maxx=0;for(int i=1;i<=n;i++)read(s[i].h),read(s[i].a),maxx=max(maxx,s[i].a);LL l=maxx,r=1e15;while(l<r){LL mid=l+r>>1LL;if(check(mid))r=mid;else l=mid+1LL;}printf("%lld\n",l);return 0;
}

谢谢!!!

[CF505E]Mr. Kitayuta vs. Bamboos/[海军国际项目办公室]迷途竹林相关推荐

  1. 【IOI2020国家集训队作业 Part 1】CF505E Mr. Kitayuta vs. Bamboos

    题目 题目描述 Mr. Kitayuta's garden is planted with nn bamboos. (Bamboos are tall, fast-growing tropical p ...

  2. CF506C Mr. Kitayuta vs. Bamboos

    CF506C Mr. Kitayuta vs. Bamboos 有nnn个竹子,第iii棵竹子第一天之前的高度是hih_ihi​,每一天的末尾会长高aia_iai​ 每一天你可以将砍kkk刀,每一刀将 ...

  3. Mr. Kitayuta vs. Bamboos

    Mr. Kitayuta vs. Bamboos 题目链接:http://codeforces.com/problemset/problem/505/E 参考:http://blog.csdn.net ...

  4. [CF506C]Mr. Kitayuta vs. Bamboos

    Description 有n个竹子,第i个竹子长度为h[i],每天的结束会长高a[i] 现在有m天,每一天可以做k次操作,每次操作可以选择一个竹子砍掉p,即高度h[i]=max(h[i]-p,0) 你 ...

  5. Mr. Kitayuta vs. Bamboos[二分+贪心][图像分析]

    文章目录 题目 思路 代码 题目 思路 首先最大值最小考虑二分,假设我们检验 xxx 但是发现检验比较难写 尝试从图像分析 那么画出来图像大致如下: 然后我们发现可以将图像上移末端重合至 (m,x)( ...

  6. CF506 C Mr. Kitayuta vs. Bamboos (贪心)

    题意 有n根竹子,初始高度是h[i],每天结束时会长高a[i],每天你可以砍K刀,一刀能减小p的高度.可以在某一天内砍相同的竹子多次.问m天结束后,最高的竹子最矮是多高. n≤1e5,k≤10,m≤5 ...

  7. [海军国际项目办公室]猪国杀

    猪国杀 题解 为什么总有**出题人喜欢用一些毒瘤题的题目名字来命名题目呀. 看到这种题一般很容易想到通过 d p dp dp来进行转移吧. 我们先考虑一下如果我们要选牌的话怎么选才能让我们获得的牌尽量 ...

  8. [hdu6757]Hunting Monsters/[海军国际项目办公室]能量产业革命

    Hunting Monsters 题解 实际上两道题的做法没什么区别,只是问的方式不大一样 不过hdu上的数据好像不完整,scanf可以过,read就过不了了 首先如果我们得确定我们以怎样的顺序选择我 ...

  9. [海军国际项目办公室]羽未

    羽未 题目概述 题解 TiwAirOAO\rm\color{black}{T}\color{red}{iwAirOAO}TiwAirOAO:这不就是一个线段树基础练习题吗 首先,对于一个固定的序列 a ...

最新文章

  1. 项目中涉及到的BAPI
  2. python 爬虫 爬取序列博客文章列表
  3. 基站位置查询系统_木牛导航网络基站服务免费了!——更便捷、更高效、更省心!...
  4. java构造函数_JAVA的构造函数是怎么写的。万分感谢。路过的请不要嘲笑%_%
  5. Postgresql - MATERIALIZED VIEW
  6. SpringCloud的服务注册中心(三) - 进一步了解 Eureka
  7. 华为hs8545m如何复位_在华为东莞松山湖基地,见证一场始于AI质检的智能制造变革...
  8. 一个网页如何决定是当前页打开还是新窗口打开?
  9. Unity草地/草坪案例分享(完整代码)
  10. 2019春第四次课程设计实验报告
  11. Linux目录结构,命令,文件类型学习
  12. JS调用拨打电话功能
  13. 如何重新认知性能优化及其度量方法
  14. 智能电视是否是一台计算机,误区四 智能电视代替电脑使用_平板电视_液晶电视评测-中关村在线...
  15. java语言笔记io
  16. Halcon二维码扫描算法总结
  17. python金融编程入门_金融编程与量化金融—Python编程汇总
  18. fastadmin-addons使用
  19. 如何将SolidWork许可管理器用于Draftsight Enterprise?
  20. Android7.0 Phone应用源码分析(三) phone拒接流程分析

热门文章

  1. Spring整合RabbitMQ(包含生产者和消费者)
  2. Centos7机器配置Google Authenticator动态密钥进行ssh二次验证图文详解
  3. win10无法安装完成若要在此计算机上,win10提示windows安装无法继续怎么办
  4. python123监考系统_2020-2021学年第1学期 期末考试监考安排
  5. 痞子衡嵌入式:深扒i.MXRTxxx系列ROM中集成的串行NOR Flash启动SW Reset功能及其应用场合...
  6. 哪一款iPhone拍照效果最好?拍照最好用的苹果手机是哪款
  7. Docker系列技术分享、容器技术和Docker
  8. Acwing 1191. 家谱树
  9. 用CSS实现阴阳八卦图等图形
  10. 一文读懂生成对抗网络(GANs)【下载PDF | 长文】