题目大意

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

操作一:将第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. 利用正则将xml数据解析为数组

    function xml_to_array( $xml ) { $reg = '/<(\w+)[^>]*>([\x00-\xFF]*)<\/\1>/'; if(preg_ ...

  2. C#过时方法标记

    1.当遇到过时或废弃的方式 函数怎么办 [Obsolete]特性解决你的困惑 1.1:当方法已经完成相关兼容 可以保留时

  3. vue报错-Error: Cannot find module '@babel/core'

    vue之webpack实战的时候遇到报错,Error: Cannot find module '@babel/core' 这报错,我百度了很久,后来发现报错里面有提示,发现是我的 babel-load ...

  4. redis 在windows 集群

    前言:为什么自己要花时间写一篇redis集群文章,网上众多的文章大都是思路正确,但是细节不足,这里写一篇文章记录自己部署时候遇到的问题,当下次再部署的时候避免跳入重复的坑. 上篇文章(http://w ...

  5. Java快速读取大文件

    Java快速读取大文件 最近公司服务器监控系统需要做一个东西来分析Java应用程序的日志. 第一步探索: 首先我想到的是使用RandomAccessFile,因为他可以很方便的去获取和设置文件指针,下 ...

  6. linux 10201 ASM RAC 安装+升级到10205

    准备环境的时 ,要4个对外IP,2个对内IP 不超过2T,,一般都用OCFS 高端存储适合用ASM linux10G安装的时候,安装的机器时间要小于等于(如果是等于要严格等于)第二个机器的时间(只有l ...

  7. Python游戏开发入门

    Pygame简介与安装 1.Pygame安装 pip install pygame2.检测pygame是否安装成功 python -m pygame.examples.aliens Pygame最小开 ...

  8. flask的基本搭建

    from flask import Flask app = Flask(__name__) @app.route("/")def index(): return "ok& ...

  9. Lodash数组方法中文总结

    LodashAPI总结 Lodash是一个特别特别好用的工具,感觉有了Lodash就没有解决不了的问题了~~~~ 使用初开始 官网 https://www.lodashjs.com/docs/4.17 ...

  10. 安装钩子 SetWindowsHookE

    SetWindowsHookEx 函数将应用程序定义的钩子安装到一个钩链.要将安装一个钩子来监测系统的某些类型的事件.这些事件是与特定的线程或所有线程中调用线程作为同一桌面相关联. Syntax HH ...