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. 使用Git提交与管理代码

    要成为一个合格的码农,必须要有效对自己的代码进行管理,最近打算有空就整理一下自己以前写得代码,把不涉及实验室的机密的内容等放到github上,之前只知道git clone 别人的代码,希望有一天自己的 ...

  2. Web性能测试篇:AB 压力测试

    1. 压力测试的概念\定义 1.这段话是给刚接触\学习性能测试知识的初学者,在实际工作中都会接触到性能测试.压力测试.负载测试等专业名词也容易混淆,下面带大家熟悉下这到底是怎么定义: 1.1.性能测试 ...

  3. POJ 3579 Median 二分加判断

    Median Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12453   Accepted: 4357 Descripti ...

  4. [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题

    题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...

  5. Leetcode_2. Add_Two_Number

    2. Add_Two_Number 用两个非空链表分别表示两个非负整数,链表的节点表示数字的位,链表头表示数字的低位,链表尾表示数字高位.求两个链表所表示数字的和. 比如: Input: (2 -&g ...

  6. scrapy+selenium+chromedriver解析动态渲染页面

    背景:动态页面是页面是通过js代码渲染出来的,无法直接使用scrapy爬虫,这是就需要先把js代码转为静态的html,再用scrapy爬虫就可以解决 解决办法:增加SeleniumMiddleware ...

  7. Amazon及其亏本诱饵策略还能坚持多久?

    Amazon 刚刚公布了最新的财报,亏损 4100 万美元.这是这家电子商务巨头连续 5 个季度以来的第 3 次亏损.但是华尔街似乎却一片叫好声,当日 Amazon 的股价也涨了近 8 个点达 359 ...

  8. 4. 基本socket函数

    一.创建socket /* 创建一个socket */ int socket(int family, int type, int protocol); /* 参数说明 */ // domain:使用哪 ...

  9. 2017软工 — 每周PSP

    1. PSP表格 2. PSP饼图 3. 本周进度条 4. 累计折线图

  10. 线段树---poj3468 A Simple Problem with Integers:成段增减:区间求和

    poj3468 A Simple Problem with Integers 题意:O(-1) 思路:O(-1) 线段树功能:update:成段增减 query:区间求和 Sample Input 1 ...