bzoj 3595

时间:2021-11-28 18:36:12

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&colon; &lbrack;Scoi2014&rsqb;方伯伯的Oj SBT&plus;可持久化Treap

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

  2. 【bzoj 3595】&colon; &lbrack;Scoi2014&rsqb;方伯伯的Oj

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

  3. BZOJ 3595&colon; &lbrack;Scoi2014&rsqb;方伯伯的Oj Splay &plus; 动态裂点 &plus; 卡常

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

  4. BZOJ 2127&colon; happiness &lbrack;最小割&rsqb;

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

  5. BZOJ 3275&colon; Number

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

  6. BZOJ 2879&colon; &lbrack;Noi2012&rsqb;美食节

    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. &lbrack;变&rsqb;C&num;谜题&lpar;1-10&rpar;表达式篇

    [变]C#谜题(1-10)表达式篇 最近偶然发现了<Java谜题>,很有意思,于是转到C#上研究一下. 本篇是关于表达式的一些内容. 谜题1:奇数性(负数的取模运算) 下面的方法意图确定它 ...

  2. iOS 使用EZAudio库生成wav出错的情况

    使用EZAudio库 录M4A格式可以参考该库例子中的代码. 录wav格式得改下源码.看下面的代码 AVAudioSession *session = [AVAudioSession sharedIn ...

  3. java的spilt(&OpenCurlyDoubleQuote;,”)方法bug处理

    java split方法以逗号分隔如字符串",,,,,," 这样会得到一个空的数组 String str ={1,2,3,,,,, } String[] str1 =spilt(& ...

  4. Eclipse中的Web项目自动部署到Tomcat

    原因 很长时间没用Eclipse了,近期由于又要用它做个简单的JSP项目,又要重新学习了,虽然熟悉的很快,但记忆总是很模糊,偶尔犯错,以前很少写博客,现在感觉还是很有必要的,编程中每个人对于犯过的错误 ...

  5. 轻量级应用开发之(04)UIScrollView-1

    本文是我在学习OC中的一些经验总结,在学习中总结了常用的Mac技巧,欢迎群友对本文提出意见,如有问题请联系我. 一 什么是UIScrollView 1)移动设备的屏幕大小是极其有限的,因此直接展示在用 ...

  6. IE10 下兼容性问题

    昨天在IE10下遇到这样一个问题 用jquery 获取textarea里的值 其中内容这里包含HTML  用$("#Id").val().$("#Id").ht ...

  7. 10款jquery图片广告特效的预览及源码下载 改自&lbrack;帅的相对论&rsqb;

    原文格式有问题,我来排版了一下,分享给大家. 1.jQuery仿海尔官网全屏焦点图特效代码 Query仿海尔官网全屏焦点图特效代码,带有左右箭头的jQuery焦点图切换特效.当焦点图切换时,下方的三块 ...

  8. Redis相关指令文档

    连接控制 QUIT 关闭连接 AUTH (仅限启用时)简单的密码验证 适合全体类型的命令 EXISTS key 判断一个键是否存在;存在返回 1;否则返回0; DEL key 删除某个key,或是一系 ...

  9. Oracle工具——ADRCI

    ADRCI工具是Oracle11g才推出的新工具,主要用来管理alert文件.trace文件.dump文件.健康监事报告等. 这一篇简单介绍ADRCI工具. 用过11g的人都会发现,11g中alert ...

  10. c&num;单元测试:使用Moq框架Mock对象

    在.net中有几种mock框架可供选择,比如NMock,PhinoMocks,FakeItEasy和Moq.尽管Moq相对较新,但是它非常易用.不需要像传统的Record/Replay.并且使用Moq ...