bzoj:3441 乌鸦喝水

题目传送门

Description

  一只乌鸦在自娱自乐,它在面前放了n个有魔力的水缸,水缸里装有无限的水。
  他准备从第1个水缸飞到第n个水缸,共m次。在飞过一个水缸的过程中,如果他能够得着水缸里的水,即水缸口到水面距离小于等于乌鸦能够得着的深度,那它就会喝水缸里的水。每喝一次水,所有水缸里的水位都会下降,第i个水缸里的水位会下降Ai,注意喝水是瞬间的,如果乌鸦刚好够得着,但喝完之后够不着,也视为喝到一次,水位也会相应的下降。

Input
  共有3行。第一行有三个正整数n、m和x,用空格隔开。n表示水缸的数量,m表示乌鸦飞的次数,x表示乌鸦能够得着的深度。第二行,有n个用空格隔开的正整数,第i个数为第i个水缸中水缸口到水面的距离Wi。第三行,有n个用空格隔开的正整数,第i个为Ai。

Output
  只有一行,这一行只有一个正整数,为这只乌鸦能喝到水的次数。

Sample Input
5 2 20
15 14 13 12 12
1 1 1 1 1

Sample Output
9

数据约定
  100%的数据,0<n≤100000,0<m≤100000,0<x≤2000000000,0<Wi≤2000000000,0<Ai≤200。

Solution

  每一口井下降的次数是固定,wat[i]=(x-W[i])/A[i]+1;
  只考虑次数就行了,每次减Ai挺麻烦的。
  先把井(筛掉一开始就喝不了的井,也就是次数为0的井)按次数从小到大排序(相同的序号大的排在前面)。
  一个简单的推论:i<j,那么井i一定比井j先消失。
  假设前面一共喝了tu轮。
  对于第i口井,可以知道还剩s口井,二分出一个答案cnt,表示第i口井除了前面喝的还可以被喝的次数。
  (scnt<wat[i]-last中cnt所能取的最大值,last表示之前的每一口井喝的总次数。水位是一起下降的)
  第i口井还可以喝cnt轮,那么后面的井也一定还可以喝cnt轮。
  num[i]=tu+cnt (表示第i口井被喝的次数)
  再判断序号小于id[i]且仍存在的井的个数(用树状数组),是否可以让第i口井再喝一次(也就是剩余的次数是否大于 在该井之前包括该井的井数,能则last++,num[i]++)。
  last+=s
cnt 把喝了的井的次数加上。
  tu+=cnt
  s-=1 剩余的井数减一。
  把每口井喝的次数num[i]加起来就是答案。
  时间复杂度O(N logN)
图大概是这样的(井是经过排序的)
1  2  3  4  5  6  7  8  9

1  2  3  4  5  6  7  8  9

      3  4  5  6  7  8  9
……

CODE

