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. 全球地区资料json 含中英文 经纬度_爬虫实战(三)使用百度API获取经纬度/地址...
  2. java setcontenttype_response.setContentType()在Java过滤器中重置
  3. mariadb mysql同步_MySQL(Mariadb)主从同步基础
  4. pytorch学习笔记(6):GPU和如何保存加载模型
  5. c 与mysql连接_c与mysql连接和一个简单查询的例子
  6. Java 如何优雅的导出 Excel
  7. FISCO BCOS 最大tps 每秒出块个数 tx_count_limit 区块容量 控制台设置参数 区块大小
  8. 网站ICP备案是什么呢?
  9. 学生搭配问题——C++实现队列
  10. 一次搞懂 Android 音频开发
  11. Microsoft SQL Server 2008 MDX Step by Step中关于MDX Step-by-Step.abf损坏文件的处理
  12. Log4net详细说明
  13. DBMS-关系数据库的设计:范式、函数依赖、分解算法、多值依赖
  14. 如何快速删除Word中的页眉横线?删除页眉横线技巧分享
  15. Atitit 经济学常见的流派 古典主义与凯恩斯主义
  16. GPRS模块的使用与相应SOCKET服务器的搭建
  17. 某m影视apk m3u8地址key值
  18. 原生微信小程序实现tab切换效果demo
  19. 无头浏览器 html5定位,5.2 使用浏览器无头模式执行Selnium脚本
  20. 苹果6手机无信号无服务器,苹果6手机无服务是什么原因

热门文章

  1. Java字符串反转常用的2种方式
  2. mysql workbench 主从_MySQL Workbench 使用教程 (四)
  3. Win10便签设置日历的一周第一天为周日的方法
  4. 信息技术是指利用电子计算机和现代通信手段实现获取、传递、存储、处理、显示、分配信
  5. 5G网络能力开放部署及关键技术方案
  6. tsp java_基于贪心算法求解TSP问题(JAVA)
  7. Request和response的用法总结
  8. 小杜机器人线下店_泡泡玛特线下机器人商店突破1000台!
  9. IOS NDDictionary使用中value遇到no summary如何判断为NULL
  10. 一周 Go World 新鲜事-2019W11