Bzoj3441 乌鸦喝水
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 258 Solved: 97
Description
Input
Output
Sample Input
15 14 13 12 12
1 1 1 1 1
Sample Output
【数据范围】
100%的数据,0<n≤100000,0<m≤100000,0<x≤2000000000,0<Wi≤2000000000,0<Ai≤200。
HINT
2016.7.8重设时限,未重测!
Source
脑洞题
应该算贪心+二分吧,思路挺神奇的
乌鸦喝水是“能喝的时候一定喝”的,所以和DP决策没关系。
直接模拟的复杂度为$O(nm)$
把每个水缸按照可以喝水的次数(即喝多少次水,水位下降到喝不到)由小到大排序,依次处理。
显然如果前面的水缸能喝n次,后面的水缸至少也能喝n次,这个性质十分有用。
由上面这句话可以推出:如果乌鸦从当前位置飞到队伍末会经过k个能喝的水缸,而当前水缸还能喝的次数x>=k,那么之后的水缸也不会在这一轮被喝空。
1、枚举每一个水缸开始(在枚举到该水缸的时候,前面剩余次数更小的水缸已经被喝完。或者可以理解为,舍弃前面的缸,贪心喝这个。)
2、用树状数组维护水缸的ID,查询从当前水缸的ID到(原先的)第n个水缸还有多少个能喝的水缸,如果当前缸的剩余次数>=剩余缸数,直接更新次数并跳到下一轮。
3、在数次2操作后,当前缸的剩余次数<=剩余缸数,此时在树状数组上二分“余数”,即喝到又一轮的某位置时,当前缸没水了。
4、将当前缸标为空,枚举下一个水缸。
表面看着复杂度高,实际上喝水的次数不会超过最多的那个缸能喝的次数(因为每次喝水都是所有缸水位一起下降的),同时,模拟操作的次数不会超过m(最多喝m轮),复杂度可以接受。
/*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,X,N;
int t[mxn];
void add(int x,int v){
while(x<=N){t[x]+=v; x+=x&-x;}return;
}
int que(int x){
int res=;
while(x){res+=t[x];x-=x&-x;}
return res;
}
struct node{
int cnt,id;
bool operator < (node b)const{return cnt<b.cnt;}
}a[mxn];
int cir,last=;
int tot=;
int find(int x){
int res=last,l=last,r=n;
while(l<=r){
int mid=(l+r)>>;
if(que(mid)-que(last)<=x){
res=mid;
l=mid+;
}
else r=mid-;
}
return res;
}
void solve(){
for(int i=;i<=n;i++){
if(a[i].cnt<tot){
add(a[i].id,-);
continue;
}
while(cir<m && tot+(que(n)-que(last))<=a[i].cnt){
int tmp=que(n)-que(last);
cir++;//又能喝一轮
tot+=tmp;
last=;//从头开始
}
if(cir>=m)break;
int ed=find(a[i].cnt-tot);
// tot+=ed-last; //wrong
tot=a[i].cnt;
last=ed;
add(a[i].id,-);
}
return;
}
int main(){
int i,j,w;
N=n=read();m=read();X=read();
for(i=;i<=n;i++)
a[i].cnt=read(),a[i].id=i;
for(i=;i<=n;i++){
w=read();
a[i].cnt=(X-a[i].cnt)/w+;
}
w=;
for(i=;i<=n;i++)
if(a[i].cnt){
a[++w]=a[i];
add(a[i].id,);
}
n=w;
sort(a+,a+n+);
solve();
printf("%d\n",tot);
return ;
}
Bzoj3441 乌鸦喝水的更多相关文章
- 【bzoj3441】乌鸦喝水
Source bzoj3441 Hint 请先思考后再展开 按被删除的顺序考虑每个点,然后按照题意模拟 Solution 请先思考后再展开 被删除的顺序一定是按照[能被操作的次数]为第一关键字,位置作 ...
- [BZOJ 3441]乌鸦喝水
3441: 乌鸦喝水 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 374 Solved: 148[Submit][Status][Discuss] ...
- BZOJ:3441 乌鸦喝水
bzoj:3441 乌鸦喝水 题目传送门 Description 一只乌鸦在自娱自乐,它在面前放了n个有魔力的水缸,水缸里装有无限的水. 他准备从第1个水缸飞到第n个水缸,共m次.在飞过一个水缸的过程 ...
- 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏
T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...
- 「模拟8.18」字符串(卡特兰数)·乌鸦喝水(树状数组,二分)·所驼门王的宝藏(tarjan,拓扑)
最近好颓啊,所以啥都做不出来 简单说一下这次考试,分机房了,还分不同考卷,果然我还是留在二机房的蒟蒻, 大概也只有这样的简单题,才能勉强水个rank 3吧........ 其实不必管在哪个机房,努力便 ...
- NOIP模拟测试25「字符串·乌鸦喝水·所陀门王的宝藏(陀螺王)」
字符串 题解 没看出catalan怎么办 dp打表啊! 考虑大力dp拿到30分好成绩!顺便收获一张表 打表发现$C_{n+m}^{m}-C_{n+m}^{m-1}$ 仔细观察然后发现其实就是之前的网格 ...
- Beta Round #9 (酱油杯noi考后欢乐赛)乌鸦喝水
题目:http://www.contesthunter.org/contest/Beta%20Round%20%EF%BC%839%20%28%E9%85%B1%E6%B2%B9%E6%9D%AFno ...
- FZYZOJ-1569 喝水
P1569 -- 喝水 时间限制:2000MS 内存限制:131072KB 状态:Accepted 标签: 无 无 无 Description GH的N个妹子要喝水, ...
- 推荐一款健康App 多喝水,引领全民时尚喝水生活习惯
推荐一款健康App 多喝水,引领全民时尚喝水生活习惯 1 介绍 多喝水,一款鼓励大众喝水的APP.我们倡导大众健康生活,培养人们爱喝水的习惯,让每一次喝水,都能产生价值,让人们在喝水的同时,可享受赚钱 ...
随机推荐
- C# List集合去重操作注意点
今天调试代码时发现list的distinct方法在对引用类型操作时并没有去重,后来查阅资料发现list去重操作对象集合时比较的是对象的一个个引用地址, 因为集合里的对象都是一个个单独的实例,所以并不会 ...
- MySQL数据库服务器逐渐变慢分析与解决
一.检查系统的状态 通过操作系统的一些工具检查系统的状态,比如CPU.内存.交换.磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲,这也可能不是一个正常的状态,因为cpu可 ...
- DO NOT BELIEVE HIS LIES 游戏随笔
这游戏是我大学的一个基友推荐的,好吧,感觉被他坑了··· 解谜游戏~慢慢来玩玩··· 恩,就是下面红色圈圈画起来的这个家伙. #1 第一关 好吧,界面上也没啥可聊的,上面写了一行字,THE FIRST ...
- 「日常训练」「小专题·USACO」 Ski Course Design (1-4)
题目 以后补 分析 mmp这题把我写蠢哭了 我原来的思路是什么呢? 每轮找min/max,然后两个决策:升min/降max 像这样子dfs找最优,然后花式剪枝 但是一想不对啊,这才1-4,哪有那么复杂 ...
- ASP NET Core --- 资源塑形, HATEOAS, Media Type
参照 草根专栏- ASP.NET Core + Ng6 实战:https://v.qq.com/x/page/d07652pu1zi.html 一.Get返回资源塑形 1.添加集合塑形Enumerab ...
- [译]在SQL查询中如何映射(替换)查询的结果?
问题来源: https://stackoverflow.com/questions/38567366/mapping-values-in-sql-select 有一个表格,就称它Plant,它有三列: ...
- A1
It’s surprising what you can find at the end of your garden. Wild flowers... and even smaller yet, i ...
- A - 移动的骑士
A - 移动的骑士 Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem Desc ...
- PAT 1087 有多少不同的值
https://pintia.cn/problem-sets/994805260223102976/problems/1038429191091781632 当自然数 n 依次取 1.2.3.…….N ...
- 配置Mac自带的Apache http服务器
Mac系统是自带Apache,所以很方便我们做一些http测试. 我可以先启动默认的服务器 $ sudo apachectl start 在浏览器打开:http://localhost 将会看到下面信 ...