【题目分析】

增加了插入和删除。

直接用Splay维护就好辣!

写了一个晚上,(码力不精),最后发现更新写挂了

【代码】

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib> #include <map>
#include <set>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 500005
#define eps 1e-8
#define db double
#define L ch[x][0]
#define R ch[x][1]
#define ll long long
#define inf 0x3f3f3f3f
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i) void Finout()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("wa.txt","w",stdout);
#endif
} int Getint()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
} int ch[maxn][2],sum[maxn],lx[maxn],rx[maxn],mx[maxn],fa[maxn],siz[maxn],v[maxn];
int a[maxn],n,rt,q,tot; void update(int x)
{
siz[x]=siz[L]+siz[R]+1;
sum[x]=sum[L]+sum[R]+v[x];
mx[x]=lx[x]=rx[x]=v[x];
if (x==1)
{
mx[x]=mx[R];
lx[x]=lx[R];
rx[x]=rx[R];
return ;
}
if (x==n+2)
{
mx[x]=mx[L];
lx[x]=lx[L];
rx[x]=rx[L];
return ;
}
if (((!L))&&((!R))) lx[x]=rx[x]=mx[x]=sum[x]=v[x];
else if ((!L))
{
lx[x]=max(v[x],v[x]+lx[R]);
rx[x]=max(rx[R],sum[R]+v[x]);
mx[x]=max(v[x],max(mx[R],v[x]+lx[R]));
mx[x]=max(mx[x],max(lx[x],rx[x]));
}
else if ((!R))
{
lx[x]=max(lx[L],sum[L]+v[x]);
rx[x]=max(v[x],v[x]+rx[L]);
mx[x]=max(v[x],max(mx[L],rx[L]+v[x]));
mx[x]=max(mx[x],max(lx[x],rx[x]));
}
else
{
lx[x]=max(lx[L],max(sum[L]+v[x],sum[L]+v[x]+lx[R]));
rx[x]=max(rx[R],max(sum[R]+v[x],sum[R]+v[x]+rx[L]));
mx[x]=max(mx[L],max(mx[R],max(rx[L],0)+v[x]+max(lx[R],0)));
mx[x]=max(mx[x],max(lx[x],rx[x]));
}
} void rot(int x,int &k)
{
int y=fa[x],z=fa[y],l,r;
if (ch[y][0]==x) l=0; else l=1; r=l^1;
if (y==k) k=x;
else
{
if (ch[z][0]==y) ch[z][0]=x;
else ch[z][1]=x;
}
fa[x]=z; fa[y]=x; fa[ch[x][r]]=y;
ch[y][l]=ch[x][r];ch[x][r]=y;
update(y); update(x);
} void splay(int x,int &k)
{
while (x!=k)
{
int y=fa[x],z=fa[y];
if (y!=k)
{
if ((ch[z][0]==y)^(ch[y][0]==x)) rot(x,k);
else rot(y,k);
}
rot(x,k);
}
} int find(int x,int f)
{
if (f<=siz[L]) return find(L,f);
else if (f==(siz[L]+1)) return x;
else return find(R,f-siz[L]-1);
} int build(int l,int r,int lst)
{
int mid=l+r>>1;
v[mid]=a[mid]; fa[mid]=lst;
ch[mid][0]=l<mid?build(l,mid-1,mid):0;
ch[mid][1]=r>mid?build(mid+1,r,mid):0;
update(mid);
return mid;
} void debug()
{
printf("The Tree's root is %d\n",rt);
F(i,1,15) printf("Node %d : fa %d L %d R %d lx %d rx %d mx %d sum %d siz %d\n",i,fa[i],ch[i][0],ch[i][1],lx[i],rx[i],mx[i],sum[i],siz[i]);
} int fx,fy; int main()
{
Finout();
n=Getint();
F(i,1,n) a[i+1]=Getint();
rt=build(1,n+2,0); tot=n+2;
// debug();
q=Getint(); char opt[11];int x,y;
F(i,1,q)
{
scanf("%s",opt);
switch(opt[0])
{
case 'Q':
x=Getint();y=Getint();
// printf("%d %d\n",x,y);
fx=find(rt,x),fy=find(rt,y+2);
// printf("%d %d\n",fx,fy);
splay(fx,rt); splay(fy,ch[fx][1]);
printf("%d\n",mx[ch[ch[fx][1]][0]]);
update(fy); update(fx);
break;
case 'I':
++tot; x=Getint();y=Getint();
v[tot]=y;
fx=find(rt,x),fy=find(rt,x+1);
splay(fx,rt);splay(fy,ch[fx][1]);
fa[tot]=fy; ch[fy][0]=tot;
update(tot); update(fy); update(fx);
break;
case 'R':
x=Getint();y=Getint();
fx=find(rt,x+1); splay(fx,rt);
v[fx]=y;update(fx);
break;
case 'D':
x=Getint();
fx=find(rt,x); fy=find(rt,x+2);
splay(fx,rt); splay(fy,ch[fx][1]);
ch[fy][0]=0; update(fy); update(fx);
break;
}
// debug();
}
}

  

