以前用线段树做的题。。发现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区间查询的更多相关文章

  1. Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询

    1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...

  2. HDU 4417 Super Mario(主席树求区间内的区间查询+离散化)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. HDU 1166敌兵布阵+NOJv2 1025: Hkhv love spent money(线段树单点更新区间查询)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)

    题目链接 题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的 ...

  5. POJ3237-Tree (树链剖分,线段树区间更新+点更新+区间查询)

    两个更新操作,一个将第i条路径权值改为w,一个是将a-b之间所有路径权值取反. 一个查询操作,求a-b之间路径中权值最大的边. 很容易想到维护一个最大最小值,取反就是把最大最小取反交换一下. 开始遇到 ...

  6. ZOJ 3633 Alice's present 倍增 区间查询最大值

    Alice's present Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vi ...

  7. CF390-E. Inna and Large Sweet Matrix(区间更新+区间查询)

    题意很好理解,不说了 题解就是每次把值压缩成一维,比如x上,这样就可以求出任意宽度的整个竖条的和. 如这张图,求的是s5-(s1+s3+s7+s9) 因为可以求出一整竖条和一整横条,我们可以求出是s2 ...

  8. tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树

    P1716 - 上帝造题的七分钟 From Riatre    Normal (OI)总时限:50s    内存限制:128MB    代码长度限制:64KB 背景 Background 裸体就意味着 ...

  9. 【CF689D Friends and Subsequences】二分搜索,区间查询

    题意:给定两个整数序列a,b,将a,b对齐,问有多少个区间满足a的区间内最大值等于b的区间内最小值. 数据范围:区间长度n属于[1, 200000],序列中的元素在整型范围内 思路:枚举所有n*(n+ ...

随机推荐

  1. JavaSE学习总结(七)—— 集合

    一.为什么需要集合 如果要将100个学生成绩存放到程序中,怎么做? 首先想到是数组 int[] scores=new int[100]; 然而,长度是固定的,比如是101个学生成绩,这个数组就不能用了 ...

  2. ivew实现table的编辑保存追加删除

    ivew实现table的编辑 例子1 例子2

  3. CodeChef - AMLEX-Poetic word

    题目链接  Dhinwaji is an acclaimed poet and likes to play with words and letters. He has bought some sti ...

  4. 转 -- pydoc用法

    原文地址: https://www.cnblogs.com/meitian/p/6704488.html pydoc用法 pydoc是python自带的一个文档生成工具,使用pydoc可以很方便的查看 ...

  5. css/css3常用收集/笔记

    _______________________________________________________________  css3 瀑布流 N 列 <ul><li>aa ...

  6. buildroot构建项目(四)--- u-boot 2017.11 适配开发板修改 2 ---- 系统启动初始化之一

    一.代码分析 上一节已经分析了链接文件,知道了首先代码是从 _start 开始,之后设置了中断向量表,然后从 start.s 开始运行. _start:vectors.S (arch\arm\lib) ...

  7. adb的使用

    前面配置了环境变量,可以在计算机任何位置打开cmd窗口使用adb. 连接android应用 使用connect命令连接盒子的ip(要确保电脑所连接的网络和盒子是一个网络) 抓日志 抓取某一个操作过程的 ...

  8. pl/sql Devloper 快捷键__新建sql窗口

    首先,打开PLSQL,菜单栏--->首选项----->键配置 其次,点击你要增加快捷键的选项,直接键盘上输入快捷键: 比如你要修改为CTRL+N,直接在键盘上按出CTRL+N即可. ESC ...

  9. kset学习demo以及Oops反汇编objdump调试例子【原创】

    写一个main.c gcc -c -g main.c objdump -S main.o > b.txt arm-none-linux-gnueabi-gcc -c -g a.c arm-non ...

  10. windows命令行中英文切换

    Windows下cmd命令提示符窗口的语言设置(中英) 打开cmd命令提示窗口 输入 chcp 936 使用ping 命令 显示中文 2 同样 输入chcp 437 3 使用ping 命令