题目大意

给出一个由N个整数组成的序列A,你需要应用M个操作:

  • I p x 在 p  处插入插入一个元素 x
  • D p 删除 p 处的一个元素
  • R p x 修改 p 处元素的值为 x
  • Q l r 查询一个区间[l,r]的最大子段和

输入格式

第一行一个数N,表示序列的长度

第二行N个数,表示初始序列A

第三行一个数M,表示操作的次数

接下来的M行,每行一个操作,格式见题目描述

输出格式

输出若干行,每行一个整数,表示查询区间的最大子段和

感谢@Anoxiacxy 提供的翻译

题目描述

Given a sequence A of N (N <= 100000) integers, you have to apply Q (Q <= 100000) operations:

Insert, delete, replace an element, find the maximum contiguous(non empty) sum in a given interval.

输入输出格式

输入格式:

The first line of the input contains an integer N.
The following line contains N integers, representing the starting
sequence A1..AN, (|Ai| <= 10000).

The third line contains an integer Q. The next Q lines contains the operations in following form:

I x y: insert element y at position x (between x - 1 and x).
D x : delete the element at position x.
R x y: replace element at position x with y.
Q x y: print max{Ai + Ai+1 + .. + Aj | x <= i <= j <= y}.

All given positions are valid, and given values are between -10000 and +10000.

The sequence will never be empty.

输出格式:

For each "Q" operation, print an integer(one per line) as described above.

输入输出样例

输入样例#1:

5
3 -4 3 -1 6
10
I 6 2
Q 3 5
R 5 -4
Q 3 5
D 2
Q 1 5
I 2 -10
Q 1 6
R 2 -1
Q 1 6
输出样例#1:

8
3
6
3
5

Solution:

  某天下午和机房巨佬们比赛做这题谁最快AC,巨恶心。

  题意毫无思维难度,写一个平衡树就好了,关键是信息的维护情况贼多,在更新子树信息时要把所有的情况都考虑到,然后就比较码农了。

代码:

/*Code by 520 -- 10.18*/
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
using namespace std;
const int N=;
int n,m,root,ch[N][],rnd[N],date[N],cnt,siz[N];
int lf[N],rf[N],maxn[N],sum[N]; int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-') x=getchar();
if(x=='-') x=getchar(),f=;
while(x>=''&&x<='') a=(a<<)+(a<<)+(x^),x=getchar();
return f?-a:a;
} il int newnode(int v){
++cnt;
siz[cnt]=,maxn[cnt]=sum[cnt]=date[cnt]=v,rnd[cnt]=rand(),lf[cnt]=rf[cnt]=max(date[cnt],);
return cnt;
} il void up(int rt){
siz[rt]=siz[ch[rt][]]+siz[ch[rt][]]+;
sum[rt]=date[rt]+sum[ch[rt][]]+sum[ch[rt][]];
if(ch[rt][]&&ch[rt][]){
lf[rt]=max(lf[ch[rt][]],date[rt]+sum[ch[rt][]]+lf[ch[rt][]]);
rf[rt]=max(rf[ch[rt][]],date[rt]+sum[ch[rt][]]+rf[ch[rt][]]);
maxn[rt]=max(lf[ch[rt][]]+date[rt]+rf[ch[rt][]],max(maxn[ch[rt][]],maxn[ch[rt][]]));
}
else if(ch[rt][]) lf[rt]=max(max(,lf[ch[rt][]]),sum[ch[rt][]]+date[rt]),rf[rt]=max(,date[rt]+rf[ch[rt][]]),maxn[rt]=max(maxn[ch[rt][]],rf[ch[rt][]]+date[rt]);
else if(ch[rt][]) rf[rt]=max(max(,rf[ch[rt][]]),date[rt]+sum[ch[rt][]]),lf[rt]=max(,date[rt]+lf[ch[rt][]]),maxn[rt]=max(maxn[ch[rt][]],date[rt]+lf[ch[rt][]]);
else maxn[rt]=date[rt],lf[rt]=rf[rt]=max(date[rt],); } int merge(int x,int y){
if(!x||!y) return x+y;
if(rnd[x]<rnd[y]) {ch[x][]=merge(ch[x][],y),up(x);return x;}
else {ch[y][]=merge(x,ch[y][]),up(y);return y;}
} void split(int rt,int v,int &x,int &y){
if(!rt) {x=y=;return;}
if(siz[ch[rt][]]>=v) y=rt,split(ch[rt][],v,x,ch[y][]),up(y);
else x=rt,split(ch[rt][],v-siz[ch[rt][]]-,ch[x][],y),up(x);
} il void ins(int k,int v){
int x,y; split(root,k-,x,y);
root=merge(merge(x,newnode(v)),y);
} il void del(int k){
int x,y,z; split(root,k-,x,y),split(y,,y,z);
root=merge(x,z);
} il void change(int k,int v){
int x,y,z; split(root,k-,x,y),split(y,,y,z);
root=merge(merge(x,newnode(v)),z);
} il int query(int l,int r){
int x,y,z,ans; split(root,r,x,y),split(x,l-,x,z);
ans=maxn[z];
root=merge(merge(x,z),y);
return ans;
} int main(){
n=gi(); char opt[];int x,y;
For(i,,n) ins(i,gi());
m=gi();
while(m--){
scanf("%s",opt),x=gi();
if(opt[]=='I') y=gi(),ins(x,y);
else if(opt[]=='D') del(x);
else if(opt[]=='R') y=gi(),change(x,y);
else y=gi(),printf("%d\n",query(x,y));
}
return ;
}
 
 
 

