传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3638

【题解】

看到k<=20就感觉很py了啊

我们用一棵线段树维护选段的过程,能选到>0的段就一直选,直到选到<0的段,每次选完把段内的数全部取相反数,意为下次取是“不取”的意思。

用线段树维护左边/右边/中间的max/min

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + ;
const int mod = 1e9+; # define RG register
# define ST static int n; struct pa {
int l, r, x;
pa() {}
pa(int l, int r, int x) : l(l), r(r), x(x) {}
friend pa operator + (pa a, pa b) {
pa c; c.x = a.x + b.x;
c.l = a.l, c.r = b.r;
return c;
}
friend bool operator < (pa a, pa b) {
return a.x < b.x;
}
friend bool operator > (pa a, pa b) {
return a.x > b.x;
}
}; struct querys {
pa lmx, rmx, mx, s;
querys() {}
querys(pa lmx, pa rmx, pa mx, pa s) : lmx(lmx), rmx(rmx), mx(mx), s(s) {}
}; namespace SMT {
const int Ms = 1e6 + ;
pa lmx[Ms], rmx[Ms], lmi[Ms], rmi[Ms], mx[Ms], mi[Ms], s[Ms];
bool tag[Ms]; // -1
# define ls (x<<)
# define rs (x<<|)
inline void up(int x) {
if(!x) return ;
lmx[x] = max(lmx[ls], s[ls] + lmx[rs]);
lmi[x] = min(lmi[ls], s[ls] + lmi[rs]);
rmx[x] = max(rmx[rs], rmx[ls] + s[rs]);
rmi[x] = min(rmi[rs], rmi[ls] + s[rs]);
mx[x] = max(mx[ls], mx[rs]);
mx[x] = max(mx[x], rmx[ls] + lmx[rs]);
mi[x] = min(mi[ls], mi[rs]);
mi[x] = min(mi[x], rmi[ls] + lmi[rs]);
s[x] = s[ls] + s[rs];
}
inline void pushtag(int x) {
if(!x) return ;
lmx[x].x = -lmx[x].x;
rmx[x].x = -rmx[x].x;
lmi[x].x = -lmi[x].x;
rmi[x].x = -rmi[x].x;
mx[x].x = -mx[x].x;
mi[x].x = -mi[x].x;
s[x].x = -s[x].x;
swap(mx[x], mi[x]);
swap(lmx[x], lmi[x]);
swap(rmx[x], rmi[x]);
tag[x] ^= ;
}
inline void down(int x) {
if(!x) return ;
if(!tag[x]) return ;
pushtag(ls); pushtag(rs);
tag[x] = ;
}
inline void change(int x, int l, int r, int ps, int d) {
if(l == r) {
s[x].l = s[x].r = lmx[x].l = lmx[x].r = rmx[x].l = rmx[x].r = lmi[x].l = lmi[x].r = rmi[x].l = rmi[x].r = l;
mx[x].l = mx[x].r = mi[x].l = mi[x].r = l;
s[x].x = mx[x].x = mi[x].x = lmx[x].x = lmi[x].x = rmx[x].x = rmi[x].x = d;
tag[x] = ;
return ;
}
down(x);
int mid = l+r>>;
if(ps <= mid) change(ls, l, mid, ps, d);
else change(rs, mid+, r, ps, d);
up(x);
} inline void change2(int x, int l, int r, int L, int R) {
if(L <= l && r <= R) {
pushtag(x);
return ;
}
down(x);
int mid = l+r>>;
if(L <= mid) change2(ls, l, mid, L, R);
if(R > mid) change2(rs, mid+, r, L, R);
up(x);
} inline querys merge(querys a, querys b) {
querys c;
c.lmx = max(a.lmx, a.s+b.lmx);
c.rmx = max(b.rmx, a.rmx+b.s);
c.s = a.s + b.s;
c.mx = max(a.mx, b.mx);
c.mx = max(c.mx, a.rmx + b.lmx);
return c;
} inline querys query(int x, int l, int r, int L, int R) {
if(L <= l && r <= R) return querys(lmx[x], rmx[x], mx[x], s[x]);
down(x);
int mid = l+r>>;
if(R <= mid) return query(ls, l, mid, L, R);
else if(L > mid) return query(rs, mid+, r, L, R);
else return merge(query(ls, l, mid, L, mid), query(rs, mid+, r, mid+, R));
} inline void debug(int x, int l, int r) {
printf("x = %d, l = %d, r = %d : mx = %d, lmx = %d, rmx = %d\n", x, l, r, mx[x].x, mx[x].l, mx[x].r);
if(l == r) return ;
int mid = l+r>>;
debug(ls, l, mid);
debug(rs, mid+, r);
}
} int Left[], Right[], m; int main() {
cin >> n;
for (int i=, t; i<=n; ++i) {
scanf("%d", &t);
SMT::change(, , n, i, t);
}
int Q, a, b, c;
querys t;
cin >> Q;
while(Q--) {
int opt; scanf("%d", &opt);
if(!opt) {
scanf("%d%d", &a, &b);
SMT::change(, , n, a, b);
} else {
scanf("%d%d%d", &a, &b, &c);
int s = ; m = ;
while(c--) {
t = SMT::query(, , n, a, b);
if(t.mx.x < ) break;
else s += t.mx.x;
// cout << t.mx.l << " " << t.mx.r << " " << t.mx.x << endl;
SMT::change2(, , n, t.mx.l, t.mx.r);
++m; Left[m] = t.mx.l, Right[m] = t.mx.r;
}
printf("%d\n", s);
for (int i=m; i; --i) SMT::change2(, , n, Left[i], Right[i]);
}
// SMT::debug(1, 1, n);
}
return ;
}

