用一棵Splay按名次维护每个点,其中一个节点对应初始编号连续的一段区间,这样总节点数是$O(m)$的。

对每个编号记录这个点被Splay的那个节点维护,用std::map存储,只记录被修改的点。

每次删除时将一个点分裂成[l,k-1],k,[k+1,r]三个点(特判k=l或k=r),再删除k。

注意各种细节。

 #include<map>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=;
int n,m,rt,nd,ans,op,x,y,L[N],R[N],len[N],f[N],ch[N][];
map<int,int>mp; int get(int l,int r){ nd++; L[nd]=l; R[nd]=r; len[nd]=r-l+; return nd; }
void upd(int x){ len[x]=len[ch[x][]]+len[ch[x][]]+R[x]-L[x]+; } void rot(int &rt,int x){
int y=f[x],z=f[y],w=ch[y][]==x;
if (rt==y) rt=x; else ch[z][ch[z][]==y]=x;
f[x]=z; f[y]=x; f[ch[x][w^]]=y;
ch[y][w]=ch[x][w^]; ch[x][w^]=y; upd(y);
} void splay(int &rt,int x){
while (x!=rt){
int y=f[x],z=f[y];
if (y!=rt) ((ch[z][]==y)^(ch[y][]==x)) ? rot(rt,x) : rot(rt,y);
rot(rt,x);
}
upd(x);
} int split(int x,int k){
int y=get(k+,R[x]); R[x]=k;
if (!ch[x][]) ch[x][]=y,f[y]=x;
else{
int s=ch[x][];
while (ch[s][]) s=ch[s][];
ch[s][]=y; f[y]=s;
}
splay(rt,y); mp[R[x]]=x; mp[R[y]]=y; return y;
} void Split(int &x,int k){
if (k<R[x]) split(x,k);
if (k>L[x]) x=split(x,k-);
splay(rt,x);
} void ins1(int x){
int s=rt;
while (ch[s][]) s=ch[s][];
ch[s][]=x; f[x]=s; splay(rt,x);
} void ins2(int x){
int s=rt;
while (ch[s][]) s=ch[s][];
ch[s][]=x; f[x]=s; splay(rt,x);
} void del(int x){
splay(rt,x);
int ls=ch[x][],rs=ch[x][];
f[ls]=f[rs]=; ch[x][]=ch[x][]=;
if (!ls || !rs) { rt=ls+rs; return; }
int s=ls; while (ch[s][]) s=ch[s][];
splay(ls,s); ch[s][]=rs; f[rs]=rt=s; upd(s);
} int find(int k){
for (int x=rt; ; ){
if (k<=len[ch[x][]]) x=ch[x][];
else{
k-=len[ch[x][]];
if (k<=R[x]-L[x]+) return k+L[x]-;
else k-=R[x]-L[x]+,x=ch[x][];
}
}
} int main(){
freopen("bzoj3595.in","r",stdin);
freopen("bzoj3595.out","w",stdout);
scanf("%d%d",&n,&m); rt=get(,n); mp[n]=;
rep(i,,m){
scanf("%d%d",&op,&x); x-=ans;
if (op==){
scanf("%d",&y); y-=ans;
int t=mp.lower_bound(x)->second;
Split(t,x); printf("%d\n",ans=len[t]-len[ch[t][]]);
L[t]=R[t]=y; mp[y]=t;
}
if (op==){
int t=mp.lower_bound(x)->second;
Split(t,x); printf("%d\n",ans=len[t]-len[ch[t][]]);
del(t); ins1(t);
}
if (op==){
int t=mp.lower_bound(x)->second;
Split(t,x); printf("%d\n",ans=len[t]-len[ch[t][]]);
del(t); ins2(t);
}
if (op==) printf("%d\n",ans=find(x));
}
return ;
}

[BZOJ3595][SCOI2014]方伯伯的OJ(裂点Splay)的更多相关文章

  1. 2019.03.28 bzoj3595: [Scoi2014]方伯伯的Oj(splay+map+set)

    传送门 题意简述: 给一个有优先级的nnn个人的序列,初始的时候第iii个人排名为iii,现在有mmm个操作,种类如下: 把编号为xxx的改成yyy,输出改前xxx的排名 把编号为xxx放到队首,输出 ...

  2. BZOJ3595 : [Scoi2014]方伯伯的Oj

    由于n很大,有2e8,所以不能直接用splay来维护排名 把splay修改一下 每个节点维护一个区间[l,r],表示编号在[l,r]之间的所有点都在这里 需要支持一个takeout操作: 把编号为k的 ...

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

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

  4. 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树

    洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...

  5. luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树

    LINK:方伯伯的OJ 一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的! 喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排 ...

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

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

  7. [SCOI2014]方伯伯的OJ(线段树)

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

  8. [SCOI2014]方伯伯的OJ

    看到这道题的第一想法就是要用FHQ treap 过了这道题...于是至今尚未成功(华丽的 T 掉了 (╯‵□′)╯︵┻━┻ ).于是附个地址. 然后水一波博客. 题意简介 emmmm...方伯伯脑抽做 ...

  9. 洛谷 P3285 / loj 2212 [SCOI2014] 方伯伯的 OJ 题解【平衡树】【线段树】

    平衡树分裂钛好玩辣! 题目描述 方伯伯正在做他的 OJ.现在他在处理 OJ 上的用户排名问题. OJ 上注册了 \(n\) 个用户,编号为 \(1\sim n\),一开始他们按照编号排名.方伯伯会按照 ...

随机推荐

  1. Java并发编程(4)--生产者与消费者模式介绍

    一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...

  2. QByteArray储存二进制数据(包括结构体,自定义QT对象)

    因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类 //自定义person结构体 typede ...

  3. 2016.07.15——istringstream测试

    istringstream测试 1.istringstream strcin(str),字符串(str)可以包括多个单词,单词之间使用空格分开 #include "stdafx.h" ...

  4. 基于Netty4.1.29.Final的helloworld实现.使用idea

    服务端: //服务端 public class Server { public static void main(String[] args) { //创建两个线程组 EventLoopGroup c ...

  5. from setuptools import setup ImportError: No module named setuptools【转】

    转自:http://www.cnblogs.com/chinacloud/archive/2010/12/24/1915644.html from setuptools import setupImp ...

  6. The data protection operation was unsuccessful. This may have been caused by not having the user profile loaded for the current thread's user context,

    在iis7.0布署网站后运行的错误,大致意思是:数据保护操作是不成功的.这可能是由于没有为当前线程的用户加载用户配置文件的导致 解决办法: 先为自己的网站新建一个应用程序池,然后新建的应用程序池上右键 ...

  7. ASP.NET MVC 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁

    在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检 ...

  8. IDL界面程序直接调用envi菜单对应功能

    参考自http://blog.sina.com.cn/s/blog_764b1e9d010115qu.html 参考文章的方法是构建一个button控件,通过单击实现,这种方法比较复杂,不是我们经常能 ...

  9. php CI框架

    CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为 PHP 程序员建立功能完善的 Web 应用程序.如果你是一个使用共享主机,并且为客户所要求的期限 ...

  10. 21 JSON and Go go语言和json

    JSON and Go 25 January 2011 Introduction JSON (JavaScript Object Notation) is a simple data intercha ...