Portal --> broken qwq

Description

   给你一个长度为\(n\)的整数序列,要支持以下两个操作:

\((0,i,x)\):将第\(i\)个数改成\(x\)

\((1,l,r,k)\):求出\(k\)个区间,满足这些区间没有公共部分并且都在\([l,r]\)的范围内,求这些区间内的数的和的最大值(区间可以为空,空区间和为\(0\))

​   数据范围:

对于40%的数据,\(n,m,k<=1000\)

对于100%的数据,\(n,m<=10^5,k<=20\)

Solution

   这题。。不难但是。。要写的简洁还是需要好好想一下qwq

​   丢上来主要是因为这题的重载运算符写得好的话会比直接写不知道简洁到哪里去了

​   然后还有就是。。这什么沙雕数据范围啊!!!难道100%不包含40%的吗!!!一开始没有仔细看于是乎出现了前四个1000的点RE后面的大点全部过掉的奇怪分数分布。。。

​   

​   好了言归正传

   这题因为这个\(k<=20\)所以可以直接非常暴力地变成查\(k\)次最大值,然后将这个最大值区间去掉,具体的话就是直接整个区间取相反数就好了,最后还原一下就好了

​   然后40%的数据也问题不大(吧)

​   然后你需要线段树维护最大值、最小值、左边最大值、左边最小值、右边最大值、右边最小值以及区间和。。。最小值的话是因为。。一旦区间取相反数之后。。最大值和最小值就要对调了

​   然后快乐封装之后就可以写的很好看啦!

  

​   代码大概长这样

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=100010,SEG=N*4,inf=1e9;
struct Data{
int l,r,val;
Data(){}
Data(int l1,int r1,int val1){l=l1; r=r1; val=val1;}
friend Data operator + (Data x,Data y)
{return Data(x.l,y.r,x.val+y.val);}
friend bool operator < (Data x,Data y){return x.val<y.val;}
friend bool operator > (Data x,Data y){return x.val>y.val;}
};
Data Max(Data x,Data y){return x>y?x:y;}
Data Min(Data x,Data y){return x<y?x:y;}
struct Info{
Data l,r,ans;
Data sum;
Info(){}
Info(Data x){l=r=ans=sum=x;}
friend Info operator + (Info lch,Info rch){
Info ret;
ret.sum=lch.sum+rch.sum;
ret.l=Max(lch.l,lch.sum+rch.l);
ret.r=Max(rch.r,lch.r+rch.sum);
ret.ans=Max(Max(lch.ans,rch.ans),lch.r+rch.l);
return ret;
}
}rec[1010];
int a[N];
namespace Seg{/*{{{*/
int ch[SEG][2];
Info mx[SEG],mn[SEG];
int tag[SEG];
int n,tot;
void pushup(int x){
mx[x]=mx[ch[x][0]]+mx[ch[x][1]];
mn[x]=mn[ch[x][0]]+mn[ch[x][1]];
}
void _build(int x,int l,int r){
tag[x]=0;
if (l==r){
mx[x]=Info(Data(l,r,a[l]));
mn[x]=Info(Data(l,r,-a[l]));
return;
}
int mid=l+r>>1;
ch[x][0]=++tot; _build(ch[x][0],l,mid);
ch[x][1]=++tot; _build(ch[x][1],mid+1,r);
pushup(x);
}
void build(int _n){n=_n; tot=1; _build(1,1,n);}
void givetag(int x){
tag[x]^=1;
swap(mx[x],mn[x]);
}
void downtag(int x){
if (ch[x][0]) givetag(ch[x][0]);
if (ch[x][1]) givetag(ch[x][1]);
tag[x]=0;
}
void _update(int x,int l,int r,int lx,int rx){
if (l<=lx&&rx<=r){
givetag(x); return;
}
if (tag[x]) downtag(x);
int mid=lx+rx>>1;
if (l<=mid) _update(ch[x][0],l,r,lx,mid);
if (r>mid) _update(ch[x][1],l,r,mid+1,rx);
pushup(x);
}
void update(int l,int r){_update(1,l,r,1,n);}
void _modify(int x,int d,int lx,int rx,int delta){
if (lx==rx){
mx[x]=Info(Data(lx,rx,delta));
mn[x]=Info(Data(lx,rx,-delta));
return;
}
if (tag[x]) downtag(x);
int mid=lx+rx>>1;
if (d<=mid) _modify(ch[x][0],d,lx,mid,delta);
else _modify(ch[x][1],d,mid+1,rx,delta);
pushup(x);
}
void modify(int d,int delta){_modify(1,d,1,n,delta);}
Info _query(int x,int l,int r,int lx,int rx){
if (l<=lx&&rx<=r) return mx[x];
if (tag[x]) downtag(x);
int mid=lx+rx>>1;
if (r<=mid) return _query(ch[x][0],l,r,lx,mid);
else if (l>mid) return _query(ch[x][1],l,r,mid+1,rx);
else {
return _query(ch[x][0],l,mid,lx,mid)+_query(ch[x][1],mid+1,r,mid+1,rx);
}
}
Info query(int l,int r){return _query(1,l,r,1,n);}
}/*}}}*/
int n,m;
void debug(){
Info tmp;
for (int i=1;i<=n;++i)
tmp=Seg::query(i,i),printf("%d ",tmp.ans.val);
printf("\n");
}
void solve(int l,int r,int k){
int cnt=0,sum=0;
Info tmp;
for (int i=1;i<=k;++i){
tmp=Seg::query(l,r);
if (tmp.ans.val>0){
rec[++cnt]=tmp,sum+=tmp.ans.val;
Seg::update(tmp.ans.l,tmp.ans.r);
//debug();
}
else break;
}
for (int i=1;i<=cnt;++i){
Seg::update(rec[i].ans.l,rec[i].ans.r);
//debug();
}
printf("%d\n",sum);
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int op,l,r,x,delta;
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%d",a+i);
Seg::build(n);
//debug();
scanf("%d",&m);
for (int i=1;i<=m;++i){
scanf("%d",&op);
if (op==0){
scanf("%d%d",&x,&delta);
Seg::modify(x,delta);
}
else{
scanf("%d%d%d",&l,&r,&delta);
solve(l,r,delta);
}
}
}

