Subseq
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的更多相关文章
- 2018牛客网暑假ACM多校训练赛(第五场)H subseq 树状数组
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-H.html 题目传送门 - https://www.no ...
- 2018牛客多校第五场 H.subseq
题意: 给出a数组的排列.求出字典序第k小的b数组的排列,满足1<=bi<=n,bi<bi+1,a[b[i]]<a[b[i+1]],m>0. 题解: 用树状数组倒着求出以 ...
- 牛客网多校第5场 H subseq 【树状数组+离散化】
题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...
- LeetCode "Wiggle Subsequence" !
Another interesting DP. Lesson learnt: how you define state is crucial.. 1. if DP[i] is defined as, ...
- Extract Fasta Sequences Sub Sets by position
cut -d " " -f 1 sequences.fa | tr -s "\n" "\t"| sed -s 's/>/\n/g' & ...
- HDU #5507 GT and Strings
这是AC自动机系列的第一篇 传送门 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Othe ...
- 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 三维几 ...
- ACM-ICPC竞赛模板
为了方便打印,不再将代码放到代码编辑器里,祝你好运. ACM-ICPC竞赛模板(1) 1. 几何 4 1.1 注意 4 1.2 几何公式 4 1.3 多边形 6 1.4 多边形切割 9 1.5 浮点函 ...
- *[topcoder]LongWordsDiv2
http://community.topcoder.com/stat?c=problem_statement&pm=13147 此题关键在于发现ABAB的组合最多有26*26种,可以穷举,然后 ...
随机推荐
- Unity ScriptableObject自定义属性显示
1. 继承Editor,重写OnInspectorGUI方法 Editor官方文档 需求 将TestClass中intData属性和stringData按指定格式显示. 实现 定义一个测试类TestC ...
- nodejs express 加载html模板
在nodejs中如使用express框架,她默认的是ejs和jade渲染模板.由于我在使用的时候觉得她的代码书写方式很不爽还是想用html的形式去书写,于是我找了使用了html模板. 直接上代码,主要 ...
- 解决xampp启动mysql失败
进入到注册表内 命令:regedit 进入到路径:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL 修改路径为:" ...
- 袋鼠云研发手记 | 数栈·开源:Github上400+Star的硬核分布式同步工具FlinkX
作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...
- springboot集成jpa,在postgresql数据库中创建主键自增表
依赖文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...
- 一个简单的rest_framework demo
models.py from django.db import models class UserInfo(models.Model): username = models.CharField(max ...
- DOM实战
作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 视频来源:https://www.bil ...
- 如何理解IPD+CMMI+Scrum一体化研发管理解决方案之Scrum篇
如何快速响应市场的变化,如何推出更有竞争力的产品,如何在竞争中脱颖而出,是国内研发企业普遍面临的核心问题,为了解决这些问题,越来越多的企业开始重视创新与研发管理,加强研发过程的规范化,集成产品开发(I ...
- Leftmost Digit(数学)
Description Given a positive integer N, you should output the leftmost digit of N^N. Input The inp ...
- Linux发行版本应用场景
如果你是一个Linux爱好者,想选择一个桌面系统,并且既不想用盗版,又不想花太多钱购买商业系统软件,那么可以选择Ubuntu桌面系统.如果你需要服务器端的Linux系统,想用一个比较稳定的服务器系统, ...