SP4487 GSS6 - Can you answer these queries VI
题目大意
给出一个由N个整数组成的序列A,你需要应用M个操作:
I p x在 p 处插入插入一个元素 xD p删除 p 处的一个元素R p x修改 p 处元素的值为 xQ 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.
输入输出样例
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
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的更多相关文章
- 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 ...
- SPOJ GSS6 Can you answer these queries VI ——Splay
[题目分析] 增加了插入和删除. 直接用Splay维护就好辣! 写了一个晚上,(码力不精),最后发现更新写挂了 [代码] #include <cstdio> #include <cs ...
- 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取替 ...
- 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 ...
- SPOJ 4487. Can you answer these queries VI splay
题目链接:点击打开链接 题意比較明显,不赘述. 删除时能够把i-1转到根,把i+1转到根下 则i点就在 根右子树 的左子树,且仅仅有i这一个 点 #include<stdio.h> #in ...
- 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 ...
- 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 ...
- hdu 4027 Can you answer these queries?
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4027 Can you answer these queries? Description Proble ...
- GSS4 2713. Can you answer these queries IV 线段树
GSS7 Can you answer these queries IV 题目:给出一个数列,原数列和值不超过1e18,有两种操作: 0 x y:修改区间[x,y]所有数开方后向下调整至最近的整数 1 ...
随机推荐
- Ajax的用法
1 Ajax是什么 1.1 Asynchronous JavaScript and XML(异步的javascript和xml) 实质为:使用浏览器内置的一个对象(XmlHttpRequest)向服务 ...
- 服务器端数据合法性验证:签名sign和口令token原理
有时候,你也许会想: 我写的接口,那别人要是知道url,并且知道其需要的数据结构和逻辑,那不是都可以访问了? 甚至是,客户点传递过来的数据,是不是被恶意修改了? 这时,我们可能需要“验证”一下.比如: ...
- WPF编程,通过Double Animation动态旋转控件的一种方法。
原文:WPF编程,通过Double Animation动态旋转控件的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/art ...
- ubuntu12.04安装OVS
1.下载openVswitch ovs官网 2.运行如下脚本 #!/bin/bash cd /home/sdn/ovs/openvswitch- rm /usr/local/etc/openvswit ...
- [原创]STM32 BOOT模式配置以及作用
一.三种BOOT模式介绍 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存.用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启 ...
- libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint
Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Bo ...
- 使用 idea 的Bookmarks(书签)功能
https://blog.csdn.net/qq_36376059/article/details/80277767
- SpringMVC RestTemplate的几种请求调用
转载:https://blog.csdn.net/ThinkingLink/article/details/45366777 1.用统一的方法模板进行四种请求:POST,PUT,DELETE,GET ...
- Harbor私有镜像仓库无坑搭建
转载:https://k8s.abcdocker.com/kubernetes_harbor.html 一.介绍 Docker容器应用的开发和运行路不开可靠的镜像管理,虽然Docker官方也提供了公共 ...
- 软件测试_APP测试_兼容性测试
APP的兼容测试主要就是测试APP的安装.启动.运行.卸载测试,以及安装时间 .启动时间.CPU占用.内存占用.流量耗用.电量耗用等性能上的测试. 兼容性测试点: 一.内部兼容性: 1.与本地和其他主 ...