bzoj3638 Cf172 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. linux 源码安装php7.0 yum

    PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM.HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂 ...

  2. PHP使用redis(一)

    1,connect 描述:实例连接到一个Redis.参数:host: string,port: int返回值:BOOL 成功返回:TRUE;失败返回:FALSE <?php  $redis = ...

  3. 线程、进程、协程和GIL(三)

    上一篇文章介绍了:创建线程的两种方式.Event对象判断线程是否启动.利用信号量控制线程并发. 博客链接:线程.进程.协程和GIL(二) 这一篇来说说线程间通信的那些事儿: 一个线程向另一个线程发送数 ...

  4. 4 Django简介

    MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...

  5. laravel5.5事件广播系统实例laravel-echo + redis + socket.io

    目录 1. 广播配置说明 1.1 广播驱动配置 1.2 注册服务提供器 2. 驱动器配置 2.1 安装predis 2.2. 配置服务端 2.2.1 安装方法 2.2.2 初始化服务端 2.2.3 运 ...

  6. javascript检测数组

    在ECMAScript5中的数组已经引入了isArray方法,该方法的目的就是检测变量是否为数组. 但是对于ie6.7等古老的浏览器是没有这样的方法的,在Zakas写的一本书上摘到一个函数,基本能优雅 ...

  7. 剑指Offer - 九度1514 - 数值的整数次方

    剑指Offer - 九度1514 - 数值的整数次方2013-11-30 00:49 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponen ...

  8. 天性 & 如水一般,遇强则强 —— 梦想、行为、性格

    开篇声明,我博客中“小心情”这一系列,全都是日记啊随笔啊什么乱七八糟的.如果一不小心点进来了,不妨直接关掉.我自己曾经写过一段时间的日记,常常翻看,毫无疑问我的文笔是很差的,而且心情也是瞬息万变的.因 ...

  9. 关于mysqldump备份非事务表的注意事项

      Preface       We're used to get a logical backup set(whole instance) by simply specifying "-- ...

  10. linux shell 总结 (整理)

    ls /usr/bin/ info #路径操作 dirname basename #“”和‘’与 ` ` 在shell变量中的区别 “ ” 允许通过$符引用其他变量 ‘’禁止引用其他变量符,视为普通字 ...