php论坛网站源码下载网站维护服务
php论坛网站源码下载,网站维护服务,公众号开发流程,沈阳网站建设公司设计师正题
题目链接:https://www.luogu.com.cn/problem/CF280D 题目大意
一个长度为nnn的序列#xff0c;mmm次操作
修改一个数询问一个区间中选出kkk段不交子段使得和最大 1≤n≤105,1≤m≤2105,1≤k≤201\leq n\leq 10^5,1\leq m\leq 2\times 10^5,1\leq k\leq 201≤n≤105,1≤…正题
题目链接:https://www.luogu.com.cn/problem/CF280D 题目大意
一个长度为nnn的序列mmm次操作
修改一个数询问一个区间中选出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(nklogn)O(nk\log n)O(nklogn) code
#includecstdio
#includecstring
#includealgorithm
#includestack
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N1e510;
struct node{int lw,rw,w;int mx,l,r,L,R;
}w[N2],v[N2];
int n,m,lazy[N2];
stackpairint,int s;
node Merge(node L,node R){node tmp;tmp.wL.wR.w;if(L.mxR.mx)tmp.mxL.mx,tmp.lL.l,tmp.rL.r;else tmp.mxR.mx,tmp.lR.l,tmp.rR.r;if(L.rwR.lwtmp.mx)tmp.mxL.rwR.lw,tmp.lL.R,tmp.rR.L;if(L.lwL.wR.lw)tmp.lwL.lw,tmp.LL.L;else tmp.lwL.wR.lw,tmp.LR.L;if(R.rwR.wL.rw)tmp.rwR.rw,tmp.RR.R;else tmp.rwR.wL.rw,tmp.RL.R;return tmp;
}
void Downdata(int x){if(!lazy[x])return;lazy[x*2]^1;swap(w[x*2],v[x*2]);lazy[x*21]^1;swap(w[x*21],v[x*21]);lazy[x]0;return;
}
void Change(int x,int L,int R,int l,int r){if(LlRr){swap(w[x],v[x]);lazy[x]^1;return;}int mid(LR)1;Downdata(x);if(rmid)Change(x*2,L,mid,l,r);else if(lmid)Change(x*21,mid1,R,l,r);else Change(x*2,L,mid,l,mid),Change(x*21,mid1,R,mid1,r);w[x]Merge(w[x*2],w[x*21]);v[x]Merge(v[x*2],v[x*21]);return;
}
void Updata(int x,int L,int R,int pos,int val){if(LR){w[x].ww[x].mxw[x].lww[x].rwval;w[x].lw[x].rw[x].Lw[x].Rpos;v[x].wv[x].mxv[x].lwv[x].rw-val;v[x].lv[x].rv[x].Lv[x].Rpos;return;}int mid(LR)1;Downdata(x);if(posmid)Updata(x*2,L,mid,pos,val);else Updata(x*21,mid1,R,pos,val);w[x]Merge(w[x*2],w[x*21]);v[x]Merge(v[x*2],v[x*21]);return;
}
node Ask(int x,int L,int R,int l,int r){if(LlRr)return w[x];int mid(LR)1;Downdata(x);if(rmid)return Ask(x*2,L,mid,l,r);if(lmid)return Ask(x*21,mid1,R,l,r);return Merge(Ask(x*2,L,mid,l,mid),Ask(x*21,mid1,R,mid1,r));
}
int main()
{scanf(%d,n);for(int i1,x;in;i)scanf(%d,x),Updata(1,1,n,i,x);scanf(%d,m);while(m--){int op;scanf(%d,op);if(op0){int x,w;scanf(%d%d,x,w);Updata(1,1,n,x,w);node tmpAsk(1,1,n,4,9);tmp.w;tmp.w--;}else{int l,r,k,ans0;scanf(%d%d%d,l,r,k);while(k){node tmpAsk(1,1,n,l,r);if(tmp.mx0){anstmp.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;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88052.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!