正题

题目链接:https://www.luogu.com.cn/problem/CF280D


题目大意

一个长度为nnn的序列,mmm次操作

  1. 修改一个数
  2. 询问一个区间中选出kkk段不交子段使得和最大

1≤n≤105,1≤m≤2×105,1≤k≤201\leq n\leq 10^5,1\leq m\leq 2\times 10^5,1\leq k\leq 201≤n≤105,1≤m≤2×105,1≤k≤20


解题思路

考虑模拟一下费用流,发现费用流的每次增广就是不停找到一个最大的子段取反。

用线段树维护最大子段,然后取反的话维护一个正的一个反的。

每次暴力做kkk次再倒流回去就好了。

时间复杂度:O(nklog⁡n)O(nk\log n)O(nklogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=1e5+10;
struct node{int lw,rw,w;int mx,l,r,L,R;
}w[N<<2],v[N<<2];
int n,m,lazy[N<<2];
stack<pair<int,int> >s;
node Merge(node L,node R){node tmp;tmp.w=L.w+R.w;if(L.mx>R.mx)tmp.mx=L.mx,tmp.l=L.l,tmp.r=L.r;else tmp.mx=R.mx,tmp.l=R.l,tmp.r=R.r;if(L.rw+R.lw>tmp.mx)tmp.mx=L.rw+R.lw,tmp.l=L.R,tmp.r=R.L;if(L.lw>=L.w+R.lw)tmp.lw=L.lw,tmp.L=L.L;else tmp.lw=L.w+R.lw,tmp.L=R.L;if(R.rw>=R.w+L.rw)tmp.rw=R.rw,tmp.R=R.R;else tmp.rw=R.w+L.rw,tmp.R=L.R;return tmp;
}
void Downdata(int x){if(!lazy[x])return;lazy[x*2]^=1;swap(w[x*2],v[x*2]);lazy[x*2+1]^=1;swap(w[x*2+1],v[x*2+1]);lazy[x]=0;return;
}
void Change(int x,int L,int R,int l,int r){if(L==l&&R==r){swap(w[x],v[x]);lazy[x]^=1;return;}int mid=(L+R)>>1;Downdata(x);if(r<=mid)Change(x*2,L,mid,l,r);else if(l>mid)Change(x*2+1,mid+1,R,l,r);else Change(x*2,L,mid,l,mid),Change(x*2+1,mid+1,R,mid+1,r);w[x]=Merge(w[x*2],w[x*2+1]);v[x]=Merge(v[x*2],v[x*2+1]);return;
}
void Updata(int x,int L,int R,int pos,int val){if(L==R){w[x].w=w[x].mx=w[x].lw=w[x].rw=val;w[x].l=w[x].r=w[x].L=w[x].R=pos;v[x].w=v[x].mx=v[x].lw=v[x].rw=-val;v[x].l=v[x].r=v[x].L=v[x].R=pos;return;}int mid=(L+R)>>1;Downdata(x);if(pos<=mid)Updata(x*2,L,mid,pos,val);else Updata(x*2+1,mid+1,R,pos,val);w[x]=Merge(w[x*2],w[x*2+1]);v[x]=Merge(v[x*2],v[x*2+1]);return;
}
node Ask(int x,int L,int R,int l,int r){if(L==l&&R==r)return w[x];int mid=(L+R)>>1;Downdata(x);if(r<=mid)return Ask(x*2,L,mid,l,r);if(l>mid)return Ask(x*2+1,mid+1,R,l,r);return Merge(Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r));
}
int main()
{scanf("%d",&n);for(int i=1,x;i<=n;i++)scanf("%d",&x),Updata(1,1,n,i,x);scanf("%d",&m);while(m--){int op;scanf("%d",&op);if(op==0){int x,w;scanf("%d%d",&x,&w);Updata(1,1,n,x,w);node tmp=Ask(1,1,n,4,9);tmp.w++;tmp.w--;}else{int l,r,k,ans=0;scanf("%d%d%d",&l,&r,&k);while(k){node tmp=Ask(1,1,n,l,r);if(tmp.mx>0){ans+=tmp.mx;k--;s.push(mp(tmp.l,tmp.r));Change(1,1,n,tmp.l,tmp.r);}else break;}printf("%d\n",ans);while(!s.empty())Change(1,1,n,s.top().first,s.top().second),s.pop();}}return 0;
}

