题目大意

维护一个序列,支持两种操作

操作一:将第x个元素的值修改为y

操作二:询问区间【x,y】内的元素的最大值

解题分析

splay的区间操作,事先加入两个编号最小和最大的点防止操作越界。

具体的区间操作类似于线段树。

参考程序

#include <bits/stdc++.h>
using namespace std;
const int INF=2000000000;
const int N=200008;
int a[N]; class splay_tree
{
public:
struct node
{
int id,val,mx;
node *l,*r,*f;
node(int _id=0,int _val=0,int _mx=0,node *_f=NULL,node *_l=NULL,node *_r=NULL):
mx(_mx),id(_id),val(_val),f(_f),l(_l),r(_r){}
}*rt;
void pushup(node *x)
{
node *l=x->l,*r=x->r;
x->mx=x->val;
if (l) x->mx=max(x->mx,l->mx);
if (r) x->mx=max(x->mx,r->mx);
}
void right(node *x,node *&rt)
{
node *y=x->f,*z=y->f;
if (y==rt) rt=x; else if (y==z->l) z->l=x; else z->r=x;
if (x->r) x->r->f=y; y->f=x; x->f=z;
y->l=x->r; x->r=y;
pushup(y); pushup(x);
}
void left(node *x,node *&rt)
{
node *y=x->f,*z=y->f;
if (y==rt) rt=x; else if (y==z->l) z->l=x; else z->r=x;
if (x->l) x->l->f=y; y->f=x; x->f=z;
y->r=x->l; x->l=y;
pushup(y); pushup(x);
}
void splay(node *x,node *&rt)
{
while (x!=rt)
{
node *y=x->f,*z=y->f;
if (y==rt) if (x==y->l) right(x,rt); else left(x,rt);
else if (y==z->l) if (x==y->l) {right(y,rt);right(x,rt);} else {left(x,rt);right(x,rt);}
else if (x==y->r) {left(y,rt);left(x,rt);} else {right(x,rt);left(x,rt);}
}
}
void del(node *rt)
{
if (!rt) return;
del(rt->l);
del(rt->r);
delete rt;
}
splay_tree(){rt=NULL;}
~splay_tree()
{
del(rt);
}
void build(int l,int r,node *&x,node *f)
{
if (l>r) return;
int m=l+r>>1;
x=new node(m,a[m],a[m],f);
if (l==r) return;
build(l,m-1,x->l,x);
build(m+1,r,x->r,x);
pushup(x);
}
void find(int id,node* &rt)
{
node *x=rt;
while (x->id!=id)
{
if (id<x->id) x=x->l; else x=x->r;
}
splay(x,rt);
}
void update(int id,int val)
{
node *x=rt;
while (x->id!=id)
{
if (id<x->id) x=x->l; else x=x->r;
}
x->val=val;
splay(x,rt);
}
int query(int x,int y)
{
find(x-1,rt);
find(y+1,rt->r);
return rt->r->l->mx;
}
void visit(node *rt)
{
if (!rt) return;
cout<<" id = "<<rt->id<<" val = "<<rt->val;
cout<<" lson = "<<(rt->l?rt->l->id:0);
cout<<" rson = "<<(rt->r?rt->r->id:0)<<endl;
visit(rt->l);
visit(rt->r);
}
};
int main()
{
cin.sync_with_stdio(0);
int n,m;
while (cin>>n>>m)
{
splay_tree T;
for (int i=1;i<=n;i++) cin>>a[i];
a[0]=a[n+1]=0;
T.build(0,n+1,T.rt,NULL);
for (int i=1;i<=m;i++)
{
string s;int x,y;
cin>>s>>x>>y;
if (s[0]=='Q')
cout<<T.query(x,y)<<endl;
else
T.update(x,y);
}
}
}

