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\)最常见的序列 ...
随机推荐
- 使用ImageMagick处理图片后导致图片变大的问题
最新在使用ImageMagick处理图片时,发现有时经过处理的图片变大的问题. 例如原图为27K,经处理后的图片会变为77K. 先看测试代码: // imgtest.cpp : 定义控制台应用程序的入 ...
- vue组件、数据解析的实现思想猜想与实践
Vue的全局组件,在注册后,可在全局范围内无限次使用,猜想是利用了闭包"可以保持形参"的特性,使初始化时的作用域得意保存,下面用原生js和部分jquery代码模拟了数据解析和组件渲 ...
- .NET 使用 Highcharts生成扇形图 柱形图
1.首先新建一个.NET网站,如图所示: 2.引用所需要的js类库,如下图 highcharts.js可以在网上搜索就可以找到下载了. 3.在Default.aspx页面引用js 4.在 body 下 ...
- 解决jquery与其他库的冲突
1.jquery在其他库之后导入 第一种: jQuery.noConflict();//将变量$的控制权限交给其他类库,即将$的控制权让渡给其他类库 jQuery(function(){ jQuery ...
- H.264学习笔记3——帧间预测
帧间预测主要包括运动估计(运动搜索方法.运动估计准则.亚像素插值和运动矢量估计)和运动补偿. 对于H.264,是对16x16的亮度块和8x8的色度块进行帧间预测编码. A.树状结构分块 H.264的宏 ...
- (转)Nutz | Nutz项目整合Spring实战
http://blog.csdn.net/evan_leung/article/details/54767143 Nutz项目整合Spring实战 前言 Github地址 背景 实现步骤 加入spri ...
- CreateWindowEx详解
语法: HWND CreateWindowEx( DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, ...
- webpack的详细介绍和使用
// 一个常见的`webpack`配置文件 const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-we ...
- vue脚手架引入swiper
方法一: 下载swiper: npm install swiper --save-dev swiper4.0使用入口:http://www.swiper.com.cn/usage/index.html ...
- 解决【npm ERR! Unexpected end of JSON input while parsing near '...sh_time":141072930277'】方案
问题描述执行npm install的时候报错npm ERR! Unexpected end of JSON input while parsing near '...sh_time":141 ...