题目:http://www.spoj.com/problems/GSS6/

题意:给一个长度为n的数组,然后给出Q个4种操作,分别是:删除,插入,替换,查找指定区间连续最大和。

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N = 200005;
const int INF = 1<<28;
int a[N];
struct Node
{
int val,sz;
int sum,ml,mr,mc;
Node *pre,*ch[2];
};
class Splay
{
public:
Node *null,*root,*S[N],data[N];
int cnt,top;
Node *getNewNode(int x)
{
Node *p;
if(top) p = S[top--];
else    p = &data[cnt++];
p->val = p->sum = p->ml = p->mr = p->mc = x;
p->sz = 1;
p->ch[0] = p->ch[1] = p->pre = null;
return p;
}
void init()
{
cnt = top = 0;
null = getNewNode(-INF);
null->sum = null->sz = 0;
root = getNewNode(-INF);
root->sum = 0;
root->ch[1] = getNewNode(INF);
root->ch[1]->sum = 0;
root->ch[1]->pre = root;
update(root);
}
void update(Node *p)
{
p->sz = p->ch[0]->sz + p->ch[1]->sz + 1;
p->sum = p->ch[0]->sum + p->ch[1]->sum + p->val;
p->ml = max(p->ch[0]->ml,p->ch[0]->sum + p->val + max(p->ch[1]->ml,0));
p->mr = max(p->ch[1]->mr,p->ch[1]->sum + p->val + max(p->ch[0]->mr,0));
p->mc = max(p->ch[0]->mc,p->ch[1]->mc);
p->mc = max(p->mc,max(p->ch[0]->mr + p->ch[1]->ml,0) + p->val);
p->mc = max(p->mc,max(p->ch[0]->mr,p->ch[1]->ml) + p->val);
}
void rotate(Node *x,int c)
{
Node *y = x->pre;
y->ch[!c] = x->ch[c];
if(x->ch[c] != null)
x->ch[c]->pre = y;
x->pre = y->pre;
if(y->pre != null)
{
if(y->pre->ch[0] == y)
y->pre->ch[0] = x;
else
y->pre->ch[1] = x;
}
x->ch[c] = y;
y->pre = x;
if(y == root)
root = x;
update(y);
}
void splay(Node *x,Node *f)
{
while(x->pre != f)
{
if(x->pre->pre == f)
rotate(x,x->pre->ch[0] == x);
else
{
Node *y = x->pre;
Node *z = y->pre;
if(z->ch[0] == y)
{
if(y->ch[0] == x)
rotate(y,1),rotate(x,1);
else
rotate(x,0),rotate(x,1);
}
else
{
if(y->ch[1] == x)
rotate(y,0),rotate(x,0);
else
rotate(x,1),rotate(x,0);
}
}
}
update(x);
}
void select(int k,Node *f)
{
int tmp;
Node *t = root;
while(true)
{
tmp = t->ch[0]->sz;
if(tmp + 1 == k) break;
if(k <= tmp) t = t->ch[0];
else
{
k -= tmp + 1;
t = t->ch[1];
}
}
splay(t,f);
}
void insert(int pos,int val)
{
Node *tmproot = getNewNode(val);
select(pos-1,null);
select(pos,root);
root->ch[1]->ch[0] = tmproot;
tmproot->pre = root->ch[1];
splay(root->ch[1],null);
}
void del(int k)
{
select(k,null);
Node *old_root = root;
root = root->ch[1];
root->pre = null;
select(1,null);
root->ch[0] = old_root->ch[0];
root->ch[0]->pre = root;
update(root);
S[++top] = old_root;
}
void replace(int x,int y)
{
select(x,null);
root->val = y;
update(root);
}
Node *build(int l,int r)
{
if(l>r) return null;
int m = (l + r) >> 1;
Node *p = getNewNode(a[m]);
p->ch[0] = build(l,m-1);
if(p->ch[0] != null)
p->ch[0]->pre = p;
p->ch[1] = build(m+1,r);
if(p->ch[1] != null)
p->ch[1]->pre = p;
update(p);
return p;
}
};
Splay sp;
int main()
{
char c;
int n,m,x,y;
sp.init();
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
Node *troot = sp.build(1,n);
sp.root->ch[1]->ch[0] = troot;
troot->pre = sp.root->ch[1];
sp.update(sp.root->ch[1]);
sp.update(sp.root);
sp.splay(sp.root->ch[1],sp.null);
scanf("%d",&m);
for(int i = 1; i <= m ; i++)
{
scanf(" %c",&c);
if(c == 'I')
{
scanf("%d %d",&x,&y);
sp.insert(++x,y);
}
else if(c == 'D')
{
scanf("%d",&x);
sp.del(++x);
}
else if(c == 'R')
{
scanf("%d %d",&x,&y);
sp.replace(++x,y);
}
else if(c == 'Q')
{
scanf("%d %d",&x,&y);
sp.select(++x - 1,sp.null);
sp.select(++y + 1,sp.root);
printf("%d\n",sp.root->ch[1]->ch[0]->mc);
}
}
return 0;
}