Subseq的更多相关文章

  1. 2018牛客网暑假ACM多校训练赛(第五场)H subseq 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-H.html 题目传送门 - https://www.no ...

  2. 2018牛客多校第五场 H.subseq

    题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...

  3. 牛客网多校第5场 H subseq 【树状数组+离散化】

    题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...

  4. LeetCode "Wiggle Subsequence" !

    Another interesting DP. Lesson learnt: how you define state is crucial.. 1. if DP[i] is defined as, ...

  5. Extract Fasta Sequences Sub Sets by position

    cut -d " " -f 1 sequences.fa | tr -s "\n" "\t"| sed -s 's/>/\n/g' & ...

  6. HDU #5507 GT and Strings

    这是AC自动机系列的第一篇 传送门 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Othe ...

  7. acm算法模板(1)

    1. 几何 4 1.1 注意 4 1.2 几何公式 4 1.3 多边形 6 1.4 多边形切割 9 1.5 浮点函数 10 1.6 面积 15 1.7 球面 16 1.8 三角形 17 1.9 三维几 ...

  8. ACM-ICPC竞赛模板

    为了方便打印,不再将代码放到代码编辑器里,祝你好运. ACM-ICPC竞赛模板(1) 1. 几何 4 1.1 注意 4 1.2 几何公式 4 1.3 多边形 6 1.4 多边形切割 9 1.5 浮点函 ...

  9. *[topcoder]LongWordsDiv2

    http://community.topcoder.com/stat?c=problem_statement&pm=13147 此题关键在于发现ABAB的组合最多有26*26种,可以穷举,然后 ...

随机推荐

  1. jvm之GC知识点

    GCRoots:        虚拟机栈(栈帧中的局部变量表)引用的对象       方法区中静态属性引用的对象       方法去中常量引用的对象       本地方法栈中JNI(NATIVE方法) ...

  2. spark重点知识

    1 scala 2 spark rdd 3 sprak core 4 性能优化 5 spark sql 6 spark streaming 掌握程度-精通的理解:

  3. [T-ARA][HUE]

    歌词来源:http://music.163.com/#/song?id=22704406 wa du seu mo geum to yo do ga tae 어딜가도 스페셜한게 없어 [eo-dil ...

  4. DX孟虎点评新兴市场:巴西俄罗斯火爆背后

    [亿邦动力网讯]4月3日消息,在第九届中国中小企业电子商务大会暨2014中国(河南)跨境贸易电子商务峰会上,DX公司CEO孟虎对新兴市场做了详细的分析,指出在当今的跨境电商环境下,北美.西欧作为电商成 ...

  5. JS - Promise使用详解--摘抄笔记

    第一部分: JS - Promise使用详解1(基本概念.使用优点) 一.promises相关概念 promises 的概念是由 CommonJS 小组的成员在 Promises/A 规范中提出来的. ...

  6. 大数据-spark-hbase-hive等学习视频资料

    不错的大数据spark学习资料,连接过期在评论区评论,再给你分享 https://pan.baidu.com/s/1ts6RNuFpsnc39tL3jetTkg

  7. HUST学期助教总结

    春节还没过完,在回广州的高铁上收到是否愿意担任一次软测助教的询问.想了一天,答应了.而内心其实是有点恐慌的,有几点原因: 大学从来没有学过软件测试这门课程.对于自己的软件测试只是体系并不是很有自信. ...

  8. 王者荣耀交流协会final发布WBS+PSP

    WBS: PSP: 时间为估计,大致精确. 类型 personal software process stages 预估时间 实际花费时间 planning 计划 4h 4h estimate 4h ...

  9. 【转】node.js框架比较

    我偶然间看到这篇文章,转这个文章并没有什么含义,仅仅是感觉总结的不错,对于新学node的友友们来说希望这篇文章为大家对 Node.js 后端框架选型带来一些帮助,学习不再迷茫,也是让我有个保存,以后参 ...

  10. mininet实验 可视化界面形成拓扑

    参考博客一 参考博客二 实验目的 mininet中内置了一个mininet可视化工具:miniedit.miniedit在mininet/mininet/examples目录下提供miniedit.p ...