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.我们倡导大众健康生活,培养人们爱喝水的习惯,让每一次喝水,都能产生价值,让人们在喝水的同时,可享受赚钱 ...
随机推荐
- Hibernate-ORM:04.Hibernate中的get()和load()
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配 ...
- THUSC 2018 游记
现在是闭幕式,我坐在西郊宾馆后排,开始写这篇游记. day0 早上从临汾坐火车到北京,12:52左右到了北京. 这次北京的地铁安检没有排成很长的队,但是在买票的时候我惊喜地发现我身上没有零钱--所幸北 ...
- 29、phonegap入门
0. PhoneGap介绍 0.1 什么是PhoneGap? PhoneGap是一个基于HTML.CSS.JS创建跨平台移动应程序的快速开发平台.与传统Web应用不同的是,它使开发者能够利用iPho ...
- iOS-Debug Symbol(调试符号)
Debug Symbol(调试符号) 编译警告 从svn下载下来的文件,到处都是编译警告,看着不爽,找下原因,没想到还是一条大鱼 warning: (i386) /UsersLibrary/Devel ...
- Qt Charts实践
Qt Charts的横空出世标志着QWT,QCustomPlot .....时代的终结,让我们开始使用QtCharts吧 在Qt 5.7.0中已经集成了Qt Charts模块,需要在安装Qt的时候把C ...
- linux学习总结----对象
内置对象: Date new Date() --->系统当前时间 var d=new Date() d.getFullYear() getMonth() getDay() getDate() g ...
- Visual Studio 2013安装包
点击下载
- android问题笔记集
开发工具:android studio2.2 调试:手机直连调试,版本(android6) 问题1: Error:Unable to start the daemon process. This pr ...
- 机器学习 (二) 多变量线性回归 Linear Regression with Multiple Variables
文章内容均来自斯坦福大学的Andrew Ng教授讲解的Machine Learning课程,本文是针对该课程的个人学习笔记,如有疏漏,请以原课程所讲述内容为准.感谢博主Rachel Zhang 的个人 ...
- linux学习(二)——汤哥的推荐书籍
成为一名精通 Linux程序设计的高级程序员一直是不少朋友孜孜以求的目标. 根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows程序员的 1.8 倍.Java 程序员的 2. ...