题目链接:洛谷

题目大意:【题意翻译已经够直白了】


首先,相信大家一开始都是想去直接dp,但是发现复杂度不对。

于是我们考虑一个黑科技:模拟费用流(相信大部分人看见数据范围就绝对不会想到费用流)

我们考虑进行拆点,设i->i':(1,a[i]),i'->i+1:(1,0),而且总流量$\leq k$,然后就跑最大费用最大流。

这显然会$T$成sb,不过这个图比较简单,我们可以考虑手玩一下。

然后就发现每次的增广路就是这个区间里的最大和的子段对应的路径,然后再把这个最大和的子段里面所有数取相反数(反向边)。

然后就可以用线段树维护,这个线段树需要以下操作。

1.单点修改

2.对于区间[l,r],先找出这个区间的最大和的子段,然后把这个子段取相反数。

不过码量让人想哭。。。(好不容易调出来,纪念一下。

 #include<bits/stdc++.h>
#define Rint register int
using namespace std;
const int N = ;
struct Node {
int L, R, sum, maxv, maxl, maxr, minv, minl, minr, lmax, lmaxid, lmin, lminid, rmax, rmaxid, rmin, rminid;
bool rev;
inline Node(int pos = , int val = ){
L = R = maxl = maxr = minl = minr = lmaxid = lminid = rmaxid = rminid = pos;
sum = maxv = minv = lmax = lmin = rmax = rmin = val;
rev = false;
}
} seg[N << ], q[];
inline Node merge(const Node &a, const Node &b){
Node now;
now.L = a.L; now.R = b.R;
now.sum = a.sum + b.sum;
if(a.lmax >= a.sum + b.lmax) now.lmax = a.lmax, now.lmaxid = a.lmaxid;
else now.lmax = a.sum + b.lmax, now.lmaxid = b.lmaxid;
if(a.lmin <= a.sum + b.lmin) now.lmin = a.lmin, now.lminid = a.lminid;
else now.lmin = a.sum + b.lmin, now.lminid = b.lminid;
if(b.rmax >= b.sum + a.rmax) now.rmax = b.rmax, now.rmaxid = b.rmaxid;
else now.rmax = b.sum + a.rmax, now.rmaxid = a.rmaxid;
if(b.rmin <= b.sum + a.rmin) now.rmin = b.rmin, now.rminid = b.rminid;
else now.rmin = b.sum + a.rmin, now.rminid = a.rminid;
now.maxv = a.rmax + b.lmax; now.maxl = a.rmaxid; now.maxr = b.lmaxid;
if(now.maxv < a.maxv) now.maxv = a.maxv, now.maxl = a.maxl, now.maxr = a.maxr;
if(now.maxv < b.maxv) now.maxv = b.maxv, now.maxl = b.maxl, now.maxr = b.maxr;
now.minv = a.rmin + b.lmin; now.minl = a.rminid; now.minr = b.lminid;
if(now.minv > a.minv) now.minv = a.minv, now.minl = a.minl, now.minr = a.minr;
if(now.minv > b.minv) now.minv = b.minv, now.minl = b.minl, now.minr = b.minr;
now.rev = false;
return now;
}
inline void pushup(int x){seg[x] = merge(seg[x << ], seg[x << | ]);}
inline void rev(Node &a){
a.rev ^= ;
a.sum = -a.sum;
swap(a.lmax, a.lmin); swap(a.lmaxid, a.lminid);
a.lmax = -a.lmax; a.lmin = -a.lmin;
swap(a.rmax, a.rmin); swap(a.rmaxid, a.rminid);
a.rmax = -a.rmax; a.rmin = -a.rmin;
swap(a.maxv, a.minv); swap(a.maxl, a.minl); swap(a.maxr, a.minr);
a.maxv = -a.maxv; a.minv = -a.minv;
}
inline void pushdown(int x){
if(seg[x].rev){
rev(seg[x << ]);
rev(seg[x << | ]);
seg[x].rev = false;
}
}
int n, m, a[N];
inline void build(int x, int L, int R){
if(L == R){
seg[x] = Node(L, a[L]);
return;
}
int mid = L + R >> ;
build(x << , L, mid);
build(x << | , mid + , R);
pushup(x);
}
inline void change(int x, int L, int R, int pos, int val){
if(L == R){
seg[x] = Node(L, val);
return;
}
int mid = L + R >> ;
pushdown(x);
if(pos <= mid) change(x << , L, mid, pos, val);
else change(x << | , mid + , R, pos, val);
pushup(x);
}
inline void modify(int x, int L, int R, int l, int r){
if(l <= L && R <= r){
rev(seg[x]);
return;
}
int mid = L + R >> ;
pushdown(x);
if(l <= mid) modify(x << , L, mid, l, r);
if(mid < r) modify(x << | , mid + , R, l, r);
pushup(x);
}
inline Node query(int x, int L, int R, int l, int r){
if(l <= L && R <= r) return seg[x];
int mid = L + R >> ;
pushdown(x);
if(r <= mid) return query(x << , L, mid, l, r);
else if(mid < l) return query(x << | , mid + , R, l, r);
else return merge(query(x << , L, mid, l, r), query(x << | , mid + , R, l, r));
}
//inline void dfs(int x, int L, int R){
// if(L == R){
// printf("%d ", seg[x].maxv);
// return;
// }
// int mid = L + R >> 1;
// pushdown(x);
// dfs(x << 1, L, mid);
// dfs(x << 1 | 1, mid + 1, R);
//}
int main(){
scanf("%d", &n);
for(Rint i = ;i <= n;i ++) scanf("%d", a + i);
build(, , n);
scanf("%d", &m);
while(m --){
int opt, x, y, k;
scanf("%d%d%d", &opt, &x, &y);
if(opt == )
change(, , n, x, y);
else {
scanf("%d", &k);
int ans = , pos = k;
for(Rint i = ;i <= k;i ++){
q[i] = query(, , n, x, y);
if(q[i].maxv <= ){pos = i - ; break;}
modify(, , n, q[i].maxl, q[i].maxr);
// dfs(1, 1, n); puts("");
ans += q[i].maxv;
}
for(Rint i = ;i <= pos;i ++) modify(, , n, q[i].maxl, q[i].maxr);
printf("%d\n", ans);
}
}
}

CF280D k-Maximum Subsequence Sum的更多相关文章

  1. 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)

    01-复杂度2 Maximum Subsequence Sum   (25分) Given a sequence of K integers { N​1​​,N​2​​, ..., N​K​​ }. ...

  2. PAT1007:Maximum Subsequence Sum

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  3. PTA (Advanced Level) 1007 Maximum Subsequence Sum

    Maximum Subsequence Sum Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous su ...

  4. 【DP-最大子串和】PAT1007. Maximum Subsequence Sum

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  5. PAT Maximum Subsequence Sum[最大子序列和,简单dp]

    1007 Maximum Subsequence Sum (25)(25 分) Given a sequence of K integers { N~1~, N~2~, ..., N~K~ }. A ...

  6. PAT甲 1007. Maximum Subsequence Sum (25) 2016-09-09 22:56 41人阅读 评论(0) 收藏

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  7. PAT 甲级 1007 Maximum Subsequence Sum (25)(25 分)(0不是负数,水题)

    1007 Maximum Subsequence Sum (25)(25 分) Given a sequence of K integers { N~1~, N~2~, ..., N~K~ }. A ...

  8. PAT 1007 Maximum Subsequence Sum(最长子段和)

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  9. pat1007. Maximum Subsequence Sum (25)

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  10. PTA 01-复杂度2 Maximum Subsequence Sum (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/663 5-1 Maximum Subsequence Sum   (25分) Given ...

随机推荐

  1. 转:slf4j-api、slf4j-log4j12、log4j之间关系

    原文:https://www.cnblogs.com/lujiango/p/8573411.html 1. slf4j-api slf4j:Simple Logging Facade for Java ...

  2. Mybatis(五) 延迟加载和缓存机制(一级二级缓存)

    踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WH 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...

  3. 11个超震撼的HTML5和纯CSS3动画源码

    1.jQuery多功能手风琴个人信息菜单面板 这是一款基于jQuery的手风琴个人信息菜单面板,每一个菜单项展开后可以自定义布局,因此可以为每一个菜单项实现多功能.类似这样的多功能菜单还有jQuery ...

  4. Canvas入门到高级详解(中)

    三. canvas 进阶 3.1 Canvas 颜色样式和阴影 3.1.1 设置填充和描边的颜色(掌握) fillStyle : 设置或返回用于填充绘画的颜色 strokeStyle: 设置或返回用于 ...

  5. case when then 中判断null的方法

    --下列SQL无效 SELECT CASE MAX(T.CREATE_TIME) WHEN NULL THEN TO_DATE('2019-03-05 00:00:01','yyyy-MM-dd hh ...

  6. redhat 7.5 更换 yum源

    因为 redhat 的 yum 是收费,所以需要换成 Centos 的 yum 才可以 首先,卸载 redhat 的 yum 软件 sudo rpm -qa|grep yum 其次,下载 Centos ...

  7. 消息中间件系列三:使用RabbitMq原生Java客户端进行消息通信(消费者(接收方)自动确认模式、消费者(接收方)自行确认模式、生产者(发送方)确认模式)

    准备工作: 1)安装RabbitMQ,参考文章:消息中间件系列二:RabbitMQ入门(基本概念.RabbitMQ的安装和运行) 2.)分别新建名为OriginalRabbitMQProducer和O ...

  8. ZOJ 3886 Nico Number(筛素数+Love(线)Live(段)树)

    problemCode=3886">ZOJ 3886 题意: 定义一种NicoNico数x,x有下面特征: 全部不大于x且与x互质的数成等差数列,如x = 5 ,与5互素且不大于5的数 ...

  9. windows安装mysql8

    1:首先去官网下载安装包 下载地址:https://dev.mysql.com/downloads/mysql/ 2:将解压文件解压到你安装的目录:E:\mysql-8.0.11-winx64  (我 ...

  10. react proxy 报错

    react项目中,package.json中proxy的配置如下 "proxy": { "/api/rjwl": { "target": & ...