题目大意

有一个长度为 \(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) | 贪心的更多相关文章

  1. 洛谷3月月赛div2 题解(模拟+数学+贪心+数学)

    由于本人太蒻了,div1的没有参加,胡乱写了写div2的代码就赶过来了. T1 苏联人 题目背景 题目名称是吸引你点进来的. 这是一道正常的题,和苏联没有任何关系. 题目描述 你在打 EE Round ...

  2. Find the Maximum - 题解【思维,贪心】

    题面 这是2022年ICPC昆明站的F题.在赛场上,我一开始敲了个贪心,但是出锅了,改敲树形DP,但是时间来不及了.在队友的提醒下补过了这个题,知道解法的我发现我就是个纯纯的老坛-- 原题链接在牛客网 ...

  3. leetcode1546题解【前缀和+贪心】

    leetcode1546.和为目标值的最大数目不重叠非空子数组数目 题目链接 算法 前缀和+贪心 时间复杂度O(n). 1.对nums数组求前缀和: 2.在求前缀和过程中将前缀和sum插入到set集合 ...

  4. luogu P1552 [APIO2012]派遣 题解--可并堆/贪心

    题目链接: https://www.luogu.org/problemnew/show/P1552 分析: 一开始愣是没看懂题,后面发现就是你要找一个树上点集使得各点权值之和小于\(M\),并且找一个 ...

  5. 【题解】洛谷P1315 [NOIP2011TG] 观光公交(前缀和+贪心)

    次元传送门:洛谷P1315 思路 思路大概想到了 可是代码实现却没想到 所以参考题解了 D2T3的贪心果然有难度 我们考虑在每次用加速器有两种情况 到下一个点还需要等待:以后的时间就不再影响了 到下一 ...

  6. poj 3069 Saruman's Army 贪心 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=3069 题解 题目可以考虑贪心 尽可能的根据题意选择靠右边的点 注意 开始无标记点 寻找左侧第一个没覆盖的点 再来推算既可能靠右的标记点为一 ...

  7. Minimum Cut(2015沈阳online)【贪心】

    Minimum Cut[贪心]2015沈阳online 题意:割最少的边使得图不连通,并且割掉的边中有且仅有一条是生成树的边. 首先,我们选择一条树中的边进行切割,此时仅考虑树上的边集,有两种情况:1 ...

  8. HDU 1598 find the most comfortable road 并查集+贪心

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000 ...

  9. HDU 5802 Windows 10 (贪心+dfs)

    Windows 10 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5802 Description Long long ago, there was ...

随机推荐

  1. react核心?

    虚拟DOM, Diff算法, 遍历key值 react-dom: 提供了针对DOM的方法,比如:把创建的虚拟DOM,渲染到页面上 或 配合ref来操作DOM react-router

  2. 什么是bean的自动装配?

    Spring 容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作.

  3. (转载)MySQL删除所有表的外键约束、禁用外键约束

    其实如果想删除所有表可以直接如下操作: 在navicat中直接选中所有表,然后右键删除表即可,会有提示,一路确定,就会先删掉没有外键的表和字表,只要一路确定,删几批就把表都删完了,并不算太麻烦. 转: ...

  4. 为什么 redis 需要把所有数据放到内存中?

    答Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数 据写入磁盘.所以 redis 具有快速和数据持久化的特征.如果不将数据放在内存中, 磁盘 I/O 速度为严重影响 redi ...

  5. centos7 环境安装rabbitmq 集群

    继上一篇https://www.cnblogs.com/drafire/p/10062891.html ,这篇博客继续介绍centos 7下安装rabbitmq的集群. 今天在公司搞了一天的rabbi ...

  6. HMS Core定位服务在生活服务类App中可以自动填写收货地址啦

    在涉及团购.外卖.快递.家政.物流.搬家等生活服务类的App.小程序中,填写收货地址是用户高频使用的功能.这一功能通常采取让用户手动填写的解决方案,例如上下拉动选择浙江省-->杭州市--> ...

  7. (stm32f103学习总结)—DS18B20

    一. DS18B20简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式.主要根据应用场合的不同而改变其外观.封装后的DS18B20可用于电缆 ...

  8. Numpy怎样给数组增加一个维度

    Numpy怎样给数组增加一个维度 背景:很多数据计算都是二维或三维的,对于一维的数据输入为了形状匹配,经常需升维变成二维 需要:在不改变数据的情况下,添加数组维度:(注意观察这个例子,维度变了,但数据 ...

  9. 走一步再走一步,揭开co的神秘面纱

    前言 原文地址 源码地址 了解co的前提是已经知晓generator是什么,可以看软大神的Generator 函数的语法,co是TJ大神写的能够使generator自动执行的函数库,而我们熟知的koa ...

  10. 【零碎小bug系列】安卓开发是遇到空指针异常java.lang.NullPointerException: Attempt to invoke...

    安卓开发是遇到空指针异常 java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable ...