HDU 1754 I Hate It (Splay 区间操作)
题目大意
维护一个序列,支持两种操作
操作一:将第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 区间操作)的更多相关文章
- P2596 [ZJOI2006]书架 && Splay 区间操作(三)
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- HDU 4453:Looploop(Splay各种操作)
http://acm.hdu.edu.cn/showproblem.php?pid=4453 题意:很多种操作:1.add x,将从光标起的 k2 个数全部加上 x:2.reverse,将从光标起的 ...
- hdu 1754 I Hate It (splay tree伸展树)
hdu 1754 I Hate It 其实我只是来存一下我的splay模板的..请大牛们多多指教 #include<stdio.h> #include<string.h> #i ...
- P2042 [NOI2005]维护数列 && Splay区间操作(四)
到这里 \(A\) 了这题, \(Splay\) 就能算入好门了吧. 今天是个特殊的日子, \(NOI\) 出成绩, 大佬 \(Cu\) 不敢相信这一切这么快, 一下子机房就只剩我和 \(zrs\) ...
- HDU 4578——Transformation——————【线段树区间操作、确定操作顺序】
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- hdu 1890 Robotic SortI(splay区间旋转操作)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 题解:splay又一高级的功能,区间旋转这个是用线段树这些实现不了的,这题可以学习splay的旋 ...
- 「BZOJ1251」序列终结者 (splay 区间操作)
题面: 1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 5367 Solved: 2323[Submit][Status][D ...
- Splay 区间操作(二)
首先基本操作如下: 删除第rank个点 void Remove(int id){//删除第rank个点 rank++; int x = find(root, rank - 1); splay(x, 0 ...
- Splay 区间操作
据大佬说,\(Splay\)是序列操作之王.\(Splay\)是一种平衡树,通过伸展(\(Splay\)),在不改变中序遍历的前提下变换根的位置,从而快速的进行序列操作 \(Splay\)最常见的序列 ...
随机推荐
- 416 Partition Equal Subset Sum 分割相同子集和
详见:https://leetcode.com/problems/partition-equal-subset-sum/description/ C++: class Solution { publi ...
- 【Python】列表解析表达式
1.语法 [expression for iter_val in iterable] [expression for iter_val in iterable if cond_expr] 2.示例 s ...
- windows server 2008 r2 IIS7下网站配置 只允许指定的IP地址访问
步骤一.找到ip地址和域限制 步骤二.添加全部拒绝 步骤三.添加允许访问的ip地址(局域网填写局域网ip,公网填写公网ip) 步骤四:如果想要拒绝某些ip访问,直接在规则中添加拒绝条目就可以
- windows保存tomcat的控制台日志到文件
startup.bat修改:call "%EXECUTABLE%" start %CMD_LINE_ARGS%改为:call "%EXECUTABLE%" ru ...
- 从0开始搭建SQL Server 2012 AlwaysOn 第三篇(安装数据,配置AlwaysOn)
这一篇是从0开始搭建SQL Server 2012 AlwaysOn 的第三篇,这一篇才真正开始搭建AlwaysOn,前两篇是为搭建AlwaysOn 做准备的 操作步骤: 1.安装SQL server ...
- 从0开始搭建SQL Server 2012 AlwaysOn 第一篇(AD域与DNS)
随着业务发展,公司需要提高数据安全与性能需求,所以需要对新技术预研(先采坑),做技术积累: 了解相关AlwaysOn 故障转移集群(热备),数据路由(ICX),Moebius(莫比斯数据路由) 决定测 ...
- Cygwin, MinGW/MSYS, MinGW-W64/MSYS2
1. Cygwin http://www.cygwin.com/ Cygwin is a large collection of GNU and Open Source tools which pro ...
- iTOP-4412开发板-实战教程-ssh服务器移植到arm开发板
本文转自迅为开发板:http://www.topeetboard.com 在前面实战教程中,移植了“串口文件传输工具”,整个移植过程是比较简单的,而且我 们没有做任何协议方面的了解,只是“配置”+“编 ...
- Activiti数据库表结构(表详细版)
http://blog.csdn.net/hj7jay/article/details/51302829 1 Activiti数据库表结构 1.1 数据库表名说明 Activiti工作流总 ...
- mysql中对order by的函数substring_index() , find_in_set()使用
题目是这样的:sql = "select * from table where id in(3,1,2,5)"; 怎样使得查询的结果按照 3 ,1 , 2, 5来排序: ...