题目大意

有一个长度为 \(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. 使用redis作为django缓存数据库

    1.Redis的Windows版本.打开https://github.com/MSOpenTech/redis/releases下载msi安装包.该版本是64位.安装msi过程中,有个选项是否加入系统 ...

  2. memcached 能接受的 key 的最大长度是多少?

    key 的最大长度是 250 个字符.需要注意的是,250 是 memcached 服务器端内 部的限制,如果您使用的客户端支持"key 的前缀"或类似特性,那么 key(前缀 + ...

  3. idea使用maven工程创建web项目并支持jsp

    主要要再pom文件里面添加依赖: <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> & ...

  4. BMZCTF 端午节就该吃粽子

    端午节就该吃粽子 题目如下让我们访问login.php 然后就一个登录界面查看源码发现index.php 我们直接访问发现没有结果使用伪协议读取 然后我们使用base64解密 <?php err ...

  5. JBOSS 7.1.1上的DB2和Orcale数据库配置

      将IBM DB2和Oracle数据源配置到JBOSS 7.1.1      第1步:  打开Standalone.xml文件将以下代码添加到数据源的子系统中,并根据数据库URL和数据源的用户名和密 ...

  6. clone github代码库很慢,如何提速

    博主,最近在搭建hyperledger fabric的环境,其中有一步就是clone github上的代码,但是在过程中发现clone是真的慢. 为此google了一圈,发一现一个好用的办法: 1.登 ...

  7. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

  8. 北桥芯片(north bridge/host bridge)

    看下上面的图,会比较清晰的认识到北桥芯片所在位置 北桥芯片(North Bridge) 是mother board chipset(主板芯片组) 中起主导作用的最重要的组成部分,也称为主桥(Host ...

  9. python中faker模块的使用

    Faker 安装 pip install Faker 基本使用 from faker import Faker #创建对象,默认生成的数据为为英文,使用zh_CN指定为中文 fake = Faker( ...

  10. Java和JavaScript(函数)参数传递是按值传递还是按引用传递?

    结论:Java和JavaScript的所有(函数)参数传递都是按值传递! 1.什么是函数参数的传递是按引用传递? 什么是引用?这个概念多见于C++中,在C++中,引用解释为变量的别名. 1 #incl ...