Splay 每个节点维护一个区间。

 /**************************************************************
Problem: 3595
User: idy002
Language: C++
Result: Accepted
Time:5428 ms
Memory:56020 kb
****************************************************************/ #include <cstdio>
#include <map>
#define N 2000000
using namespace std; map<int,int> atob, btoa;
map<int,int> rng_id; struct Splay {
int son[N][], pre[N], xlf[N], xrg[N], siz[N], root, ntot; int newnode( int p, int lf, int rg ) {
if( lf>rg ) return ;
int nd = ++ntot;
son[nd][] = son[nd][] = ;
pre[nd] = p;
xlf[nd] = lf;
xrg[nd] = rg;
siz[nd] = rg-lf+;
return nd;
}
void update( int nd ) {
siz[nd] = siz[son[nd][]]+siz[son[nd][]]+(xrg[nd]-xlf[nd]+);
}
void rotate( int nd, int d ) {
int p=pre[nd];
int s=son[nd][!d];
int ss=son[s][d]; son[nd][!d] = ss;
son[s][d] = nd;
if( p ) son[p][nd==son[p][]]=s;
else root=s; pre[nd] = s;
pre[s] = p;
if( ss ) pre[ss] = nd; update( nd );
update( s );
}
void splay( int nd, int top= ) {
while( pre[nd]!=top ) {
int p=pre[nd];
int nl=nd==son[p][];
if( pre[p]==top ) {
rotate( p, nl );
} else {
int pp=pre[p];
int pl=p==son[pp][];
if( nl==pl ) {
rotate( pp, pl );
rotate( p, nl );
} else {
rotate( p, nl );
rotate( pp, pl );
}
}
}
}
void init( int lf, int rg ) {
ntot = ;
root = newnode( , lf, rg );
rng_id[rg] = root;
}
void make_one( int nd ) {
int lnd, rnd;
splay( nd );
lnd = son[nd][];
rnd = son[nd][];
while( son[lnd][] ) lnd=son[lnd][];
while( son[rnd][] ) rnd=son[rnd][];
if( lnd && rnd ) {
splay( lnd );
splay( rnd, lnd );
} else if( lnd ) {
splay( lnd );
} else if( rnd ) {
splay( rnd );
}
}
void split( int nd, int pos ) {
if( xlf[nd]==xrg[nd] ) return;
make_one( nd );
int lnd, rnd;
lnd = newnode( , xlf[nd], pos- );
rnd = newnode( , pos+, xrg[nd] );
son[nd][] = lnd;
son[nd][] = rnd;
if( lnd ) {
pre[lnd] = nd;
rng_id[pos-] = lnd;
}
if( rnd ) {
pre[rnd] = nd;
rng_id[xrg[nd]] = rnd;
}
rng_id[pos] = nd;
xlf[nd] = xrg[nd] = pos;
update( nd );
splay( nd );
}
void erase( int nd ) {
make_one( nd );
int p=pre[nd];
pre[nd] = ;
if( p ) {
son[p][ nd==son[p][] ] = ;
pre[nd] = ;
update( p );
splay( p );
} else {
root = ;
pre[nd] = ;
}
}
void push_front( int nn ) {
if( !root ) {
root = nn;
return;
}
int nd=root;
while( son[nd][] ) nd=son[nd][];
son[nd][] = nn;
pre[nn] = nd;
splay( nn );
}
void push_back( int nn ) {
if( !root ) {
root = nn;
return;
}
int nd=root;
while( son[nd][] ) nd=son[nd][];
son[nd][] = nn;
pre[nn] = nd;
splay(nn);
}
int rank( int nd ) {
int rt=siz[son[nd][]]+;
int nnd=nd;
while( pre[nd] ) {
int p=pre[nd];
if( nd==son[p][] ) rt += siz[son[p][]]+(xrg[p]-xlf[p]+);
nd=p;
}
splay(nnd);
return rt;
}
int nth( int k ) {
int nd=root;
while() {
int ls=siz[son[nd][]];
int lcs=ls+(xrg[nd]-xlf[nd]+);
if( k<=ls ) {
nd = son[nd][];
} else if( k<=lcs ) {
int rt = xlf[nd]+k-ls-;
splay( nd );
return rt;
} else {
k -= lcs;
nd = son[nd][];
}
}
}
}T; int n, m;
int main() {
scanf( "%d%d", &n, &m );
T.init( , n );
int la = ;
for( int i=; i<=m; i++ ) {
int opt, x, y;
scanf( "%d%d", &opt, &x );
x -= la;
if( opt== ) {
scanf( "%d", &y );
y -= la;
int pos = btoa.count(x) ? btoa[x] : x;
atob[pos] = y;
btoa[y] = pos;
int nd= rng_id.lower_bound( pos )->second;
T.split( nd, pos );
printf( "%d\n", la=T.rank(nd) );
} else if( opt== ) {
int pos = btoa.count(x) ? btoa[x] : x;
int nd=rng_id.lower_bound( pos )->second;
T.split( nd, pos );
printf( "%d\n", la=T.rank(nd) );
T.erase( nd );
T.push_front( nd );
} else if( opt== ) {
int pos = btoa.count(x) ? btoa[x] : x;
int nd = rng_id.lower_bound( pos )->second;
T.split( nd, pos );
printf( "%d\n", la=T.rank(nd) );
T.erase( nd );
T.push_back( nd );
} else {
int pos=T.nth(x);
int b = atob.count(pos) ? atob[pos] : pos;
printf( "%d\n", la=b );
}
}
}