CF280D-k-Maximum Subsequence Sum【模拟费用流,线段树】相关推荐

  1. BZOJ 3836 Codeforces 280D k-Maximum Subsequence Sum (模拟费用流、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=3836 (Codeforces) http://codeforces.com ...

  2. BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...

  3. UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)

    题目链接 http://uoj.ac/contest/47/problem/455 题解 模拟费用流,一个非常神奇的东西. 本题即为WC2019 laofu的讲课中的Problem 8,经典的老鼠进洞 ...

  4. [UOJ455][UER #8]雪灾与外卖——堆+模拟费用流

    题目链接: [UOJ455]雪灾与外卖 题目描述:有$n$个送餐员(坐标为$x_{i}$)及$m$个餐厅(坐标为$y_{i}$,权值为$w_{i}$),每个送餐员需要前往一个餐厅,每个餐厅只能容纳$c ...

  5. BZOJ 4946: [Noi2017]蔬菜 模拟费用流

    title BZOJ 4946 LUOGU 3826 简化题意: 定义了一种蔬菜为:\(ai,si,ci,xi\),意思是蔬菜的价格为 \(a_i\),第一份卖出时价格为 \(a_i+s_i\),一共 ...

  6. 【贪心 / 线段树模拟费用流增广】BZOJ4977 [Lydsy八月月赛] 跳伞求生

    [题目] 原题地址 有nn个队友和mm个敌人,每个队友有一个攻击力aia_i,每个敌人有攻击力bib_i和价值cic_i.你可以选择若干个队友,每个队友ii分别去怼一个敌人jj,当ai>bja_ ...

  7. 1007 Maximum Subsequence Sum

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

  8. PAT 1007 Maximum Subsequence Sum

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

  9. [NOI2019] 序列(模拟费用流)

    原先自己想的建图: 正确建图: 但是 n 太大了,所以考虑模拟费用流: 注意: 在1中, 若选的两个位置相同,则为情况2,不用减 f: 若选的位置在另一序列中已被选,则为情况3或4,不用减 f: 若选 ...

最新文章

  1. Spring Cloud应用开发(三:客户端的负载均衡)
  2. zabbix登山路——简单监控_各项参数解析
  3. Python爬虫QQ说说并分析朋友状况
  4. DOM 之通俗易懂讲解
  5. MySQL 后from多个表_MYSQL回顾(多表查询相关)
  6. JAVA 字符串驻留池
  7. Aspose.OCR 22.6 for .NET//Aspose.OCR
  8. Hibernate 学习的书-夏昕(3)
  9. Windows10键盘快捷键大全
  10. 数学知识-三角函数公式大全(值得收藏)
  11. 夜宿祝国寺(文:元哲)
  12. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 (高斯消元)
  13. XUPT_STA2018(部分题解)
  14. RabbitMQ简介及简单使用
  15. 微信公众号 - 实现 H5 网页在微信内置浏览器中下载文件,可预览和下载 office 文件(doc / xls / ppt / pdf 等)适用于任何前端技术栈网站,兼容安卓和苹果系统!
  16. mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor...
  17. OpenCV——KAZE、AKAZE特征检测、匹配与对象查找
  18. PyFlink 教程:PyFlink DataStream API - state timer
  19. 刘诚昊20162316 第一周作业
  20. EOJ 唐纳德与子串 (Easy)

热门文章

  1. python web前端开发面试_面试前端,听听别人怎么说!
  2. mysql数据库主要用来做什么的_水晶头骨用来做什么的?
  3. fanuc机器人控制柜接线_FANUC涂胶标定参考
  4. oracle归档日志的概念,浅谈Oracle归档日志
  5. 小学计算机课教学设计,小学信息技术教学设计三篇
  6. c语言修仙受控可看吗,强推三本神奇到爆的小说,c语言修仙,程序员与修真会擦出什么火花...
  7. leetcode——344. 反转字符串
  8. C++的new、delete需要注意的一点:使用危险函数导致的越界CRT detected that the application wrote to memory after end of heap
  9. 洛谷 P1122 最大子树和-求树的最大子树权值和
  10. 八数码问题I-bfs和map标记