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

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

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

注意各种细节。

  1 #include<map>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
  5 using namespace std;
  6
  7 const int N=400010;
  8 int n,m,rt,nd,ans,op,x,y,L[N],R[N],len[N],f[N],ch[N][2];
  9 map<int,int>mp;
 10
 11 int get(int l,int r){ nd++; L[nd]=l; R[nd]=r; len[nd]=r-l+1; return nd; }
 12 void upd(int x){ len[x]=len[ch[x][0]]+len[ch[x][1]]+R[x]-L[x]+1; }
 13
 14 void rot(int &rt,int x){
 15     int y=f[x],z=f[y],w=ch[y][1]==x;
 16     if (rt==y) rt=x; else ch[z][ch[z][1]==y]=x;
 17     f[x]=z; f[y]=x; f[ch[x][w^1]]=y;
 18     ch[y][w]=ch[x][w^1]; ch[x][w^1]=y; upd(y);
 19 }
 20
 21 void splay(int &rt,int x){
 22     while (x!=rt){
 23         int y=f[x],z=f[y];
 24         if (y!=rt) ((ch[z][0]==y)^(ch[y][0]==x)) ? rot(rt,x) : rot(rt,y);
 25         rot(rt,x);
 26     }
 27     upd(x);
 28 }
 29
 30 int split(int x,int k){
 31     int y=get(k+1,R[x]); R[x]=k;
 32     if (!ch[x][1]) ch[x][1]=y,f[y]=x;
 33     else{
 34         int s=ch[x][1];
 35         while (ch[s][0]) s=ch[s][0];
 36         ch[s][0]=y; f[y]=s;
 37     }
 38     splay(rt,y); mp[R[x]]=x; mp[R[y]]=y; return y;
 39 }
 40
 41 void Split(int &x,int k){
 42     if (k<R[x]) split(x,k);
 43     if (k>L[x]) x=split(x,k-1);
 44     splay(rt,x);
 45 }
 46
 47 void ins1(int x){
 48     int s=rt;
 49     while (ch[s][0]) s=ch[s][0];
 50     ch[s][0]=x; f[x]=s; splay(rt,x);
 51 }
 52
 53 void ins2(int x){
 54     int s=rt;
 55     while (ch[s][1]) s=ch[s][1];
 56     ch[s][1]=x; f[x]=s; splay(rt,x);
 57 }
 58
 59 void del(int x){
 60     splay(rt,x);
 61     int ls=ch[x][0],rs=ch[x][1];
 62     f[ls]=f[rs]=0; ch[x][0]=ch[x][1]=0;
 63     if (!ls || !rs) { rt=ls+rs; return; }
 64     int s=ls; while (ch[s][1]) s=ch[s][1];
 65     splay(ls,s); ch[s][1]=rs; f[rs]=rt=s; upd(s);
 66 }
 67
 68 int find(int k){
 69     for (int x=rt; ; ){
 70         if (k<=len[ch[x][0]]) x=ch[x][0];
 71         else{
 72             k-=len[ch[x][0]];
 73             if (k<=R[x]-L[x]+1) return k+L[x]-1;
 74             else k-=R[x]-L[x]+1,x=ch[x][1];
 75         }
 76     }
 77 }
 78
 79 int main(){
 80     freopen("bzoj3595.in","r",stdin);
 81     freopen("bzoj3595.out","w",stdout);
 82     scanf("%d%d",&n,&m); rt=get(1,n); mp[n]=1;
 83     rep(i,1,m){
 84         scanf("%d%d",&op,&x); x-=ans;
 85         if (op==1){
 86             scanf("%d",&y); y-=ans;
 87             int t=mp.lower_bound(x)->second;
 88             Split(t,x); printf("%d\n",ans=len[t]-len[ch[t][1]]);
 89             L[t]=R[t]=y; mp[y]=t;
 90         }
 91         if (op==2){
 92             int t=mp.lower_bound(x)->second;
 93             Split(t,x); printf("%d\n",ans=len[t]-len[ch[t][1]]);
 94             del(t); ins1(t);
 95         }
 96         if (op==3){
 97             int t=mp.lower_bound(x)->second;
 98             Split(t,x); printf("%d\n",ans=len[t]-len[ch[t][1]]);
 99             del(t); ins2(t);
100         }
101         if (op==4) printf("%d\n",ans=find(x));
102     }
103     return 0;
104 }