#include<cstdio>
#include<algorithm>#define imax(a,b) ((a>b)?(a):(b))typedef long long ll;using namespace std;typedef long long ll;const int N=120000;
int n,m,tu,wat[N],wo;
ll ans,T[N],num[N],q[N],d[N],s,last,x;bool cmp(int A,int B) {return (q[A]<q[B] || (q[A]==q[B] && B>A));
}void add(int x) { for(int i=x;i<=n+1;i+=(i&-i)) T[i]++; }ll query(int x) { ll G=0; for(int i=x;i;i-=(i&-i)) G+=T[i]; return G; }ll find(ll X,ll Y)
{ll L=0,R=m-tu;while(L+1<R){ll Mid=(L+R)>>1;if(Mid*Y<=X) L=Mid; else R=Mid;}if(R*Y<=X) L=R;return L;
}int main()
{freopen("2238.in","r",stdin);freopen("2238.out","w",stdout);scanf("%d%d%lld",&n,&m,&x); wo=0;for(int i=1;i<=n;i++) scanf("%lld",&d[i]);for(int i=1;i<=n;i++){ll B; scanf("%lld",&B);ll C=imax(0ll,(x-d[i])/B+1);if(C>0) q[++wo]=C,wat[wo]=wo;}sort(wat+1,wat+1+wo,cmp);s=wo; last=0; tu=0; ans=0;for(int i=1;i<=wo;i++){ll cnt=find(q[wat[i]]-last,s);if(cnt+tu==m){ans+=(wo-i+1)*m;printf("%lld\n",ans);return 0;}if(q[wat[i]]-last-s*cnt-wat[i]+query(wat[i])>=0){num[wat[i]]=cnt+tu+1;last++;} else num[wat[i]]=cnt+tu;last+=s*cnt; s--; tu+=cnt;add(wat[i]); ans+=num[wat[i]];}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/kekxy/p/7526221.html

BZOJ:3441 乌鸦喝水相关推荐

  1. bzoj 3441: 乌鸦喝水(说实话有生之年没有见过这么难的模拟)

    3441: 乌鸦喝水 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 311  Solved: 117 [Submit][Status][Discus ...

  2. NOIP模拟测试25「字符串·乌鸦喝水·所陀门王的宝藏(陀螺王)」

    字符串 题解 没看出catalan怎么办 dp打表啊! 考虑大力dp拿到30分好成绩!顺便收获一张表 打表发现$C_{n+m}^{m}-C_{n+m}^{m-1}$ 仔细观察然后发现其实就是之前的网格 ...

  3. 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏

    T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...

  4. Bzoj3441 乌鸦喝水

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 258  Solved: 97 Description [题目背景] 一只乌鸦在自娱自乐,它在面前放了 ...

  5. 乌鸦喝水(异常处理版 _)

    由于都没有人发 索性便发出来吧..不过UT没写好 >_< [要求] 改写乌鸦喝水案例,扩展场景:乌鸦面对一堆大小不一的石头,且其中可能有伪装成石头的小炸药丸,面对的瓶子可能是普通的瓶子,也 ...

  6. 心田花开:一年级语文《乌鸦喝水》教案解析及练习题

    小学阶段是语文学习的起步阶段,掌握所学的基础知识是非常必要的.心田花开分享了<乌鸦喝水>知识点,希望能帮助大家更好的复习所学的知识. [原文]乌鸦喝水 一只乌鸦口渴了,到处找水喝.乌鸦看见 ...

  7. Java构造方法——乌鸦喝水场景描述

    Java构造方法--乌鸦喝水场景描述 1.场景简介: 2.对象分析 3. 对象创建 3.1 构造方法 3.2 类的创建 4.主方法调用以及结果 5. 总结 上次博客中学习了类与对象,这次便用其来描述一 ...

  8. 用matlab作乌鸦喝水,仿真程序动画作品--乌鸦喝水

    %作者:070408418 clear h1=figure(1); axis([0 30 0 35]);%建立坐标轴 axis off; xxx1=10; yyy1=36; aac='乌鸦要喝水'; ...

  9. “乌鸦喝水”是寓言吗?

    昨天看到一个报道:黑色的乌鸦真的会用工具把瓶子里的虫子吃到嘴,虽然不是去喝水,但是它能用小石子去升高瓶子里的水,最终吃到虫子.这简直是奇迹. 从<动物世界>里曾看到乌鸦用小树枝把洞里的虫子 ...

最新文章

  1. BIOS不识别linux,linux – 在BIOS中启用VT但KVM无法检测到
  2. C#程序实现动态调用DLL的研究(转)
  3. .NET Core 使用Dapper 操作MySQL
  4. python中newfile是干嘛用的_python 文件操作方法
  5. python编程语言继承_python应用:学习笔记(Python继承)
  6. jQuery ajax发送POST、JS url跳转、console用法
  7. system 函数被废除的替代方法
  8. cdh集群linux命令,CDH集群中,服务器启动spark2-shell命令行注意事项
  9. 【Python】绘制二维散点图
  10. Oracle 19c 新特性:Schema Only Account详解
  11. 四面轻松突围!我是如何斩获高级运维开发一职的?
  12. 【渝粤教育】国家开放大学2018年秋季 8181-22T (1)老年保健按摩 参考试题
  13. 老罗Android开发视频教程 打包下载地址,收集起来,给大家下载
  14. docker安装redis【网易镜像方式】
  15. OpenCv学习篇——图像中值滤波算法
  16. 想了解直播系统开发用什么语言?
  17. Android免root查看数据库内容
  18. win10的开机启动目录(文件夹)位置
  19. 淘宝客评论粉引流玩法介绍(二)
  20. Python使用嵌套循环实现图像处理算法

热门文章

  1. ION to SMMU
  2. 用连接去创造,研发不再成为老大难
  3. 微信小程序自动保留空格换行
  4. python 加权随机算法_python的random模块及加权随机算法的python实现方法
  5. linux 创建线程 execvp,execvp使用实例
  6. IDEA 离线安装lombok插件
  7. GIT 修改用户名和密码
  8. C++多线程启动、暂停、继续与停止
  9. 自学编程的人,90%以上都会掉进这些坑,避开这些误区能提高N倍学习效率
  10. A040_SpringMVC进阶_JSON