题目大意

给出一个由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. day53

    JS常用类 一.Number 1.常用数字 整数:10 小数:3.14 科学计数法:1e5 | 1e-5 正负无穷:Infinity | -Infinity 2.常用进制 二进制:0b1010 八进制 ...

  2. 20155338《网络对抗》Exp3 免杀原理与实践

    20155338<网络对抗>Exp3 免杀原理与实践 实验过程 一.免杀效果参考基准 Kali使用上次实验msfvenom产生后门的可执行文件,上传到老师提供的网址http://www.v ...

  3. Bluedroid协议栈HCI线程分析

    蓝牙进程中有多个线程,其中HCI 线程是负责处理蓝牙主机端和控制器的数据处理和收发的工作. 本篇文章就是分析一下该线程的数据处理流程. 1.跟HCI相关的接口 首先看看hci的相关的接口:在hci_l ...

  4. CS50.3

    1,int()取整函数 2,RPG(role playing game )角色扮演游戏 3,代码写了,要跑,需要compiler (编译器) 4,CLI(command-line interface) ...

  5. Asp.Net_Ajax调用WebService返回Json前台获取循环解析

    利用JQuery的$.ajax()可以很方便的调用 asp.net的后台方法.但往往从后台返回的json字符串不能够正确解析,究其原因,是因为没有对返回的json数据做进一步的加工.其实,这里只需 要 ...

  6. Selenium+Python自动化测试环境搭建和搭建过程遇到的问题解决

    环境搭建: 第一步:安装Python  网址:https://www.python.org/ 按照如图提示安装,并且配置环境变量(安装时候选中pip会自动安装Python的包管理工具 pip,推荐选择 ...

  7. 初识kibana

    前言: 什么是Kibana?? Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的.你可以用kibana搜索.查看.交互存放在Elasticsearch索引里 ...

  8. Redis学习笔记之入门基础知识——五种数据类型

    1) 字符串 SET设置值,GET获取值,DEL删除值 INCR key-name将键存储的值加上1       DECR key-name将键存储的值减去1 INCRBY key-name amou ...

  9. Linux第五章笔记

    5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层. 主要作用有: 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都需要运行在虚拟机内 5.2 AP ...

  10. 《Linux内核设计与实现》第5章读书整理

                                 <第五章 系统调用>笔记 5.1 与内核通信 系统调用在用户空间和硬件设备之间提供了一个中间层. 中间层的作用: 为用户空间提供一 ...