[题解] 春荔(cut) | 贪心
题目大意
有一个长度为 \(n\) 的非负整数序列 \(a_i\),每次可以选择一段区间减去 \(1\),要求选择的区间长度 \(\in[l,r]\),问最少多少次把每个位置减成 \(0\)。
不保证有解,\(1 \leq l \leq r \leq n \leq 10^6,\ r - l + 1 \geq \lceil \frac{n}{2} \rceil,\ 0 \leq a_i \leq 10^9\)。
解题思路
首先由于每次是对一段区间操作,考虑先差分原序列得到 \(c_i=a_i-a_{i-1}(i\in[1,n+1])\)。
先从费用流的角度考虑。
源往正权点连权值的流量,负权点往汇连权值的流量,一个可操作区间则表示为,将 \(i\) 与 \(\in[i+l,i+r]\) 中的点连流量为 INF,费用为 \(1\) 的边。
跑最小费用最大流。没流满则无解,否则费用即要求的答案。
怎么优化呢,考虑到这题有个特殊性质 \(\ r - l + 1 \geq \lceil \frac{n}{2} \rceil\),也就是说,对于任意满足 \(j>i+r\) 的位置,也只需要 \(2\) 的费用即可从 \(i\) 到 \(j\) 流 \(1\) 的流量。
于是就贪心地考虑,对于正权点 \(i\) ,先对于只要 \(1\) 的费用的位置从后往前尽量流,然后再流费用为 \(2\) 的位置,如果有正权点或者负权点最后没有满流,就无解。
int main(){
read(n), read(l), read(r); lfor(i, 1, n) read(a[i]);
lfor(i, 1, n + 1) c[i] = a[i] - a[i - 1];
rfor(i, n + 1, 1){
if(c[i] < 0) Q.push_front(i);
else if(c[i] > 0){
while(!Q.empty() && c[i]){
int x = Q.back(), det = min(c[i], -c[x]);
c[i] -= det, c[x] += det, Ans += det;
if(!c[x]) Q.pop_back();
}
if(c[i] > sum){ puts("-1"); return 0; }
Ans += c[i] * 2, sum -= c[i], c[i] = 0;
}
while(!Q.empty() && i + r == Q.back()) sum -= c[Q.back()], Q.pop_back();
}
if(Q.size() || sum){ puts("-1"); return 0; }
printf("%lld\n", Ans);
return 0;
}
// sto zhy12138 orz
[题解] 春荔(cut) | 贪心的更多相关文章
- 洛谷3月月赛div2 题解(模拟+数学+贪心+数学)
由于本人太蒻了,div1的没有参加,胡乱写了写div2的代码就赶过来了. T1 苏联人 题目背景 题目名称是吸引你点进来的. 这是一道正常的题,和苏联没有任何关系. 题目描述 你在打 EE Round ...
- Find the Maximum - 题解【思维,贪心】
题面 这是2022年ICPC昆明站的F题.在赛场上,我一开始敲了个贪心,但是出锅了,改敲树形DP,但是时间来不及了.在队友的提醒下补过了这个题,知道解法的我发现我就是个纯纯的老坛-- 原题链接在牛客网 ...
- leetcode1546题解【前缀和+贪心】
leetcode1546.和为目标值的最大数目不重叠非空子数组数目 题目链接 算法 前缀和+贪心 时间复杂度O(n). 1.对nums数组求前缀和: 2.在求前缀和过程中将前缀和sum插入到set集合 ...
- luogu P1552 [APIO2012]派遣 题解--可并堆/贪心
题目链接: https://www.luogu.org/problemnew/show/P1552 分析: 一开始愣是没看懂题,后面发现就是你要找一个树上点集使得各点权值之和小于\(M\),并且找一个 ...
- 【题解】洛谷P1315 [NOIP2011TG] 观光公交(前缀和+贪心)
次元传送门:洛谷P1315 思路 思路大概想到了 可是代码实现却没想到 所以参考题解了 D2T3的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...
- poj 3069 Saruman's Army 贪心 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=3069 题解 题目可以考虑贪心 尽可能的根据题意选择靠右边的点 注意 开始无标记点 寻找左侧第一个没覆盖的点 再来推算既可能靠右的标记点为一 ...
- Minimum Cut(2015沈阳online)【贪心】
Minimum Cut[贪心]2015沈阳online 题意:割最少的边使得图不连通,并且割掉的边中有且仅有一条是生成树的边. 首先,我们选择一条树中的边进行切割,此时仅考虑树上的边集,有两种情况:1 ...
- HDU 1598 find the most comfortable road 并查集+贪心
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000 ...
- HDU 5802 Windows 10 (贪心+dfs)
Windows 10 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5802 Description Long long ago, there was ...
随机推荐
- java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?重写跟重载的区别?
java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况.与此相对,方法覆盖是说子类重新定义了父类的方法.方法覆盖必须有相同的方法名,参数列表和返回类型. 覆盖者可能不会限 ...
- 『现学现忘』Docker基础 — 36、CMD指令和ENTRYPOINT指令的区别
目录 1.CMD指令和ENTRYPOINT指令说明 2.CMD指令只有最后一条生效的原因 3.CMD指令演示 4.ENTRYPOINT指令演示 5.总结 CMD指令和ENTRYPOINT指令作用都是指 ...
- 顺利通过EMC实验(10)
- 顺利通过EMC实验(7)
- 通读Python官方文档之wsgiref(未完成)
wsgirf-WSGI功能及参考实现 源码:Lib/wsgiref Web服务器网关接口(Web Server Gateway Interface, WSGI),是用Python写的一个服务器软件和w ...
- 7分钟理解JS的节流、防抖及使用场景
前言 据说阿里有一道面试题就是谈谈函数节流和函数防抖.糟了,这可触碰到我的知识盲区了,好像听也没听过这2个东西,痛定思痛,赶紧学习学习.here we go! 概念和例子 函数防抖(debounce) ...
- TextView显示html样式的文字
项目需求: TextView显示一段文字,格式为:白雪公主(姓名,字数不确定)向您发来了2(消息个数,不确定)条消息 这段文字中名字和数字的长度是不确定的,还要求名字和数字各自有各自的颜色. 一开始我 ...
- vue日历(纯 js,没用任何插件和组件)
效果图: 代码: <template> <div class="calender"> <div class="top"> ...
- 体验了一把最近很火的开源项目-MASA Blazor
前言 很惭愧直到去年底才接触到Blazor.那什么是Blazor呢?相信大家都看过官方文档的详细说明,另外MASA团队也有不错的说明介绍 .用官方的话说Blazor是一个交互式客户端Web UI的框架 ...
- FastAPI(六十九)实战开发《在线课程学习系统》接口开发--修改密码
之前我们分享了FastAPI(六十八)实战开发<在线课程学习系统>接口开发--用户 个人信息接口开发.这次我们去分享实战开发<在线课程学习系统>接口开发--修改密码 我们梳理一 ...