题目链接:BZOJ3441

分析
1. 乍一看, O(NM) O(NM)的暴力模拟,超时。
2. 首先,预处理出每个水缸够喝多少次,然后按照次数从小到大排序。
3. 设 cnt cnt为喝了多少次, cir cir为喝了多少趟, pos pos记录乌鸦的位置,初始为 0 0,用树状数组维护喝了若干次后,区间内还能喝的水缸数量。
4. 当处理第ii个点时,若 i i的次数大于区间[pos+1,n][pos+1,n]的可用水缸数量(设为 sum[pos+1,n] sum[pos+1,n]),那么说明 i i可以撑到这一趟喝完,于是更新cntcnt, cir cir, pos=0 pos = 0,直到 cnt+sum[pos+1,n]>i cnt + sum[pos+1, n] > i的剩余次数或者 cir>=m cir>=m;因为 i i的次数是当前最少的,所以若ii可以撑完一趟,那么后面的水缸都可以。
5. 然后对于 i i剩下的次数,二分一个jj,使 sum[pos+1,j] sum[pos + 1, j]等于 i i剩下的可用次数,即ii可以撑到下一轮的 j j号点被喝的时候,然后更新pos=jpos = j。
6. 因为水缸按可饮用次数排序,那么排在后面的水缸用光的时刻一定比前面的晚,于是 i+1 i+1号水缸可以继承 i <script type="math/tex" id="MathJax-Element-3380">i</script>号水缸用完时乌鸦的状态。
7. 详细见代码。

上代码

#include <bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;int n, m, L;
inline int read() {char ch;int ans = 0, neg = 1;while (ch = getchar(), ch < '0' || ch > '9')if (ch == '-') neg = -1;while (ch >= '0' && ch <= '9')ans = ans * 10 + ch - '0', ch = getchar();return ans * neg;
}int cnt, pos, cir;
struct nodePoi {int id, val;nodePoi() {}nodePoi(int a, int b) : id(a), val(b) {}inline bool operator < (const nodePoi &a) const {return val < a.val;}
} poi[N];int sum[N]; // 用树状数组维护区间内可用水缸数量
#define lowbit(a) (a & (-a))
int query(int a) {int ans = 0;for (int i = a; i; i -= lowbit(i)) ans += sum[i];return ans;
}
void modify(int a, int b) {for (int i = a; i <= n; i += lowbit(i)) sum[i] += b;
}
int findPlc(int a) { // 二分查找i在下一轮能撑到的时候int l = pos, r =  n;int mid, ans = l;while (l <= r) {mid = (l + r) >> 1;if  (query(mid) - query(pos) > a)r =  mid - 1;else l = mid + 1, ans = mid;}return ans;
}
int main() {n = read(), m = read(), L = read();for (int i = 1; i <= n; i++) poi[i] = nodePoi(i, read());for (int i = 1; i <= n; i++) {poi[i].val = (L - poi[i].val) / read() + 1;modify(i, 1);} sort(poi + 1, poi + n + 1);pos = cnt = cir = 0;for (int i = 1; i <= n; i++) {if (poi[i].val < cnt) {modify(poi[i].id, -1); continue;}int tmp;while (cir < m && (tmp = query(n) - query(pos)) + cnt <= poi[i].val)cnt += tmp, cir++, pos = 0; // 一趟一趟的更新if (cir >= m) break;pos = findPlc(poi[i].val - cnt), cnt = poi[i].val;modify(poi[i].id, -1); // 当前桶用完了}printf("%d\n", cnt);return 0;
}

以上

[BZOJ3441]乌鸦喝水相关推荐

  1. Bzoj3441 乌鸦喝水

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

  2. [BZOJ3441] 乌鸦喝水

    正解复杂度 $ O(n*log2(n)) $,然而我打的是 $ O(n*log2(n)*log2(n)) $的. 50分暴力: $ O(n*m) $暴力模拟喝水过程,不再赘述. 100分算法: 这中多 ...

  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. Spring MVC + Mybatis项目搭建
  2. ibatis自动生成插件
  3. 深入理解 Java G1 垃圾收集器--转
  4. 1111 Online Map (30 分)【难度: 一般 / 知识点: Dijkstra最短路】
  5. RFI远程文件包含的漏洞
  6. python干货_python 基础干货 02
  7. vue click事件_Vue.js---实现前后端分离架构中前端页面搭建(二)
  8. Javaweb之session创建销毁问题
  9. Exchange 2010 (四) CAS Array部署
  10. 最后电话挂的才是爱你的
  11. Faiss从入门到实战精通
  12. 中信银行王燕:数据治理在当今银行的作用价值与实战建议
  13. 利用Web of Science创建引文跟踪、检索词跟踪
  14. 远程桌面服务器连接失败,Windows服务器远程桌面连接失败是什么原因
  15. 常用APP签名存档以及获取签名的几种方式介绍
  16. [Windows] ISCSI发起程序实例不存在
  17. SpringBoot在controller返回一个HTML页面
  18. 给ACCESS2003加密码和去掉密码
  19. Android开发之百度地图(soso地图,搜狗地图,阿里云地图)转高德地图经纬度的方法
  20. Directional库的学习记录

热门文章

  1. 贝叶斯优化(深度剖析)
  2. 百度的“平台型AI”野望——从百度智能云的新战略、新架构说起
  3. 把握现在,畅享人生!
  4. 梦想太远,现实太近 2
  5. aix usb_AIX和USB记忆棒
  6. Android 系统提供的主题
  7. css文字在div中,[html][css]让文字在div中居中的方法[转]
  8. 分享几个开源免费的中后台前端框架
  9. 表单title文字两端对齐(2、3、4个字都对齐)
  10. C#使用OpenCV剪切图像中的圆形和矩形