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. C++自学第二课:对象和类的概念

    既然是C++,比C语言多了最重要的概念:面向对象. 面向对象?对象是什么?Girlfriend? 我天天面向她也没学会C++. 我觉得对象就是有统一特征的一类编程目标. 打个比方说墙上有个开关,我一按 ...

  2. 深圳第XX天

    今天早晨,面了一家小公司.先说结果吧,面过了.但是,总感觉太假了.面试中很多问题都没有回答上来.然后老板看了一下简历,问:期薪资多少?我想了想,说7000.啊,要不留下来看看?我答应了.不到十分钟,就 ...

  3. mysql innodb myisam 比较

    InnoDB: 支持事务处理等 不加锁读取 支持外键 支持行锁 不支持FULLTEXT类型的索引 不保存表的具体行数,扫描表来计算有多少行 DELETE 表时,是一行一行的删除 InnoDB 把数据和 ...

  4. OpenCV学习笔记——腐蚀与膨胀

    1.膨胀 此操作将图像 与任意形状的内核 (),通常为正方形或圆形,进行卷积. 内核 有一个可定义的 锚点, 通常定义为内核中心点. 进行膨胀操作时,将内核 划过图像,将内核 覆盖区域的最大相素值提取 ...

  5. CS小分队第二阶段冲刺站立会议(5月28日)

    昨日成果:昨天对我们的软件的主界面进行了思考,考虑到许多人建议我们团队添加可以自主增加软件快捷键的功能,我对这一想法的可行性和项目总体策划进行评估分析后,决定正式实施:已经完成从电脑上添加文件在我们的 ...

  6. 安装cocoa pods

    1.移除现有Ruby默认源 $gem sources --remove https://rubygems.org/ 2.使用新的源 $gem sources -a https://ruby.taoba ...

  7. DP----入门的一些题目(POJ1088 POJ1163 POJ1050)

    动态规划入门 DP 基本思想 具体实现 经典题目 POJ1088 POJ1163 POJ1050 (一) POJ1088,动态规划的入门级题目.嘿嘿,连题目描述都是难得一见的中文. 题目分析: 求最长 ...

  8. 第8章 Linux磁盘与文件系统管理

    认识EXT2文件系统 文件的系统特性 Linux的正规文件系统为Ext2 文件数据除了文件实际内容外,还包括其他属性(文件权限.文件属性). 文件系统将这两部分数据分别存放在不同的块,权限和属性放在i ...

  9. Objective - C 之类目

    一.类目(category):为已有的类(可以是系统类,也可以是自定义类)添加公有的新的方法: 例如:为系统已有的NSString类添加一个比较字符串大小的方法 1.创建过程: 2.NSString ...

  10. 在线webservice

    腾讯QQ在线状态 WEB 服务Endpoint: http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx Disco: http:// ...