SPOJ4487(Splay树)相关推荐

  1. AVL树、splay树(伸展树)和红黑树比较

    AVL树.splay树(伸展树)和红黑树比较 一.AVL树: 优点:查找.插入和删除,最坏复杂度均为O(logN).实现操作简单 如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实 ...

  2. poj 3468 Splay 树

    大二上的时候.写过一个AVL的操作演示,今天一看Splay.发现和AVL事实上一样,加上线段树的基础,懒惰标记什么都知道.学起来轻松很多哦 我參考的模板来自这里  http://blog.csdn.n ...

  3. [Splay伸展树]splay树入门级教程

    首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角.. 首先引入一下splay的概念,他的中文名是伸展树,意思差不多就是可以随意翻转的二叉树 PS:百度百科中伸展树读作:BoGa ...

  4. 平衡树【Splay树】学习小记

    简介 平衡树,顾名思义,平衡的搜索二叉树. 常见的平衡树都能将树的深度保持在 lg ⁡ n \lg_n lgn​ 的级别内,防止退化成链. 一些平衡树可以通过旋转.分裂.合并等操作完成更加高级的.二叉 ...

  5. 8.1 Splay树

    参考博客: https://blog.csdn.net/hellochenlu/article/details/53022709 参考博客: https://blog.csdn.net/amoscyk ...

  6. HNOI 2002 营业额统计(Splay树)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 6923  Solved: 2286 [Submit][St ...

  7. UVA_11922 Permutation Transformer 【splay树】

    一.题目 UVA11922 二.分析 为什么会有伸展树? 伸展树与AVL的区别除了保持平衡的方式不同外,最重要的是在每次查找点时,让该点旋转到根结点,这里可以结合计算机里的局部性原理思考. 伸展树有什 ...

  8. bzoj2733 永无乡 splay树的启发式合并

    https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...

  9. Splay树各操作--数组

    伸展树删除元素非常方便.. View Code #include <stdio.h>#include <string.h>#include <algorithm># ...

最新文章

  1. 24点c语言程序,C语言解24点游戏程序
  2. java 任意多个整数相加_一个整数分为若干个连续整数之和(使用java实现)
  3. 行业 平均年龄_2019中国“新生力”白皮书:平均年龄35岁,千万资产家庭达198万户!...
  4. wso2_使用WSO2 ESB进行邮件内容过滤
  5. php与mysql同步_php实现mysql同步的实现方法
  6. MATLAB与图像处理(二):批处理读取多张图片,cell
  7. Vue Webpack常见问题(持续更新)
  8. 实现算法2.11、2.12的程序
  9. ASP.NET Core 3.0 实战:构建多版本 API 接口
  10. MPLS ××× 基本实验测试
  11. CentOS安装并设置MariaDB
  12. 树莓派LINUX内核移植
  13. 【软技能】完全写作指南--演讲幻灯片
  14. 论文阅读SG-PBFT: a Secure and Highly Efficient Blockchain PBFT Consensus Algorithm for IoV
  15. SASS的安装及简单操作
  16. 100-days: twenty-five
  17. 无线局域网和蜂窝移动网络_为什么 iPhone 的数据流量叫做「蜂窝移动网络」?...
  18. 高级计量经济学及stata应用 陈强 2021年5月1-5日 社会科学 经济学 管理学 金融 医学等各个领域
  19. 如何使用计算机远程电脑,如何远程控制电脑?手把手教你一个简单办法
  20. 【转载】SQL Server dateTime类型 模糊查询

热门文章

  1. 对称加密-DES解密
  2. GraphQL入门之什么是GraphQL?
  3. ES6新特性之let和const命令
  4. MyBatis二级缓存的关闭
  5. apollo数据库安装与常见错误说明
  6. Dubbo-Dependency
  7. redis(15)--复制
  8. CountDownLatch应用及原理
  9. 从零开始撸一个Fresco之内存缓存
  10. Android打包(一)