BZOJ:3441 乌鸦喝水
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+=scnt 把喝了的井的次数加上。
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 乌鸦喝水相关推荐
- bzoj 3441: 乌鸦喝水(说实话有生之年没有见过这么难的模拟)
3441: 乌鸦喝水 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 311 Solved: 117 [Submit][Status][Discus ...
- NOIP模拟测试25「字符串·乌鸦喝水·所陀门王的宝藏(陀螺王)」
字符串 题解 没看出catalan怎么办 dp打表啊! 考虑大力dp拿到30分好成绩!顺便收获一张表 打表发现$C_{n+m}^{m}-C_{n+m}^{m-1}$ 仔细观察然后发现其实就是之前的网格 ...
- 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏
T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...
- Bzoj3441 乌鸦喝水
Time Limit: 20 Sec Memory Limit: 128 MB Submit: 258 Solved: 97 Description [题目背景] 一只乌鸦在自娱自乐,它在面前放了 ...
- 乌鸦喝水(异常处理版 _)
由于都没有人发 索性便发出来吧..不过UT没写好 >_< [要求] 改写乌鸦喝水案例,扩展场景:乌鸦面对一堆大小不一的石头,且其中可能有伪装成石头的小炸药丸,面对的瓶子可能是普通的瓶子,也 ...
- 心田花开:一年级语文《乌鸦喝水》教案解析及练习题
小学阶段是语文学习的起步阶段,掌握所学的基础知识是非常必要的.心田花开分享了<乌鸦喝水>知识点,希望能帮助大家更好的复习所学的知识. [原文]乌鸦喝水 一只乌鸦口渴了,到处找水喝.乌鸦看见 ...
- Java构造方法——乌鸦喝水场景描述
Java构造方法--乌鸦喝水场景描述 1.场景简介: 2.对象分析 3. 对象创建 3.1 构造方法 3.2 类的创建 4.主方法调用以及结果 5. 总结 上次博客中学习了类与对象,这次便用其来描述一 ...
- 用matlab作乌鸦喝水,仿真程序动画作品--乌鸦喝水
%作者:070408418 clear h1=figure(1); axis([0 30 0 35]);%建立坐标轴 axis off; xxx1=10; yyy1=36; aac='乌鸦要喝水'; ...
- “乌鸦喝水”是寓言吗?
昨天看到一个报道:黑色的乌鸦真的会用工具把瓶子里的虫子吃到嘴,虽然不是去喝水,但是它能用小石子去升高瓶子里的水,最终吃到虫子.这简直是奇迹. 从<动物世界>里曾看到乌鸦用小树枝把洞里的虫子 ...
最新文章
- 全球地区资料json 含中英文 经纬度_爬虫实战(三)使用百度API获取经纬度/地址...
- java setcontenttype_response.setContentType()在Java过滤器中重置
- mariadb mysql同步_MySQL(Mariadb)主从同步基础
- pytorch学习笔记(6):GPU和如何保存加载模型
- c 与mysql连接_c与mysql连接和一个简单查询的例子
- Java 如何优雅的导出 Excel
- FISCO BCOS 最大tps 每秒出块个数 tx_count_limit 区块容量 控制台设置参数 区块大小
- 网站ICP备案是什么呢?
- 学生搭配问题——C++实现队列
- 一次搞懂 Android 音频开发
- Microsoft SQL Server 2008 MDX Step by Step中关于MDX Step-by-Step.abf损坏文件的处理
- Log4net详细说明
- DBMS-关系数据库的设计:范式、函数依赖、分解算法、多值依赖
- 如何快速删除Word中的页眉横线?删除页眉横线技巧分享
- Atitit 经济学常见的流派 古典主义与凯恩斯主义
- GPRS模块的使用与相应SOCKET服务器的搭建
- 某m影视apk m3u8地址key值
- 原生微信小程序实现tab切换效果demo
- 无头浏览器 html5定位,5.2 使用浏览器无头模式执行Selnium脚本
- 苹果6手机无信号无服务器,苹果6手机无服务是什么原因
热门文章
- Java字符串反转常用的2种方式
- mysql workbench 主从_MySQL Workbench 使用教程 (四)
- Win10便签设置日历的一周第一天为周日的方法
- 信息技术是指利用电子计算机和现代通信手段实现获取、传递、存储、处理、显示、分配信
- 5G网络能力开放部署及关键技术方案
- tsp java_基于贪心算法求解TSP问题(JAVA)
- Request和response的用法总结
- 小杜机器人线下店_泡泡玛特线下机器人商店突破1000台!
- IOS NDDictionary使用中value遇到no summary如何判断为NULL
- 一周 Go World 新鲜事-2019W11