SP4487 GSS6 - Can you answer these queries VI的更多相关文章

  1. SPOJ GSS6 Can you answer these queries VI

    Can you answer these queries VI Time Limit: 2000ms Memory Limit: 262144KB This problem will be judge ...

  2. SPOJ GSS6 Can you answer these queries VI ——Splay

    [题目分析] 增加了插入和删除. 直接用Splay维护就好辣! 写了一个晚上,(码力不精),最后发现更新写挂了 [代码] #include <cstdio> #include <cs ...

  3. GSS6 4487. Can you answer these queries VI splay

    GSS6 Can you answer these queries VI 给出一个数列,有以下四种操作: I x y: 在位置x插入y.D x  : 删除位置x上的元素.R x y: 把位置x用y取替 ...

  4. spoj 4487. Can you answer these queries VI (gss6) splay 常数优化

    4487. Can you answer these queries VI Problem code: GSS6 Given a sequence A of N (N <= 100000) in ...

  5. SPOJ 4487. Can you answer these queries VI splay

    题目链接:点击打开链接 题意比較明显,不赘述. 删除时能够把i-1转到根,把i+1转到根下 则i点就在 根右子树 的左子树,且仅仅有i这一个 点 #include<stdio.h> #in ...

  6. kuangbin专题七 HDU4027 Can you answer these queries? (线段树)

    A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use ...

  7. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  8. hdu 4027 Can you answer these queries?

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4027 Can you answer these queries? Description Proble ...

  9. GSS4 2713. Can you answer these queries IV 线段树

    GSS7 Can you answer these queries IV 题目:给出一个数列,原数列和值不超过1e18,有两种操作: 0 x y:修改区间[x,y]所有数开方后向下调整至最近的整数 1 ...

随机推荐

  1. Android 自定义底部公用菜单

    注释:此案例主要展示自定义底部菜单,一处封装处处调用.使用起来相当方便 一.初始的Activity package com.example.myapi.buttommenu; import andro ...

  2. [浅谈CSS核心概念] CSS布局模型:float和position

    1.流动模型 HTML元素在默认情况下都是按照"流动模型"进行布局的,网上也有人称之为"普通流"."文档流"之类的.这种布局模式的特点在于: ...

  3. CAN总线学习总结——错误帧和错误状态

    CAN总线学习总结——错误帧和错误状态 标签: 数据 / 错误帧 / 错误状态 / CAN总线 / 总线协议 253 一.五种CAN总线可能发生的错误 1.CRC错误: 接收节点计算出的CRC校验值, ...

  4. NYOJ 35 表达式求值

    一个模板了 哈哈. 这题由于已经包括了整形.浮点形了,以后也不须要特别处理了. /* 这里主要是逆波兰式的实现,使用两个stack 这里用字符串来模拟一个stack,第一步,将中缀表达式转变为后缀表达 ...

  5. [Baltic 2011]Lamp BZOJ2346

    分析: 建图最短路,比较裸. 我们可以考虑,如果是‘\’那么,左上连右下边权为0,左下连右上边权为1,反之亦然. 卡裸spfa,加点优化能过,我就直接改成的堆优化Dijkstra 附上代码: #inc ...

  6. 2PC AND 3PC

    一.分布式数据一致性 在分布式系统中,为了保证数据的高可用,通常会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上. (1)什么是数据一致性 在数据有多份副本的情况下,如果网络 ...

  7. jQuery对底部导航进行跳转并高亮显示

    这两天弄一个mui的底部菜单,有点费时了,尝试了用vue写,纯js写,还有根据mui的写,还是有些问题和麻烦.直到看了网上的一些例子,才想明白,之前一直是一种点击触发事件才高亮的思维去做,这个虽然可以 ...

  8. python基础4之递归、lambda、深浅copy

    内容概要: 一.递归 二.匿名函数 三.关于python中的深浅拷贝与赋值 一.递归 递归就是函数本身调用自己,直到满足指定条件之后一层层退出函数 递归特性: 必须有一个明确的结束条件 每次进入更深一 ...

  9. mfc 类型间的强制转换

    一. static_cast运算符 用法:static_cast < type-id > ( expression ) 该运算符把expression 转换为type-id类型,但没有运行 ...

  10. libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint

    Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Bo ...