题目大意

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

操作一:将第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. 基于Windows7下snort+apache+php 7 + acid(或者base) + adodb + jpgraph的入侵检测系统的搭建(图文详解)(博主推荐)

    为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习.人工智能.区域链研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机 ...

  2. WCF入门大致思路

    WCF服务: 1.IServer.cs(类似接口,WCF接口) 2.Server.svc(实现了WCF接口)右键浏览器运行可以看到WCF服务链接,类似(http://localhost:4609/Us ...

  3. Hadoop YARN学习之组件功能简述(3)

    Hadoop YARN学习之组件功能简述(3) 1. YARN的三大组件功能简述: ResourceManager(RM)是集群的资源的仲裁者, 它有两部分:一个可插拔的调度器和一个Applicati ...

  4. 关于 Oracle 11g r2 Enterprise Manager (EM) 在windows环境无法启动的解决办法

    正确的解决办法是在安装的时候使用emca正确安装 如果已经安装过Enterprise Manager: 请用是如下命令卸载后重装 emca -deconfig dbcontrol db emca -r ...

  5. 博客之旅 gogogo!

    听说写博客的人都很牛~ 上班一年多了,想记录点什么,so,就写博客吧,整理一些技术点与工作生活心得 欢迎各位道友交流学习 :)

  6. leetcode_998. Maximum Binary Tree II

    https://leetcode.com/problems/maximum-binary-tree-ii/ 在654. Maximum Binary Tree版本的建树基础上,在最后插入一个数. 新节 ...

  7. 编写高质量Python代码的59个有效方法

    Python学习资料或者需要代码.视频加Python学习群:960410445 1. 用Pythonic方式思考 第一条:确认自己使用的Python版本 (1)有两个版本的python处于活跃状态,p ...

  8. jQuery 超过字符截取部分用星号表示

    $(function(){ var str = $('#num').text(); if (str.length >15) { var strend = str.substring(4,str. ...

  9. java网络编程_IP地址

    InetAddress类,此类表示Internet协议(IP)地址.具体使用方法查看文档:https://docs.oracle.com/en/java/javase/11/docs/api/java ...

  10. dedecms部分文章出现读取附加信息出错的解决办法

    问题: 估计是新版本开发的时候,没有考虑旧版,文章内容为空的新闻,新版不在允许文章内容为空的新闻,这样旧版的内容为空的新闻升级后将无法再编辑. 解决:你可以对如下文件进行如下修改:article_ed ...