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+ ...
随机推荐
- SpringRMI远程方法调用【原】
Spring为各种远程访问技术的集成提供了工具类. 该小段引用自 http://www.open-open.com/lib/view/open1408957290478.html Spring远程支持 ...
- 数据库中DQL、DML、DDL、DCL的概念与区别
SQL(Structure Query Language)语言是数据库的核心语言. SQL语言共分为四大类:数据定义语言DDL,数据操纵语言DML,数据查询语言DQL,数据控制语言DCL. 1. 数据 ...
- Java基础其他
1. 二进制 进制就是进位制,常见的有二进制.十进制.十六进制等 在进制中,可用符号的数量称为基数,基数为n就称为n进制,逢n进一位: 二进制:0 1 十进制:0 1 2 3 4 5 6 7 8 9 ...
- Error: failed to execute 'C:\Keil\ARM\ARMCC'的解决办法
在KEIL新建工程时,容易出现该问题,我查了一些资料,最终找到该问题解决方法: 第一步:在keil里的菜单栏依次选择Project->Manage->Components,Environm ...
- 一个单js文件也可以运行vue
新建一个hello.html文件,输入以下内容: <html> <head> <title></title> <script src=" ...
- FastReport使用List的方法
public class User { string username; string password; public User(string username, string password) ...
- JS ——document、“或”、event(事件对象)
1.document <document>是所以HTML的最高节点,比<html>的等级还要高. <document>的第一个子节点是“!”——document.c ...
- JavaScript之Ajax(一)创建Ajax对象
// 支持浏览器的源码 function AjaxObject() { var AjaxRequest; // 缓存XHR对象便于 Ajax 使用 try { // Opera 8.0+, Firef ...
- Pytorch中的squeeze()和unsqueeze()函数
在numpy库中,经常会出现“秩为1的一维数组”(come from 吴恩达的深度学习,目前还没有搞清楚numpy中如此设计的意图).比如: 注意这里的a的shape是[3] ,既不是 [1,3] 也 ...
- 使用Sphinx生成本地的Python帮助文档
第一步:安装Sphinx 首先我们需要安装Sphinx,如果已经安装了Anaconda,那么只需要使用如下命令即可安装,关于其中的参数 -c anaconda,可以在链接[1]中查看: conda i ...