转载于:https://www.cnblogs.com/HocRiser/p/10192306.html

[BZOJ3595][SCOI2014]方伯伯的OJ(裂点Splay)相关推荐

  1. [SCOI2014]方伯伯的OJ

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

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

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

  3. 「SCOI2014」方伯伯的 OJ 解题报告

    「SCOI2014」方伯伯的 OJ 和列队有点像,平衡树点分裂维护即可 但是需要额外用个set之类的对编号查找点的位置 插入完了后记得splay,删除时注意特判好多东西 Code: #include ...

  4. bzoj 3594: [Scoi2014]方伯伯的玉米田

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 1399  Solved: 627 [Submit][ ...

  5. [bzoj 3594] [Scoi2014]方伯伯的玉米田

    [bzoj 3594] [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为 ...

  6. 3597: [Scoi2014]方伯伯运椰子

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec   Memory Limit: 64 MB Submit: 388   Solved: 239 [ Submit][ ...

  7. [bzoj3597][SCOI2014]方伯伯运椰子

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MB Submit: 353 Solved: 215 [Submit][Statu ...

  8. BZOJ 3597 SCOI2014 方伯伯送椰子 网络流分析+SPFA

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3597 Description 四川的方伯伯为了致富,决定引进海南的椰子树.方伯伯的椰子园十 ...

  9. bzoj3597: [Scoi2014]方伯伯运椰子【分数规划+费用流】

    Description 四川的方伯伯为了致富,决定引进海南的椰子树. 方伯伯的椰子园十分现代化,椰子园中有一套独特的交通系统. 现在用点来表示交通节点,边来表示道路.这样,方伯伯的椰子园就可以看作一个 ...

最新文章

  1. 国内ntp时间服务器ip地址
  2. tail | grep引起的内存升高【对比三天数据】
  3. udp与tcp协议介绍
  4. Excel使用控件创建动态地图图表
  5. 二维码提升对比度文献调研(5)--DeepLPF: Deep Local Parametric Filters for Image Enhancement
  6. docker 系列 - 基础镜像环境和Docker常用命令整理
  7. 下载文件变成php文档,关于文件下载后变成PHP格式的解决办法
  8. 前端下载音频的两种处理方式
  9. php 有道翻译api,php有道翻译api调用方法实例
  10. matlab 拉普拉斯金字塔,图像拉普拉斯金字塔(laplacian pyramid)并从金字塔重建原图 matlab程序实现...
  11. win10计算机拨号连接,拨号连接设置(Win10怎么设置宽带自动连接 win10开机自动连接宽带设置方法详解)...
  12. 沁恒微电子CH347是一款高速USB总线转接芯片
  13. BMZCTF Ook
  14. linux 系统编程--标准IO-缓存
  15. mac 下搭建paly framework体验(环境搭建)
  16. wx.getLocation接口申请
  17. 没有执行此操作所需的足够可用空间。_一文详解 MySQL 高可用之 DRBD | 原力计划...
  18. csp2021-12
  19. javascript 代码中的use strict是什么意思
  20. 删除插件mysearchresult(chrome和firebox)

热门文章

  1. Servlet 异常处理
  2. ASP.NET MVC WebAPI 资源整理
  3. Linux基础命令的操作(时间与日期,日历,计算器)
  4. nginx 安装与配置
  5. colpick-jQuery颜色选择器使用说明
  6. 面向过程与面向对象引入三大特性事务
  7. linux 内核调试方法
  8. 【转】CSS 与 HTML5 响应式图片
  9. WWDC 2018 New Localization Workflows
  10. 陈一舟:在中国当企业家要有承受能力 失败了大家会看你笑话