题目大意

给出一个由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. python3 raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 403: Forbid

    1.分析: 如果用 urllib.request.urlopen 方式打开一个URL,服务器端只会收到一个单纯的对于该页面访问的请求,但是服务器并不知道发送这个请求使用的浏览器,操作系统,硬件平台等信 ...

  2. shell编程的笔记

    关于历史命令 Shell相关 !! 是上一次执行的命令 !字符串  指执行最近一次以这个字符串开头的命令 !$ 取出上一条命令最后一个单词或命令 *匹配0个或多个字符         ?匹配一个字符 ...

  3. CAN总线学习系列之三——CAN控制器的选择

    CAN总线学习系列之三——CAN控制器的选择 在进行CAN总线开发前,首先要选择好CAN总线控制器.下面就比较一些控制器的特点. 一些主要的CAN总线器件产品 制造商 产品型号 器件功能及特点 Int ...

  4. 2017-2018-2 20155315《网络对抗技术》免考五:Windows提权

    原理 使用metasploit使目标机成功回连之后,要进一步攻击就需要提升操作权限.对于版本较低的Windows系统,在回连的时候使用getsystem提权是可以成功的,但是对于更高的系统操作就会被拒 ...

  5. face_recognition环境配置及命令行工具测试

    由于某种不可抗力(又是它!)我写了这篇博客,主要目的是记录. face_recognition是啥子? face_recognition号称世界上最简单的人脸识别库,可使用 Python 和命令行进行 ...

  6. 微信小程序 Echarts 异步数据更新

    微信小程序 Echarts 异步数据更新的练习,被坑了很多次,特作记录. 作者:罗兵 地址:https://www.cnblogs.com/hhh5460/p/9989805.html 0.效果图   ...

  7. 【HNOI2016】网络

    题面 题解 考虑整体二分. 定义整体二分函数solve(l, r, ql, qr)表示操作权值在\([l, r]\)中,对\([ql, qr]\)的询问进行二分. 这样的话check就会很简单,先按照 ...

  8. Linux Mint安装Docker踩坑指南

    我家的服务器选用的Linux Mint系统,最近安装Docker的时候踩了一些小坑,但是总体还算顺利. 我们都知道Linux Mint系统是基于Ubuntu的,说实话用起来感觉还是很不错的,安装Doc ...

  9. 基于.NET Standard的分布式自增ID算法--Snowflake

    概述 本篇文章主要讲述分布式ID生成算法中最出名的Snowflake算法.搞.NET开发的,数据库主键最常见的就是int类型的自增主键和GUID类型的uniqueidentifier. 那么为何还要引 ...

  10. OD之去除nag弹窗(四)

    在某些方面,一个软件如果没有注册的话,老是会弹出烦人的注册弹窗,就如下图一样: 出现了两次弹窗,开始一次,关闭后又一次,老办法,拖进OD进行分析;不过看出程序很简单,就出现了messagebox的调用 ...