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. vue使用jsx/axios拦截器设置

    最害怕的就是做过的事情,转几天又忘记了:写过的代码,也模模糊糊不知道哪里去了,所以告诉自己最好把每天遇到的问题记录下来,好,开始. 新公司要搭个vue后台框架,所以用了简简单单的 vue+iview+ ...

  2. 深入理解Spring系列之五:BeanDefinition装载

    转载 https://mp.weixin.qq.com/s/1_grvpJYe8mMIAnebMdz9Q 接上篇<深入理解Spring系列之四:BeanDefinition装载前奏曲>,进 ...

  3. Mysql储存过程2:变量定义与参数传递

    #储存过程 中的变量定义 declare 变量名 类型 可选类型 -- 跟建表差不多 create procedure p() begin ); ; select age+number; end$ / ...

  4. pytesser模块WindowsError错误解决方法

    在使用pytesser做图片文字识别时遇到 WindowsError: [Error 2] 错误,报错内容如下: Traceback (most recent call last): File &qu ...

  5. python基础===数据伪造模块faker

    介绍文档: https://pypi.org/project/Faker/ https://faker.readthedocs.io/en/latest/ https://faker.readthed ...

  6. Minimum Palindromic Factorization(最少回文串分割)

    Minimum Palindromic Factorization(最少回文串分割) 以下内容大部分(可以说除了关于回文树的部分)来自论文A Subquadratic Algorithm for Mi ...

  7. HDU 6198 2017沈阳网络赛 线形递推

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6198 题意:给出一个数k,问用k个斐波那契数相加,得不到的数最小是几. 解法:先暴力打表看看有没有规律 ...

  8. The algorithm of entropy realization

    近似熵的一种快速实用算法 Pincus提出的近似熵算法中有很多冗余的计算,效率低,速度慢,不利于实际应用,洪波等人在定义的基础上引入二值距离矩阵的概率,提出了一种实用快速的算法. function A ...

  9. ECharts图表tooltip显示时超出canvas图层解决方法

    我们在做ECharts图表的时候可能会遇到tooltip显示时超出了canvas图层范围,并且被其它z-index较高的div容器遮盖,这是悬浮展示信息就看不全,我们根据官网文档的配置项查询发现con ...

  10. PHP的instanceof关键字

    PHP5的另一个新成员是instdnceof关键字.使用这个关键字可以确定一个对象是类的实例.类的子类,还是实现了某个特定接口,并进行相应的操作.在某些情况下,我们希望确定某个类是否特定的类型,或者是 ...