【Codeforces Round #172】Codeforces 280D k-Maximum Subsequence Sum
来源:互联网 发布:淘宝网上怎样卖东西 编辑:程序博客网 时间:2024/05/21 10:54
用线段树维护,每次取出最大子段和并把这一段区间取反,重复
有一个比较巧妙的证明,按照区间选择的模型建最大费用流,每次增广最长路就是选择最大的区间并取反。因为费用流的做法是对的,所以这样贪心就是对的。
#include<cstdio>#include<algorithm>using namespace std;const int maxn=1000010;int a[maxn],ll[40],rr[40],flag,n;struct node{ int sum,mx,lmx,rmx,mn,lmn,rmn,inv, l,r,mxl,mxr,lmxr,rmxl,lmnr,rmnl,mnl,mnr; void init(int p) { l=r=mxl=mxr=mnl=mnr=lmxr=lmnr=rmxl=rmnl=p; sum=mx=lmx=rmx=mn=lmn=rmn=a[p]; } void upd(node L,node R) { l=L.l; r=R.r; sum=L.sum+R.sum; if (L.lmx>L.sum+R.lmx) lmx=L.lmx,lmxr=L.lmxr; else lmx=L.sum+R.lmx,lmxr=R.lmxr; if (L.lmn<L.sum+R.lmn) lmn=L.lmn,lmnr=L.lmnr; else lmn=L.sum+R.lmn,lmnr=R.lmnr; if (R.rmx>R.sum+L.rmx) rmx=R.rmx,rmxl=R.rmxl; else rmx=R.sum+L.rmx,rmxl=L.rmxl; if (R.rmn<R.sum+L.rmn) rmn=R.rmn,rmnl=R.rmnl; else rmn=R.sum+L.rmn,rmnl=L.rmnl; if (L.mx>R.mx&&L.mx>L.rmx+R.lmx) mx=L.mx,mxl=L.mxl,mxr=L.mxr; else if (R.mx>L.rmx+R.lmx) mx=R.mx,mxl=R.mxl,mxr=R.mxr; else mx=L.rmx+R.lmx,mxl=L.rmxl,mxr=R.lmxr; if (L.mn<R.mn&&L.mn<L.rmn+R.lmn) mn=L.mn,mnl=L.mnl,mnr=L.mnr; else if (R.mn<L.rmn+R.lmn) mn=R.mn,mnl=R.mnl,mnr=R.mnr; else mn=L.rmn+R.lmn,mnl=L.rmnl,mnr=R.lmnr; } void clear() { inv=0; sum=-sum; swap(lmx,lmn); lmx=-lmx; lmn=-lmn; swap(lmxr,lmnr); swap(rmx,rmn); rmx=-rmx; rmn=-rmn; swap(rmxl,rmnl); swap(mx,mn); mx=-mx; mn=-mn; swap(mxl,mnl); swap(mxr,mnr); }}t[maxn],now;void build(int u,int L,int R){ if (L==R) t[u].init(L); else { int mid=L+R>>1; build(u<<1,L,mid); build(u<<1|1,mid+1,R); t[u].upd(t[u<<1],t[u<<1|1]); }}void down(int u){ if (t[u].inv) { t[u].clear(); if (t[u].l<t[u].r) { t[u<<1].inv^=1; t[u<<1|1].inv^=1; } }}void modify(int u,int p){ down(u); if (t[u].l==t[u].r) t[u].init(p); else { int mid=t[u].l+t[u].r>>1; if (p<=mid) modify(u<<1,p); else modify(u<<1|1,p); down(u<<1); down(u<<1|1); t[u].upd(t[u<<1],t[u<<1|1]); }}void find(int u,int l,int r){ down(u); if (l<=t[u].l&&t[u].r<=r) { if (!flag) now=t[u],flag=1; else now.upd(now,t[u]); return; } int mid=t[u].l+t[u].r>>1; if (l<=mid) find(u<<1,l,r); if (r>mid) find(u<<1|1,l,r);}void mark(int u,int l,int r){ down(u); if (l<=t[u].l&&t[u].r<=r) t[u].inv=1; else { int mid=t[u].l+t[u].r>>1; if (l<=mid) mark(u<<1,l,r); if (r>mid) mark(u<<1|1,l,r); down(u<<1); down(u<<1|1); t[u].upd(t[u<<1],t[u<<1|1]); }}int main(){ int x,y,k,q,opt,ans,cnt; scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); scanf("%d",&q); while (q--) { scanf("%d%d%d",&opt,&x,&y); if (opt==0) a[x]=y,modify(1,x); else { scanf("%d",&k); ans=cnt=0; while (k--) { flag=0; find(1,x,y); if (now.mx>0) { ans+=now.mx; cnt++; ll[cnt]=now.mxl; rr[cnt]=now.mxr; mark(1,now.mxl,now.mxr); } else break; } printf("%d\n",ans); for (;cnt;cnt--) mark(1,ll[cnt],rr[cnt]); } }}
0 0
- 【Codeforces Round #172】Codeforces 280D k-Maximum Subsequence Sum
- [题解]codeforces 280d k-Maximum Subsequence Sum
- CodeForces - 280D k-Maximum Subsequence Sum 线段树模拟费用流操作
- 【Codeforces】280D k-Maximum Subsequence Sum【区间内k段最大和——线段树模拟费用流】
- Codeforces Beta Round #67 (Div. 2) D. Big Maximum Sum
- codeforces Educational Codeforces Round 32 E. Maximum Subsequence
- k-Maximum Subsequence Sum
- Educational Codeforces Round 17-D. Maximum path
- CodeForces 75D Big Maximum Sum
- Lexicographically Maximum Subsequence CodeForces
- Maximum Subsequence CodeForces
- Codeforces Round #124 (Div. 2) / C. Lexicographically Maximum Subsequence
- Codeforces Round Intel Code Challenge Final Round D. Dense Subsequence
- Codeforces Round #159 (Div. 2) D sum
- [bzoj3638]k-Maximum Subsequence Sum
- [Educational Codeforces Round 17 D (762D)] Maximum path
- Educational Codeforces Round 9(D. Longest Subsequence(筛法))
- Educational Codeforces Round 9-D. Longest Subsequence(筛选法)
- VS2015服务器资源管理器连接Mysql数据库
- 什么是中间件
- Java中的关键字——static
- Java并发编程实战
- struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Jsp页面
- 【Codeforces Round #172】Codeforces 280D k-Maximum Subsequence Sum
- nyoj49 开心的小明 01背包
- BZOJ1221: [HNOI2001] 软件开发
- background-size设置背景图片自适应 在ie8下失效的问题
- 部分和问题 南阳oj 1058
- 豪斯多夫距离-- Hausdorff distance of convex polygons
- android animation
- Distributed System: Message (信息传递) and JMI
- 多线程心得