在比较了网上的几份模板的速度之后,发现指针版明显快了很多,但是一敲起来。。。。各种不习惯。。。所以还是学的hzwer 的数组版。。。

bzoj3223:维护reverse操作就可以了

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
const int nmax=1e5+5;
const int inf=0x7f7f7f7f;
int fa[nmax],c[nmax][2],sz[nmax],rev[nmax],n,m,rt;
void pushup(int x){
sz[x]=sz[c[x][0]]+sz[c[x][1]]+1;
}
void build(int l,int r,int last){
if(l>r) return ;
if(l==r){
fa[l]=last,sz[l]=1,c[last][l>=last]=l;return ;
}
int mid=(l+r)>>1;
build(l,mid-1,mid);build(mid+1,r,mid);
fa[mid]=last;c[last][l>=last]=mid;pushup(mid);
}
void rotate(int x,int &k){
int y=fa[x],z=fa[y],l=c[y][1]==x,r=l^1;
if(y==k) k=x;
else c[z][c[z][1]==y]=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
pushup(y);pushup(x);
}
void splay(int x,int &k){
int y,z;
while(x!=k){
y=fa[x],z=fa[y];
if(y!=k){
if(c[y][0]==x^c[z][0]==y) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
void pushdown(int x){
if(rev[x]){
int l=c[x][0],r=c[x][1];
rev[x]=0;rev[l]^=1;rev[r]^=1;
swap(c[x][0],c[x][1]);
}
}
int find(int x,int rk){
pushdown(x);
int l=c[x][0],r=c[x][1];
if(sz[l]+1==rk) return x;
if(sz[l]>=rk) return find(l,rk);
return find(r,rk-sz[l]-1);
}
void rever(int l,int r){
int x=find(rt,l),y=find(rt,r+2);
splay(x,rt);splay(y,c[x][1]);
rev[c[y][0]]^=1;
}
int main(){
n=read(),m=read();
build(1,n+2,0);rt=(n+3)>>1;
int u,v,d,tmp,temp;
rep(i,1,m) u=read(),v=read(),rever(u,v);
rep(i,2,n+1) printf("%d ",find(rt,i)-1);
return 0;
}
/*
5 3
1 3
1 3
1 4
*/

bzoj1251:维护reverse,query,update操作就可以了。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*f;
}
const int nmax=5e4+5;
const int inf=0x7f7f7f7f;
int fa[nmax],c[nmax][2],id[nmax],tag[nmax],w[nmax],mx[nmax],sz[nmax],n,m,rt;
bool rev[nmax];
void pushup(int x){
int l=c[x][0],r=c[x][1];
mx[x]=max(w[x],max(mx[l],mx[r]));
sz[x]=sz[l]+sz[r]+1;
}
void build(int l,int r,int last){
if(l>r) return ;
if(l==r){
fa[l]=last;sz[l]=1;
c[last][l>=last]=l;return ;
}
int mid=(l+r)>>1,now=mid;
build(l,mid-1,mid);build(mid+1,r,mid);
fa[now]=last;c[last][l>=last]=now;pushup(now);
}
void rotate(int x,int &k){
int y=fa[x],z=fa[y],l=(c[y][1]==x),r=l^1;
if(y==k) k=x;else c[z][c[z][1]==y]=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
pushup(y);pushup(x);
}
void splay(int x,int &k){
int y,z;
while(x!=k){
y=fa[x];z=fa[y];
if(y!=k){
if(c[y][0]==x^c[z][0]==y) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
void pushdown(int x){
int l=c[x][0],r=c[x][1],t=tag[x];
if(t){
tag[x]=0;
if(l) tag[l]+=t,mx[l]+=t,w[l]+=t;
if(r) tag[r]+=t,mx[r]+=t,w[r]+=t;
}
if(rev[x]){
rev[x]=0;rev[l]^=1;rev[r]^=1;
swap(c[x][0],c[x][1]);
}
}
int find(int x,int rk){
pushdown(x);
int l=c[x][0],r=c[x][1];
if(sz[l]+1==rk) return x;
if(sz[l]>=rk) return find(l,rk);
return find(r,rk-sz[l]-1);
}
void update(int l,int r,int val){
int x=find(rt,l),y=find(rt,r+2);
splay(x,rt);splay(y,c[x][1]);
int z=c[y][0];
tag[z]+=val,w[z]+=val,mx[z]+=val;
}
void rever(int l,int r){
int x=find(rt,l),y=find(rt,r+2);
splay(x,rt);splay(y,c[x][1]);
rev[c[y][0]]^=1;
}
void query(int l,int r){
int x=find(rt,l),y=find(rt,r+2);
splay(x,rt);splay(y,c[x][1]);
printf("%d\n",mx[c[y][0]]);
}
int main(){
n=read(),m=read();
rep(i,1,n+2) id[i]=i;
mx[0]=-inf;build(1,n+2,0);rt=(n+3)>>1;
int u,v,d,tmp,temp;
rep(i,1,m){
u=read();
if(u==1) v=read(),d=read(),tmp=read(),update(v,d,tmp);
else if(u==2) v=read(),d=read(),rever(v,d);
else v=read(),d=read(),query(v,d);
}
return 0;
}

bzoj1588:维护insert,ask_before ,ask_after 操作即可

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define clr(x,c) memset(x,c,sizeof(x))
int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*f;
}
const int nmax=5e4+5;
const int inf=1e9;
int c[nmax][2],fa[nmax],w[nmax],sz,rt;
void rotate(int x,int &k){
int y=fa[x],z=fa[y],l=c[y][1]==x,r=l^1;
if(y==k) k=x;else c[z][c[z][1]==y]=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
}
void splay(int x,int &k){
int y,z;
while(x!=k){
y=fa[x];z=fa[y];
if(y!=k){
if(c[y][0]==x^c[z][0]==y) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
void insert(int &k,int x,int last){
if(!k) {
k=++sz;w[k]=x;fa[k]=last;splay(k,rt);
}else if(x<w[k]) insert(c[k][0],x,k);
else insert(c[k][1],x,k);
}
int ask_before(int x){
int t=rt,ans=0;
while(t){
if(w[t]<=x) ans=w[t],t=c[t][1];
else t=c[t][0];
}
return ans;
}
int ask_after(int x){
int t=rt,ans=0;
while(t){
if(w[t]>=x) ans=w[t],t=c[t][0];
else t=c[t][1];
}
return ans;
}
int main(){
int n=read(),ans=0;insert(rt,inf,0);insert(rt,-inf,0);
rep(i,1,n){
int u=read(),ta=ask_before(u),tb=ask_after(u);
if(i!=1) ans+=min(u-ta,tb-u);else ans+=u;
insert(rt,u,0);
}
printf("%d\n",ans);
return 0;
}

splay入门的更多相关文章

  1. BZOJ1588 HNOI2002 营业额统计 [Splay入门题]

    [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 ...

  2. Splay入门题目 [HNOI2002]营业额统计

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 这道题貌似很多中做法,我先是用multiset交了一发,然后又写了一发splay. ...

  3. Splay入门解析【保证让你看不懂(滑稽)】

    BST真是神奇的东西... 而且种类好多呀... 我这个蒟蒻只学会了splay orzCJ老爷,各种树都会 好好好,不说了,直接说splay. 不知道splay是啥,,你也要知道平衡树是啥... 平衡 ...

  4. splay入门教程

    笔者一个数据结构的蒟蒻还是奇迹般的搞明白了splay的基本原理以及实现方法,所以写下这篇随笔希望能帮到像我当初一脸懵逼的人. 我们从二叉查找树开始说起: 二叉查找树是一棵二叉树,它满足这样一个性质:所 ...

  5. 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会

    平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...

  6. bzoj 1588: [HNOI2002]营业额统计(splay入门)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1588 题解:这题如果用普通的bst的话是可以过时间差不多4s左右如果用splay的话是14 ...

  7. 【学习笔记】splay入门(更新中)

    声明:本博客所有随笔都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 前言 终于学习了 spaly \(splay\) !听说了很久,因为dalao总 ...

  8. Splay伸展树学习笔记

    Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...

  9. 区间树Splay——[NOI2005]维护数列

    无指针Splay超详细讲解 区间树这玩意真TM玄学. 学这东西你必须要拥有的 1.通过[模板]文艺平衡树(Splay),[模板]普通平衡树,GSS3 - Can you answer these qu ...

随机推荐

  1. ZOJ3718 Diablo II(状态压缩dp)

    题意:一个人物有K(K<=7)种技能,每种技能都有bi,ci,di值,表示该技能不能点超过bi次,每点一次加ci,点满bi次有一个附加得分di.然后还有N件武器,武器本身会有能力加成,然后每个武 ...

  2. iOS第三方解决键盘遮挡-IQKeyboardManager

    百度云:http://pan.baidu.com/s/1yg5ae githun:https://github.com/hackiftekhar/IQKeyboardManager AppDelega ...

  3. java语言写文件内容

    import java.io.File;import java.io.FileWriter;import java.io.IOException; public static void main(St ...

  4. Newtonsoft.Json.dll

    代码 using System; DoNet2.0 需要借助于Newtonsoft.Json.dll using System.IO; using System.Text; using Newtons ...

  5. MVC中前台如何向后台传递数据------$.get(),$post(),$ajax(),$.getJSON()总结

    一.引言 MVC中view向controller传递数据的时候真心是一个挺让人头疼的一件事情.因为原理不是很懂只看一写Dome,按葫芦画瓢只能理解三分吧. 二.解读Jquery个Ajax函数 $.ge ...

  6. C和C++中结构体(struct)、联合体(union)、枚举(enum)的区别

    C++对C语言的结构.联合.枚举 这3种数据类型进行了扩展. 1.C++定义的结构名.联合名.枚举名 都是 类型名,可以直接用于变量的声明或定义.即在C++中定义变量时不必在结构名.联合名.枚举名 前 ...

  7. java内存模型优化建议

    八.Java编程建议 根据GC的工作原理,我们可以通过一些技巧和方式,让GC运行更加有效率,更加符合应用程序的要求.一些关于程序设计的几点建议: 1)最基本的建议就是尽早释放无用对象的引用.大多数程序 ...

  8. iOS开发--开发者帐号

    iOS应用上线 http://www.jianshu.com/p/ffddc5e5f0b9 http://www.jianshu.com/p/986e02d38f1b 好不容易终于申请下来了ios 公 ...

  9. STM32F05x加入RDP(LV1)后,Segger无法Unlock的解决办法

    沿用之前CM3核的STM32F10X系列的加入RDP功能,之后在Segger的Unsecured Chip或者Unlock STM32的Cmd无法进行去除RDP,而Unlock STM32则提示无法识 ...

  10. WaitForSingleObject与WaitForMultipleObjects用法详解(好用,而且进入一个非常高效沉睡状态,只占用极少的CPU时间片)

    在多线程下面,有时候会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects ...