正解复杂度 $ O(n*log2(n)) $,然而我打的是 $ O(n*log2(n)*log2(n)) $的。

50分暴力:

$ O(n*m) $暴力模拟喝水过程,不再赘述。

100分算法:

这中多过程题其实有个套路就是每次找出最先使状态变化的时刻,对于这个题来说就是找出那一个最先被喝到不能喝。

考虑用线段树维护(S-w[i])/a[i]+1即能喝的最多次数,这样就可以每次 $ O(1) $查出来啦。

设x为最小的次数,那么我们便可以先在 $ O(1) $的复杂度内把x的整圈转出来,代码实现如下:

m-=x/t[1].sum;
ans+=x/t[1].sum*t[1].sum;
x%=t[1].sum;

之后二分查找它的结束位置(因为中间有可能有不能再喝的)

L=pos+1,R=n;
while(L<R)
{int mid=(L+R)>>1;if(query(1,pos+1,mid)>=x) R=mid;else L=mid+1;
}    

(本算法的复杂度瓶颈就是这里)

但是我们发现,有可能根本没有用完所有的喝水次数,所以要再来一圈:

                if(!pos) m--;if(x){L=1,R=n;while(L<R){int mid=(L+R)>>1;if(query(1,pos+1,mid)>=x) R=mid;else L=mid+1;}ans+=query(1,1,L);pos=L%n;}

注意这里m--的条件并不是x还有剩余,而是pos到了0(否则就可以得到WA80的好成绩。。。)

Dele(1,t[1].pos);

最后把这个水瓶删除即可。

关于循环外:

if(m)
{ans+=t[1].sum*(m-1);for(int i=pos+1;i<=n;i++){if(S>=w[i]+a[i]*ans) ans++;}
}

因为有可能下一个水瓶用完是在m轮之后,所以要把m轮转完

最后就可以AC本题啦!在OJ上跑了3000ms(three_D大神跑了400ms)

转载于:https://www.cnblogs.com/AthosD/articles/11373466.html

[BZOJ3441] 乌鸦喝水相关推荐

  1. Bzoj3441 乌鸦喝水

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

  2. [BZOJ3441]乌鸦喝水

    题目链接:BZOJ3441 分析 1. 乍一看, O(NM) O(NM)的暴力模拟,超时. 2. 首先,预处理出每个水缸够喝多少次,然后按照次数从小到大排序. 3. 设 cnt cnt为喝了多少次, ...

  3. bzoj3441: 乌鸦喝水

    前言 今天早上贼颓.. 显示去poj看错了一题,然后poj还炸裂了评测不了.. 然后做这题又看错了,想了半天.. 然后想出一点点东西的时候发现看错题了QAQ 于是一早上就荒废了.. 感觉这是退役的节奏 ...

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

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

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

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

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

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

  7. BZOJ:3441 乌鸦喝水

    bzoj:3441 乌鸦喝水 题目传送门 Description 一只乌鸦在自娱自乐,它在面前放了n个有魔力的水缸,水缸里装有无限的水. 他准备从第1个水缸飞到第n个水缸,共m次.在飞过一个水缸的过程 ...

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

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

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

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

最新文章

  1. Python的range()函数
  2. Git学习笔记07-删除文件
  3. mysql执行计划_mysql的sql执行计划详解
  4. 02_pandas获取数据(指定列获取、[]方式获取、loc函数,at函数, iloc函数 iat函数)
  5. shouldParkAfterFailedAcquire
  6. SAP Spartacus的b2cLayoutConfig
  7. Spring第三篇【Core模块之对象依赖】
  8. linux的文件系统架构
  9. 关于Apache与Nginx的优势比较
  10. ubuntu 在线安装最新交叉编译工具
  11. 网络舆情分析系统具体使用功能及作用详解
  12. vs2013+opencv3.4.3配置安装教程
  13. 关于全站仪自建坐标系知识梳理
  14. 电脑A和电脑B建立通信,这就是网络。IO、中断、缓冲区这都不是研究网络时该关心的事
  15. 电磁波是如何产生的以及分类
  16. 能完成么?马斯克推特宣称特斯拉今年将生产约50万辆电动汽车
  17. Fiddler抓包Android手机https、http教程
  18. 数字孪生应用白皮书_赛迪数字孪生白皮书(2019)
  19. Mac设置屏保后,显示屏保没有立即锁屏
  20. One Piece 海贼王动漫壁纸 Python 爬取!

热门文章

  1. html怎么修改表格行列间距,html表格如何设置间距
  2. 字符串 splice()、split() 和slice()方法
  3. 网络层协议和数据链路层协议
  4. 怎么更改计算机开机用户名和密码,小编详解怎么修改电脑开机密码
  5. 使用cmd命令快速修改电脑密码
  6. springboot整合sse
  7. 【springboot】sse接口
  8. 三角函数 弧度角度转换
  9. VMware 虚拟机安装Linux(Ubuntu)系统教程
  10. PTA 7-40 统计闰年个数