hdu1754splaytree区间查询
以前用线段树做的题。。发现splay好神奇
splay的区间查询就是把那个区间移到两个节点之间进行操作即可,同时每次rotate不要忘记pushup
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 200050 int pre[maxn],ch[maxn][],size[maxn],Max[maxn],nums[maxn],keys[maxn],tot,root;
int a[maxn],n,q; inline void pushup(int r){
Max[r]=max(max(Max[ch[r][]],Max[ch[r][]]),keys[r]);
size[r]=size[ch[r][]]+size[ch[r][]]+;
}
inline void newnode(int &r,int fa,int val){
r=++tot;
ch[r][]=ch[r][]=;
size[r]=;
Max[r]=nums[r]=keys[r]=val;
pre[r]=fa;
}
void build(int &r,int L,int R,int fa){
if(L>R) return;
int mid=L+R>>;
newnode(r,fa,a[mid]);
build(ch[r][],L,mid-,r);
build(ch[r][],mid+,R,r);
pushup(r);
}
void init(){
root=tot=;
ch[root][]=ch[root][]=size[root]=pre[root]=;
newnode(root,,-);newnode(ch[root][],root,-);
build(ch[ch[root][]][],,n,ch[root][]);
pushup(ch[root][]);
pushup(root);
}
void rotate(int x,int kind){
int fa=pre[x];
ch[fa][!kind]=ch[x][kind];
pre[ch[x][kind]]=fa;
pre[x]=pre[fa];
if(pre[fa])
ch[pre[fa]][ch[pre[fa]][]==fa]=x;
pre[fa]=x;
ch[x][kind]=fa;
pushup(fa);pushup(x);
}
void splay(int r,int goal){
while(pre[r]!=goal){
if(pre[pre[r]]==goal){
rotate(r,ch[pre[r]][]==r);
}
else {
int fa=pre[r];
int kind=ch[pre[fa]][]==fa;
if(ch[fa][kind]==r){
rotate(r,!kind);
rotate(r,kind);
}
else {
rotate(fa,kind);
rotate(r,kind);
}
}
}
pushup(r);
if(goal==) root=r;
}
int getth(int r,int pos){
int t=size[ch[r][]]+;
if(t==pos) return r;
else if(t<pos) return getth(ch[r][],pos-t);
else return getth(ch[r][],pos);
}
void update(int pos,int val){
int r=getth(root,pos);
splay(r,);
Max[root]=nums[root]=keys[root]=val;
pushup(root);
}
int query(int l,int r){
int L=getth(root,l),R=getth(root,r);
splay(L,);
splay(R,root);
return Max[ch[ch[root][]][]];
}
void Treavel(int x)
{
if(x)
{
Treavel(ch[x][]);
printf("结点:%2d: 左儿子 %2d 右儿子 %2d 父结点 %2d size = %2d key = %2d\n",x,ch[x][],ch[x][],pre[x],size[x],keys[x]);
Treavel(ch[x][]);
}
}
void debug()
{
printf("root:%d\n",root);
Treavel(root);
}
int main(){
while(scanf("%d%d",&n,&q)==){
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
init(); int a,b;
char op[];
while(q--){
scanf("%s%d%d",&op,&a,&b);
if(op[]=='U')
update(a+,b);
else printf("%d\n",query(a,b+));
//debug();
}
}
return ;
}
hdu1754splaytree区间查询的更多相关文章
- Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询
1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...
- HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1166敌兵布阵+NOJv2 1025: Hkhv love spent money(线段树单点更新区间查询)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)
题目链接 题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...
- POJ3237-Tree (树链剖分,线段树区间更新+点更新+区间查询)
两个更新操作,一个将第i条路径权值改为w,一个是将a-b之间所有路径权值取反. 一个查询操作,求a-b之间路径中权值最大的边. 很容易想到维护一个最大最小值,取反就是把最大最小取反交换一下. 开始遇到 ...
- ZOJ 3633 Alice's present 倍增 区间查询最大值
Alice's present Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vi ...
- CF390-E. Inna and Large Sweet Matrix(区间更新+区间查询)
题意很好理解,不说了 题解就是每次把值压缩成一维,比如x上,这样就可以求出任意宽度的整个竖条的和. 如这张图,求的是s5-(s1+s3+s7+s9) 因为可以求出一整竖条和一整横条,我们可以求出是s2 ...
- tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树
P1716 - 上帝造题的七分钟 From Riatre Normal (OI)总时限:50s 内存限制:128MB 代码长度限制:64KB 背景 Background 裸体就意味着 ...
- 【CF689D Friends and Subsequences】二分搜索,区间查询
题意:给定两个整数序列a,b,将a,b对齐,问有多少个区间满足a的区间内最大值等于b的区间内最小值. 数据范围:区间长度n属于[1, 200000],序列中的元素在整型范围内 思路:枚举所有n*(n+ ...
随机推荐
- models.DateTimeField(auto_now_add=True) 与 models.DateTimeField(auto_now=True)
DateTimeField和DateField和TimeField存储的内容分别对应着datetime(),date(),time()三个对象. 对于auto_now=False和auto_now_a ...
- 附录A Spring Boot应用启动器
spring Boot应用启动器基本的一共有44种,具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2)spring- ...
- Spark记录-SparkSql官方文档中文翻译(部分转载)
1 概述(Overview) Spark SQL是Spark的一个组件,用于结构化数据的计算.Spark SQL提供了一个称为DataFrames的编程抽象,DataFrames可以充当分布式SQL查 ...
- CodeBlock 快捷键大全
一款开源的C/C++ IDE(集成开发环境),基于wxWidgets GUI体系,跨平台支持. 编辑器 快捷键 功能 Ctrl+Z 恢复上一次操作 Ctrl+Shift+Z 重复上一次操作 F1 ...
- python 爆破
python 爆破 #!/usr/bin/python #-*- coding: GB2312 -*- #author:loversorry import urllib2 import urllib ...
- PageRank简单实现中的一个错误
在我的一篇博客PageRank中,在5.1 算法实现中简单实现部分原本是有一个错误的.这个错误也体现出我当时对PageRank算法有理解上的偏差. 这是个什么样的错误呢?是这样的: 简单实现中计算每个 ...
- HTML5 元素拖拽实现 及 jquery.event.drag插件
如上图片: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...
- eclipse2019-03设置代码编辑区背景为图片
一.我的主题设置如下所示 二.找到如下所示或类似的文件夹 三.在该文件夹里的images文件夹里添加图片 四.在CSS目录下的e4-dark_win.css文件中添加如下代码 .MPart Style ...
- Java开发中各种集合框架简介
在大数据MapReduce作业开发中,我们经常会遇到一些大小表的join,这是如果这个小表足够“小”的话,我们可以使用进行“map-join-side”,这要就可以有效的降低reduce端的压力,但是 ...
- 使用Sphinx生成本地的Python帮助文档
第一步:安装Sphinx 首先我们需要安装Sphinx,如果已经安装了Anaconda,那么只需要使用如下命令即可安装,关于其中的参数 -c anaconda,可以在链接[1]中查看: conda i ...