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+ ...
随机推荐
- exportfs命令
exportfs命令:功能说明 :NFS共享管理 语法格式 exportfs [必要参数][选择参数][目录] 功能描述 exportfs 命令:用于管理NFS(Network File System ...
- nginx安装ngx_lua_waf防护
ngx_lua_waf基于ngx_lua的web应用防火墙,使用起来简单,高性能和轻量级. ♦防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击♦防止svn/备份之类 ...
- 《Two Dozen Short Lessons in Haskell》所有习题的索引
<Two Dozen Short Lessons in Haskell>(Copyright © 1995, 1996, 1997 by Rex Page,有人翻译为Haskell二十四学 ...
- MyBatis全局配置文件mybatis-config.xml
1.在官方下载的mybatis-3.4.5.zip压缩包中,有我们需要的mybatis核心jar包和mybatis的快速入门的pdf文件 在mybatis的快速入门的pdf文件中,复制如下代码到我们项 ...
- getattr getattribute setattr hasattr delattr
getattr是返回对象属性value的函数,用法:getattr(object,attribute_name[,default]) 如果对象拥有属性,则返回属性value,如果对象没有该属性并且也没 ...
- mysql 原理 ~ 事务隔离机制
简介: 事务隔离知多少内容 一 基础知识 1 事务特性 ACID A 原子性 C 一致性 I 隔离性 D 持久性 2 并行事务出现的问题 1 脏读 读取了其他事务未提交的数据 ...
- mysql 架构 ~异地容灾
一 简介 我们来探讨下多机房下的mysql架构二 目的: 首先要清楚你的目的 1 实现异地机房的容灾备份 2 实现异地机房的双活 三 叙说 1 实现异地机房的容灾备份 ...
- 关于《汇编语言(王爽)》程序6.3使用16个dw 0的问题
在学习王爽老师<汇编语言>的第6.2节时,在程序6.3代码中,给出了如下的代码: assume cs:code code segment dw 0123h, 0456h, 0789h, 0 ...
- linux挂载硬盘以及卸载硬盘
1.在vmware添加硬盘 2.输入fdisk -l 查看新增加的硬盘 3.分区初始化 4.指定文件系统 5.修改fstab文件 fstab: 6.刷新验证 mount -a 挂载定义在/etc/fs ...
- linux查看操作系统的版本
内核信息 uname -a localhost.localdomain:所在主机的主机名,与主机配置文件/etc/hosts内容一致 2.4.20-8#1:内核版本号 Thu Mar 13 17:18 ...