HDU 1754 I Hate It (Splay 区间操作)的更多相关文章

  1. P2596 [ZJOI2006]书架 && Splay 区间操作(三)

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  2. HDU 4453:Looploop(Splay各种操作)

    http://acm.hdu.edu.cn/showproblem.php?pid=4453 题意:很多种操作:1.add x,将从光标起的 k2 个数全部加上 x:2.reverse,将从光标起的 ...

  3. hdu 1754 I Hate It (splay tree伸展树)

    hdu 1754 I Hate It 其实我只是来存一下我的splay模板的..请大牛们多多指教 #include<stdio.h> #include<string.h> #i ...

  4. P2042 [NOI2005]维护数列 && Splay区间操作(四)

    到这里 \(A\) 了这题, \(Splay\) 就能算入好门了吧. 今天是个特殊的日子, \(NOI\) 出成绩, 大佬 \(Cu\) 不敢相信这一切这么快, 一下子机房就只剩我和 \(zrs\) ...

  5. HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others)T ...

  6. hdu 1890 Robotic SortI(splay区间旋转操作)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 题解:splay又一高级的功能,区间旋转这个是用线段树这些实现不了的,这题可以学习splay的旋 ...

  7. 「BZOJ1251」序列终结者 (splay 区间操作)

    题面: 1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 5367  Solved: 2323[Submit][Status][D ...

  8. Splay 区间操作(二)

    首先基本操作如下: 删除第rank个点 void Remove(int id){//删除第rank个点 rank++; int x = find(root, rank - 1); splay(x, 0 ...

  9. Splay 区间操作

    据大佬说,\(Splay\)是序列操作之王.\(Splay\)是一种平衡树,通过伸展(\(Splay\)),在不改变中序遍历的前提下变换根的位置,从而快速的进行序列操作 \(Splay\)最常见的序列 ...

随机推荐

  1. Android图片压缩,不失真,上线项目

    当然了,图片压缩是利用了libjpeg库的基础上,牛逼的同学可以自行生成so.jar.在此给出一个链接: http://www.cnblogs.com/hrlnw/p/4403334.html 在生成 ...

  2. IIS ARR(Application Request Route)与反向代理(Reverse Proxy)

    为何要用反向代理? 这里说说我的场景, 我在服务器上假设了SVN(Visual SVN)用的端口是:8080, 而我想通过输入svn.niusys.com就可以访问我的SVN服务器,也就是要通过80端 ...

  3. SQL Server 零散笔记

    排序显示行号 select Row_Number() over(order by Code) as RowNumber,ID,Code,Name from CBO_ItemMaster 不排序显示行号 ...

  4. MyHome3D在线装修设计软件测评

    人人都是设计师 ——MyHome3D在线装修设计软件 关键词:云技术,3D呈现效果,自主设计,简单易用,家具装修设计 上海爱福窝云技术有限公司借助于前沿的3D渲染技术,降低了装修设计的门槛,真正实现了 ...

  5. jQuery 全选、全不选、反选

    <!DOCTYPE html> <html lang="en"> <head> <title></title> < ...

  6. bootparam - 介绍Linux核心的启动参数

    描叙 Linux 核心在启动的时候可以接受指定的"命令行参数"或"启动参数".在通常情况下,由于核心有可能无法识别某些硬件,或可能将某些硬件识别为不正确的配置, ...

  7. 获取select标签选中的值的三种方式

    var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = obj.selectedIndex; // 选中索引 va ...

  8. 【JavaScript从入门到精通】第一课

    第一课 初探JavaScript魅力-01 JavaScript是什么 如今我们打开一个大型的网站,都会有很多JS效果的功能和应用.对于学过CSS+HTML的同学,即使是像淘宝那样的网站,用一两天时间 ...

  9. 第1节 yarn:13、yarn资源调度的介绍

    Yarn资源调度 yarn集群的监控管理界面: http://192.168.52.100:8088/cluster jobHistoryServer查看界面: http://192.168.52.1 ...

  10. JAVA基础——设计模式之装饰者模式

    装饰模式 : 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用.    在软件设计中,对已有对象(新房)的功能进行扩展(装修).    把通用功能封装在装饰器中,用到的地方 ...