CF460C Present
写在前面
- 由于菜,写树状数组写挂了。
- 于是想出了一种不像线段树或树状数组+二分答案那样显然,但是依旧不难想,复杂度比较优秀,代码难度低的做法。
算法思路
外部二分答案,不多解释,稍证明一下单调性:
若把每一次浇水都浇到当前最低的花上,浇水次数越多,花的高度最小值不会变小,满足单调性。
考虑到在某个点被浇的次数只与上一盆水是否为之前某次浇水的终点和这点是否需要继续浇水,以及需要继续浇多少次有关。
那么存一个变量统计当前这个点目前已经被浇了多少次水,设这个变量为 \(x\)。
每当需要浇一次水的时候,假设此时位置是 \(i\),就在 \(i + w\) 的位置打一个数值上等于此次浇水次数相反数的标记。
这样,每当遍历到某个点的时候,先继承上个位置的 \(x\) 并将 \(x\) 加上该点的标记。
再判断 \(a_i + x\) 是否小于二分值 \(lim\),若小于,就浇到这个值,统计次数,打标记。
Tips
- 有的测试点答案很大,二分最大边界开成 \(2\times 10^9\) 足够。
- 如果不特判,标记数组大小要开两倍,不然 \(i + w\) 有会越界。
- 不开
long long见祖宗。
Code
#include<bits/stdc++.h>
#define LL long long
const int Maxn = 1e5 + 5;
const int Maxm = 1e5;
const LL Maxw = 2e9;
using namespace std;
LL a[Maxn];
LL b[Maxn << 1];
int n, m, w;
bool check(LL lim) {
LL total = 0, nowt = 0;
memset(b, 0, sizeof(b));
for(register int i = 1; i <= n; ++i) {
nowt += b[i];
if(a[i] + nowt < lim) {
LL t = lim - (a[i] + nowt);
total += t;
b[i + w] = -t;
nowt = lim - a[i];
}
}
return total <= m;
}
signed main() {
scanf("%d%d%d", &n, &m, &w);
for(register int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
LL l = 0, r = Maxw, mid, ans = -1;
while(l <= r) {
mid = (l + r) >> 1;
if(check(mid)) {
l = mid + 1;
ans = mid;
}
else {
r = mid - 1;
}
}
printf("%lld", ans);
return 0;
}
CF460C Present的更多相关文章
- CF460C Present (二分 + 差分数列)
Codeforces Round #262 (Div. 2) C C - Present C. Present time limit per test 2 seconds memory limit p ...
- 我的刷题单(8/37)(dalao珂来享受切题的快感
P2324 [SCOI2005]骑士精神 CF724B Batch Sort CF460C Present CF482A Diverse Permutation CF425A Sereja and S ...
- 跳转时候提示Attempt to present on while a presentation is in progress
出现这种情况,例如:我在获取相册图片后,直接present到另一个页面,但是上一个页面可能还未dismiss,所以,要在获取相册图片的dismiss方法的complete的block里面写获取图片及跳 ...
- find your present (感叹一下位运算的神奇)
find your present (2) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HTTP Status 400 - Required String parameter 'userName' is not present 错误
HTTP Status 400 - Required String parameter 'userName' is not present 错误 先mark 有时间详细写 参考链接: https:/ ...
- Linux 克隆虚拟机引起的“Device eth0 does not seem to be present, delaying initialization”
虚拟机Vmware上克隆了一个Red Hat Enterprise Linx启动时发现找不到网卡,如下所示,如果你在命令窗口启动网络服务就会遇到"Device eth0 does not s ...
- required string parameter XXX is not present
@RequestParam jQuery调用方式: deleteFile: function(filePath) { return ajax({ method: 'POST', url: '/cm/s ...
- 启动网卡报:Device eth0 does not seem to be present”解决办法
Device eth0 does not seem to be present”解决办法 : 用ifconfig查看发现缺少eth0,只有lo:用ifconfig -a查看发现多出了eth1的信息. ...
- jQuery 跨域访问的三种方式 No 'Access-Control-Allow-Origin' header is present on the reque
问题: XMLHttpRequest cannot load http://v.xxx.com. No 'Access-Control-Allow-Origin' header is present ...
随机推荐
- 处理xls文件
package com.cn.peitest.excel; import java.io.File; import java.io.FileInputStream; import java.io.Fi ...
- 扫盲:Kotlin 的泛型
引子 相信总是有很多同学,总是在抱怨泛型无论怎么学习,都只是停留在一个简单使用的水平,所以一直为此而备受苦恼. Kotlin 作为一门能和 Java 相互调用的语言,自然也支持泛型,不过 Kotlin ...
- 关于django的坑(一)
关于django orm 的坑: 关于设置数据库表自动更新 django的orm关于更新数据库的方法有update和save两种方法.想要表中自动更新需要一下几个条件: 使用 DateTimeFiel ...
- WebService的简单Demo
看到招聘要求要会WebService.就百度看看是如何实现的. 测试了一下.发现使用webservice开发方法,好像方便了不少.服务端开发者只需要关注服务端就可以了. Demo结构 IWebServ ...
- cmake - 可执行文件
1.生成可执行文件 add_executable(hello xxx.cpp xxxxx.cpp) ##根据文件xxx.cpp和xxxx.cpp生成可执行文件hello,但是这两个可执行文件如果依赖其 ...
- OpenSUSE 使用基础
OpenSUSE OpenSUSE 是一个基于 RPM 的发行版,这和 RHEL/CentOS 一致. 但是它的官方包管理器是专有的 zypper,挺好用的,软件也很新. 本文以 OpenSUSE L ...
- 基于Python的接口自动化实战-基础篇之pymysql模块操作数据库
引言 在进行功能或者接口测试时常常需要通过连接数据库,操作和查看相关的数据表数据,用于构建测试数据.核对功能.验证数据一致性,接口的数据库操作是否正确等.因此,在进行接口自动化测试时,我们一样绕不开接 ...
- sparkStreaming实时数据处理的优化方面
1.并行度 在direct方式下,sparkStreaming的task数量是等于kafka的分区数,kakfa单个分区的一般吞吐量为10M/s 常规设计下:kafka的分区数一般为broken节点的 ...
- 不吹不黑,jupyter lab 3.0客观使用体验
1 简介 jupyter lab于近期发布了其具有里程碑意义的3.0版本,随之带来的一些重要新特性,想必广大读者朋友已在各大公众号所翻译转载的jupyter lab团队官方介绍文章中知晓了很多. 图1 ...
- Solon rpc 之 SocketD 协议 - 单链接双向RPC模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...