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='乌鸦要喝水'; ...
- “乌鸦喝水”是寓言吗?
昨天看到一个报道:黑色的乌鸦真的会用工具把瓶子里的虫子吃到嘴,虽然不是去喝水,但是它能用小石子去升高瓶子里的水,最终吃到虫子.这简直是奇迹. 从<动物世界>里曾看到乌鸦用小树枝把洞里的虫子 ...
最新文章
- BIOS不识别linux,linux – 在BIOS中启用VT但KVM无法检测到
- C#程序实现动态调用DLL的研究(转)
- .NET Core 使用Dapper 操作MySQL
- python中newfile是干嘛用的_python 文件操作方法
- python编程语言继承_python应用:学习笔记(Python继承)
- jQuery ajax发送POST、JS url跳转、console用法
- system 函数被废除的替代方法
- cdh集群linux命令,CDH集群中,服务器启动spark2-shell命令行注意事项
- 【Python】绘制二维散点图
- Oracle 19c 新特性:Schema Only Account详解
- 四面轻松突围!我是如何斩获高级运维开发一职的?
- 【渝粤教育】国家开放大学2018年秋季 8181-22T (1)老年保健按摩 参考试题
- 老罗Android开发视频教程 打包下载地址,收集起来,给大家下载
- docker安装redis【网易镜像方式】
- OpenCv学习篇——图像中值滤波算法
- 想了解直播系统开发用什么语言?
- Android免root查看数据库内容
- win10的开机启动目录(文件夹)位置
- 淘宝客评论粉引流玩法介绍(二)
- Python使用嵌套循环实现图像处理算法