bzoj 3595的更多相关文章

  1. BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap

    3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec  Memory Limit: 256 MBSubmit: 102  Solved: 54[Submit][Status ...

  2. 【bzoj 3595】: [Scoi2014]方伯伯的Oj

    传送门&& 原题解 蒟蒻终于做到一道方伯伯的题了…… 调了一个上午一直TLE(发现自己打了好久的splay板子竟然是错的这种丢人事情我就不说了) 很明显,要建两棵树,$T1$维护排名, ...

  3. BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常

    Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...

  4. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  5. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  6. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  7. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  8. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  9. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

随机推荐

  1. 天梯赛 L2-20 功夫传人 (深搜)

    一门武功能否传承久远并被发扬光大,是要看缘分的.一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟子们的功夫就越弱-- 直到某一支的某一代突然出现一个天分特别高的弟子(或者是吃到了灵丹.挖到 ...

  2. 63.UniquePaths II---dp

    题目链接 题目大意:与62题类似,只是这个题中间有障碍. 法一:dfs,依旧超时.代码如下: public int uniquePathsWithObstacles(int[][] obstacleG ...

  3. Mybatis Common Mapper文件

    表名/条件/字段 都可以传入进去 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mappe ...

  4. Nginx源码分析--数组(转)

    原文地址:http://blog.csdn.net/marcky/article/details/5747431 备注:以下关于Nginx源码的分析基于淘宝开源项目Tengine. Nginx中对数组 ...

  5. MemCached缓存操作

    Web项目在运行时,通常需要从数据库中进行读写.随着操作数据量的增大,以及访问量的集中,数据库的负载增加,数据库响应变慢,网站访问速度变慢的情况.Memcached就是用来解决这些问题的. Memca ...

  6. ASP.NET Core 2.0 MVC 发布部署--------- SUSE 16 Linux Enterprise Server 12 SP2 X64 具体操作

    .Net Core 部署到 SUSE 16 Linux Enterprise Server 12 SP2 64 位中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk ...

  7. web.xml中的dispatchservlet后,js,css,甚至gif都不能正常显示

    这个可以说是很多初学Springmvc的人都会碰到一个令人头痛的问题 那就是为什么我配置好web.xml中的dispatchservlet后,js,css,甚至gif都不能正常显示了 我们来看看我们配 ...

  8. IDE按住ctrl 打开单元 无效时 的方法

    一般打开单元无效时 是由于程序有错误,若程序没有错误 可以重新build一下 再试. 若实在不行 就右键---open at cursor

  9. prototype 与 __proto__

    原文:http://rockyuse.iteye.com/blog/1426510 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: 1 <script type= ...

  10. MySql学习笔记——存储函数

    在学习完存储过程后,今天主要回顾一下mysql中的存储函数的知识. 函数与存储过程的区别 首先,存储函数也是过程式对象之一,与存储过程相似.它们都是由SQL和过程式语句组成的代码片断,并且可以从应用程 ...