【题目分析】

增加了插入和删除。

直接用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. 学习笔记——Paint 1(MaskFilter)

    对于Paint没有很好的深入的学习过,在工作之余再巩固巩固. 1.Paint的BlurMaskFilter(模糊效果) 自定义一个View继承View 重写里面的onDraw方法.这里直接上代码了: ...

  2. VirtualKD + Windbg 调试Win10虚拟机

    安装完vminstall后,先在运行中输入"msconfig"命令,显示如下窗口. 首先点击“引导”选项卡,然后选择最后一个引导项(Disable Signature Enforc ...

  3. Alpha-beta pruning

    function alphabeta(node, depth, α, β, maximizingPlayer) or node is a terminal node return the heuris ...

  4. COGS 36. 求和问题

    时间限制:1.2 s   内存限制:128 MB [问题描述]     在一个长度为n的整数数列中取出连续的若干个数,并求它们的和. [输入格式]     输入由若干行组成,第一行有一个整数n    ...

  5. [Q&A]VS 2012 MVC4专案与网站的差异?「ASP.NET组态」的Login账号出现在「新旧两组」会员数据库里面?

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/30/mvc4_vs2012_login_member_db.aspx [Q&a ...

  6. 目后佐道IT教育:师资团队

    高端技术顾问 1. leepoor 拥有12年的Web开发和架构经验,在阿里巴巴担任高级架构师,参与阿里巴巴基础技术平台开发和www.alibaba.com架构设计.擅长大型网站技术架构,工作中经常使 ...

  7. App Transport Security has blocked a cleartext HTTP

    打开info.plist源代码复制粘贴     <key>NSAppTransportSecurity</key>     <dict> <!--Includ ...

  8. Active Directory网域

    Active Directory网域 3.1Windows网络的管理方式 3.1.1工作组模式 工作组由一组用网络连接在一起的计算机组成,他们将计算机内的资源共享给用户访问.工作组网络也被称为“对等式 ...

  9. remote: Incorrect username or password ( access token ) fatal: Authentication failed for

    gitee推送到远程仓库时提示错误remote: Incorrect username or password ( access token )fatal: Authentication failed ...

  10. ssh 免密码登录 与 密钥公钥原理讲解

    前言 由于最近频繁需要登录几个服务器,每次登录都需要输入密码,故相对麻烦. 由于个人服务器用于实验,故对安全性要求不是很高,故想实现ssh免密登录. 通过阅读ssh 公钥私钥认证操作及原理以及ssh公 ...