SPOJ GSS6 Can you answer these queries VI ——Splay的更多相关文章

  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 4487. Can you answer these queries VI splay

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

  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. SP4487 GSS6 - Can you answer these queries VI

    题目大意 给出一个由N个整数组成的序列A,你需要应用M个操作: I p x 在 p  处插入插入一个元素 x D p 删除 p 处的一个元素 R p x 修改 p 处元素的值为 x Q l r 查询一 ...

  6. 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 ...

  7. GSS7 spoj 6779. Can you answer these queries VII 树链剖分+线段树

    GSS7Can you answer these queries VII 给出一棵树,树的节点有权值,有两种操作: 1.询问节点x,y的路径上最大子段和,可以为空 2.把节点x,y的路径上所有节点的权 ...

  8. [题解] SPOJ GSS1 - Can you answer these queries I

    [题解] SPOJ GSS1 - Can you answer these queries I · 题目大意 要求维护一段长度为 \(n\) 的静态序列的区间最大子段和. 有 \(m\) 次询问,每次 ...

  9. SPOJ 1557. Can you answer these queries II 线段树

    Can you answer these queries II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://www.spoj.com/pr ...

随机推荐

  1. [windows]命令行关机或重启电脑

    1.关机:菜单--〉运行--〉输入:cmd--〉输入:shutdown -s -t 0 2.重启:菜单--〉运行--〉输入:cmd--〉输入:shutdown -r -t 0 (注:“-r”代表重启, ...

  2. SQL 时间日期函数

    1.获取当前日期GetDate getdate()函数以datetime数据类型的格式返回当前SQLServer服务器所在计算机的日期和时间.其语法格式为getdate().返回值舍入到最近的秒小数部 ...

  3. 记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑

    我通过这篇文章把今天工作中遇到的HTTP跨域和OPTION请求的一个坑记录下来. 场景是我需要在部署在域名a的Web应用里用JavaScript去消费一个部署在域名b的服务器上的服务.域名b上的服务也 ...

  4. map最基本操作

    #include<iostream> #include<map> using namespace std; int main() { /*map<int,char> ...

  5. LeetCode || 大杂烩w

    454. 4Sum II 题意:给四个数组,每个数组内取一个数使得四个数和为0,问有多少种取法 思路:枚举为On4,考虑两个数组,On2枚举所有可能的和,将和的出现次数存入map中,On2枚举另两个数 ...

  6. 6.python

    最早的'密码本' ascii 涵盖了英文字母大小写,特殊字符,数字.01010101ascii 只能表示256种可能,太少,创办了万国码 unicode 16表示一个字符不行,32位表示一个字符. A ...

  7. 毛毛虫组【Beta】Scrum Meeting 3

    第三天 日期:2019/6/25 前言 第三次会议: 时间:6月25日 地点:教10-A511 内容:此次会议主要是对项目验收做准备工作. 1.1 今日完成任务情况以及遇到的问题. 今日完成任务情况: ...

  8. orcal中创建和删除表空间和用户

    1.创建表空间 create tablespace NW_DATA logging datafile 'F:\oracle\product\10.2.0\oradata\nwdb\NW_DATA.db ...

  9. 实现类似AOP的封装和配置

    这是张孝祥老师Java进阶讲解中最后一个视频,就是实现类似spring中的AOP的封装和配置,特别特别小型的一个框架雏形,但是spring中的核心思想还是体现出来了,真的厉害,张老师!!! 一.重点知 ...

  10. shell脚本,文件里面的英文大小写替换方法。

    [root@localhost wyb]# cat daxiaoxie qweBNMacb eeeDFSmkl svdIOPtyu [root@localhost wyb]# cat daxiaoxi ...