[BZOJ 3441]乌鸦喝水

2023-10-24 04:10
文章标签 喝水 bzoj 乌鸦 3441

本文主要是介绍[BZOJ 3441]乌鸦喝水,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3441: 乌鸦喝水

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 374  Solved: 148
[Submit][Status][Discuss]

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。

HINT

 

 2016.7.8重设时限,未重测!

 

Source

By lll6924 at “酱油杯noi考后欢乐赛”

题解

首先计算出每个水缸里的水能喝几次, 然后推出一个结论: 水少的水缸如果喝了 $n$ 次, 则水比它多的水缸也至少喝了 $n$ 次.

继续推还可以推出: 如果某一轮从某个水缸一直到结尾还能喝 $k$ 次, 而且该还能喝的次数 $\geq k$ , 则水比该水缸多的水缸不会在本轮被喝完.

然后我们就可以把水缸按照还可以喝的次数升序排序, 树状数组维护查询某水缸到结尾还能喝几次, 贪心处理即可

参考代码

GitHub

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <iostream>
  5 #include <algorithm>
  6 
  7 const int MAXN=1e6+10;
  8 
  9 int n;
 10 int m;
 11 int x;
 12 int r;
 13 int ans;
 14 int cnt;
 15 int last;
 16 int c[MAXN];
 17 
 18 std::pair<int,int> a[MAXN];
 19 
 20 int Query(int);
 21 int LowBit(int);
 22 void Add(int,int);
 23 void Initialize();
 24 int BinarySearch(int);
 25 
 26 int main(){
 27     Initialize();
 28     for(int i=1;i<=cnt;i++){
 29         if(a[i].first<ans){
 30             Add(a[i].second,-1);
 31         }
 32         else{
 33             int tmp=Query(cnt)-Query(last);
 34             while(r<m&&ans+tmp<=a[i].first){
 35                 r++;
 36                 ans+=tmp;
 37                 last=0;
 38                 tmp=Query(cnt)-Query(last);
 39             }
 40             if(r>=m)
 41                 break;
 42             int pos=BinarySearch(a[i].first-ans);
 43             ans=a[i].first;
 44             last=pos;
 45             Add(a[i].second,-1);
 46         }
 47     }
 48     printf("%d\n",ans);
 49     return 0;
 50 }
 51 
 52 int BinarySearch(int x){
 53     int ans=last,l=last,r=cnt;
 54     while(l<=r){
 55         int mid=(l+r)>>1;
 56         if(Query(mid)-Query(last)<=x){
 57             ans=mid;
 58             l=mid+1;
 59         }
 60         else
 61             r=mid-1;
 62     }
 63     return ans;
 64 }
 65 
 66 void Initialize(){
 67     int tmp;
 68     scanf("%d%d%d",&n,&m,&x);
 69     for(int i=1;i<=n;i++){
 70         scanf("%d",&a[i].first);
 71         a[i].second=i;
 72     }
 73     for(int i=1;i<=n;i++){
 74         scanf("%d",&tmp);
 75         a[i].first=(x-a[i].first)/tmp+1;
 76     }
 77     for(int i=1;i<=n;i++){
 78         if(a[i].first!=0){
 79             a[++cnt]=a[i];
 80             Add(a[i].second,1);
 81         }
 82     }
 83     std::sort(a+1,a+1+cnt);
 84 }
 85 
 86 void Add(int i,int x){
 87     while(i<=n){
 88         c[i]+=x;
 89         i+=LowBit(i);
 90     }
 91 }
 92 
 93 int Query(int x){
 94     int ans=0;
 95     while(x>0){
 96         ans+=c[x];
 97         x-=LowBit(x);
 98     }
 99     return ans;
100 }
101 
102 inline int LowBit(int x){
103     return x&-x;
104 }
Backup

 

 

转载于:https://www.cnblogs.com/rvalue/p/7658357.html

这篇关于[BZOJ 3441]乌鸦喝水的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/272593

相关文章

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

BZOJ 2440 2301 莫比乌斯应用

http://www.lydsy.com/JudgeOnline/problem.php?id=2440 Description 小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。  这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌

BZOJ 3732: Network(最小生成树+倍增)

题目链接 题意:给出一个图,每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少 很明显最终查询的边一定是在最小生成树里面的,先跑出最小生成树,然后,可以树链剖分,也可以使用倍增来计算 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

《死侍与金刚狼》重回连续3天位居北美票房榜首《眨眼两次》表现平平 《乌鸦》票房惨淡

《死侍与金刚狼》连续3天位居榜首 全球票房12.11亿美元 佐伊·克拉维茨 (Zoë Kravitz) 的导演处女作《眨眼两次》 (Blink Twice) 以 730 万美元的票房排名第四;《乌鸦》未能大获成功。 娜奥米·阿基和查宁·塔图姆在《眨眼两次》中 随着电影旺季的结束, 夏末票房的新玩家们艰难地找到自己的立足点。 续拍影片《死侍与金刚狼》、《异形:罗慕

秋季喝水的正确姿势,快来get√!

处暑已过,暑气渐渐消退,昼夜温差逐渐增大,凉爽的秋天就要来了。 俗话说秋高气爽,形容秋天是一个干爽舒适的季节。但干爽背后还隐藏着一个大问题——干燥。 秋天空气中的湿度降低,不仅会让人感到皮肤干燥、口干舌燥,还可能导致身体脱水,影响健康。干燥的环境容易引发呼吸道疾病,如咳嗽、哮喘等。 对抗外部干燥,可以使用加湿器来增加室内湿度。在室内摆放一些植物,也能有效提高空气湿度,同时还能净化

BZOJ 2038 小Z的袜子(hose) (莫队离线)

题目地址:BZOJ 2038 裸的莫队算法。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>#in

BZOJ 2152 聪聪可可 (树上点分治)

题目地址:BZOJ 2152 找有多少对权值和为3的倍数的点。最简单的点分治。 代码如下: #include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#incl

BZOJ 3530 数数【AC自动机+数位dp】

[Sdoi2014]数数 简单数位dp+简单AC自动机 反正数位DP是队友写的 AC自动机要记录两个值,一个是是否为一个串的结束,即不合法状态,一个是前缀零的情况。 // whn6325689// Mr.Phoebe// http://blog.csdn.net/u013007900#include <algorithm>#include <iostr