【Codeforces】280D k-Maximum Subsequence Sum【区间内k段最大和——线段树模拟费用流】
来源:互联网 发布:csgo帧数优化 编辑:程序博客网 时间:2024/05/09 16:41
传送门:【Codeforces】280D k-Maximum Subsequence Sum
key word:取反
#include <stdio.h>#include <string.h>#include <vector>#include <algorithm>using namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x , sizeof a )#define ls ( o << 1 )#define rs ( o << 1 | 1 )#define lson ls , l , m#define rson rs , m + 1 , r#define root 1 , 1 , n#define mid ( ( l + r ) >> 1 )const int MAXN = 100005 ;struct Node { int s , mv , lv , rv , ml , mr , l , r ; Node () {} Node ( int x , int v ) { s = mv = lv = rv = v ; ml = mr = l = r = x ; } Node operator + ( const Node& a ) const { Node c ; c.s = s + a.s ; if ( mv > a.mv ) { c.mv = mv ; c.ml = ml ; c.mr = mr ; } else { c.mv = a.mv ; c.ml = a.ml ; c.mr = a.mr ; } if ( rv + a.lv > c.mv ) { c.mv = rv + a.lv ; c.ml = r ; c.mr = a.l ; } c.lv = lv ; c.rv = a.rv ; c.l = l ; c.r = a.r ; if ( s + a.lv > c.lv ) { c.lv = s + a.lv ; c.l = a.l ; } if ( rv + a.s > c.rv ) { c.rv = rv + a.s ; c.r = r ; } return c ; } Node operator - ( const Node& a ) const { Node c ; c.s = s + a.s ; if ( mv < a.mv ) { c.mv = mv ; c.ml = ml ; c.mr = mr ; } else { c.mv = a.mv ; c.ml = a.ml ; c.mr = a.mr ; } if ( rv + a.lv < c.mv ) { c.mv = rv + a.lv ; c.ml = r ; c.mr = a.l ; } c.lv = lv ; c.rv = a.rv ; c.l = l ; c.r = a.r ; if ( s + a.lv < c.lv ) { c.lv = s + a.lv ; c.l = a.l ; } if ( rv + a.s < c.rv ) { c.rv = rv + a.s ; c.r = r ; } return c ; } void rev () { mv = -mv ; lv = -lv ; rv = -rv ; s = -s ; }} ;struct Seg { Node mi , ma ; bool flip ; void down () { swap ( mi , ma ) ; mi.rev () ; ma.rev () ; flip ^= 1 ; }} ;Seg T[MAXN << 2] ;Node ans ;int S[30][2] ;int n , m ;void up ( int o ) { T[o].mi = T[ls].mi - T[rs].mi ; T[o].ma = T[ls].ma + T[rs].ma ;}void down ( int o ) { if ( T[o].flip ) { T[ls].down () ; T[rs].down () ; T[o].flip = 0 ; }}void modify ( int x , int v , int o , int l , int r ) { if ( l == r ) T[o].mi = Node ( x , v ) , T[o].ma = Node ( x , v ) ; else { down ( o ) ; int m = mid ; if ( x <= m ) modify ( x , v , lson ) ; else modify ( x , v , rson ) ; up ( o ) ; }}void update ( int L , int R , int o , int l , int r ) { if ( L <= l && r <= R ) T[o].down () ; else { down ( o ) ; int m = mid ; if ( L <= m ) update ( L , R , lson ) ; if ( m < R ) update ( L , R , rson ) ; up ( o ) ; }}void query ( int L , int R , int o , int l , int r ) { if ( L <= l && r <= R ) ans = ans + T[o].ma ; else { down ( o ) ; int m = mid ; if ( L <= m ) query ( L , R , lson ) ; if ( m < R ) query ( L , R , rson ) ; }}void build ( int o , int l , int r ) { T[o].flip = 0 ; if ( l == r ) { int v ; scanf ( "%d" , &v ) ; T[o].mi = Node ( l , v ) ; T[o].ma = Node ( l , v ) ; return ; } int m = mid ; build ( lson ) ; build ( rson ) ; up ( o ) ;}void solve () { int op , x , y , v , k ; build ( root ) ; scanf ( "%d" , &m ) ; for ( int i = 0 ; i < m ; ++ i ) { scanf ( "%d" , &op ) ; if ( op == 0 ) { scanf ( "%d%d" , &x , &v ) ; modify ( x , v , root ) ; } else { scanf ( "%d%d%d" , &x , &y , &k ) ; int res = 0 ; for ( int j = 0 ; j < k ; ++ j ) { ans = Node ( -1000 , -1000 ) ; query ( x , y , root ) ; S[j][0] = ans.ml ; S[j][1] = ans.mr ; if ( ans.mv < 0 ) { k = j ; break ; } res += ans.mv ; update ( S[j][0] , S[j][1] , root ) ; } printf ( "%d\n" , max ( res , 0 ) ) ; for ( int j = 0 ; j < k ; ++ j ) { update ( S[j][0] , S[j][1] , root ) ; } } }}int main () { while ( ~scanf ( "%d" , &n ) ) solve () ; return 0 ;}
0 0
- 【Codeforces】280D k-Maximum Subsequence Sum【区间内k段最大和——线段树模拟费用流】
- CodeForces - 280D k-Maximum Subsequence Sum 线段树模拟费用流操作
- bzoj3638/3272 Cf172 k-Maximum Subsequence Sum 线段树模拟费用流
- 【Codeforces Round #172】Codeforces 280D k-Maximum Subsequence Sum
- [题解]codeforces 280d k-Maximum Subsequence Sum
- CF280D k-Maximum Subsequence Sum (线段树)
- [费用流手动增广 线段树] BZOJ 3267 KC采花 && 3272 Zgg吃东西 && 3638 Cf172 k-Maximum Subsequence Sum
- k-Maximum Subsequence Sum
- 求区间连续不超过K段的最大和--线段树+大量代码
- [bzoj3638]k-Maximum Subsequence Sum
- pat(A) 1007. Maximum Subsequence Sum(和最大子段)
- Codeforces 75D Big Maximum Sum 最大子段和 dp
- BZOJ3638 Cf172 k-Maximum Subsequence Sum
- BZOJ 3638 k-Maximum Subsequence Sum
- BZOJ 3638 k-Maximum Subsequence Sum
- Maximum Subsequence Sum最大连续数列和
- codeforces 515e Drazil and Park 线段树、区间最大子段和
- [CF280D/CF172][BZOJ3272/3638][JZOJ4400]k-Maximum Subsequence Sum
- 【LEETCODE】223-Rectangle Area
- Spark源码系列之Spark内核——Job提交
- SQL Server DBA面试知识点(一)--SQL Server的事务隔离级别详解
- var ;declare emp_name nvarchar2(30);
- 详解Android uses-permission权限说明
- 【Codeforces】280D k-Maximum Subsequence Sum【区间内k段最大和——线段树模拟费用流】
- ASP.NET 出现错误 &nbsp…
- 存储过程
- ASP.NET GridView 激发…
- ASP.NET AJAX中Triggers标签
- ASP.NET 使用母版页面&…
- 存储过程2
- ASP.NET 中富文本编辑器eWebE…
- ASP.NET 控件