[BZOJ3595][SCOI2014]方伯伯的OJ(裂点Splay)
用一棵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)相关推荐
- [SCOI2014]方伯伯的OJ
看到这道题的第一想法就是要用FHQ treap 过了这道题...于是至今尚未成功(华丽的 T 掉了 (╯‵□′)╯︵┻━┻ ).于是附个地址. 然后水一波博客. 题意简介 emmmm...方伯伯脑抽做 ...
- 【bzoj 3595】: [Scoi2014]方伯伯的Oj
传送门&& 原题解 蒟蒻终于做到一道方伯伯的题了-- 调了一个上午一直TLE(发现自己打了好久的splay板子竟然是错的这种丢人事情我就不说了) 很明显,要建两棵树,$T1$维护排名, ...
- 「SCOI2014」方伯伯的 OJ 解题报告
「SCOI2014」方伯伯的 OJ 和列队有点像,平衡树点分裂维护即可 但是需要额外用个set之类的对编号查找点的位置 插入完了后记得splay,删除时注意特判好多东西 Code: #include ...
- bzoj 3594: [Scoi2014]方伯伯的玉米田
3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec Memory Limit: 128 MB Submit: 1399 Solved: 627 [Submit][ ...
- [bzoj 3594] [Scoi2014]方伯伯的玉米田
[bzoj 3594] [Scoi2014]方伯伯的玉米田 Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为 ...
- 3597: [Scoi2014]方伯伯运椰子
3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MB Submit: 388 Solved: 239 [ Submit][ ...
- [bzoj3597][SCOI2014]方伯伯运椰子
3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec Memory Limit: 64 MB Submit: 353 Solved: 215 [Submit][Statu ...
- BZOJ 3597 SCOI2014 方伯伯送椰子 网络流分析+SPFA
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3597 Description 四川的方伯伯为了致富,决定引进海南的椰子树.方伯伯的椰子园十 ...
- bzoj3597: [Scoi2014]方伯伯运椰子【分数规划+费用流】
Description 四川的方伯伯为了致富,决定引进海南的椰子树. 方伯伯的椰子园十分现代化,椰子园中有一套独特的交通系统. 现在用点来表示交通节点,边来表示道路.这样,方伯伯的椰子园就可以看作一个 ...
最新文章
- 国内ntp时间服务器ip地址
- tail | grep引起的内存升高【对比三天数据】
- udp与tcp协议介绍
- Excel使用控件创建动态地图图表
- 二维码提升对比度文献调研(5)--DeepLPF: Deep Local Parametric Filters for Image Enhancement
- docker 系列 - 基础镜像环境和Docker常用命令整理
- 下载文件变成php文档,关于文件下载后变成PHP格式的解决办法
- 前端下载音频的两种处理方式
- php 有道翻译api,php有道翻译api调用方法实例
- matlab 拉普拉斯金字塔,图像拉普拉斯金字塔(laplacian pyramid)并从金字塔重建原图 matlab程序实现...
- win10计算机拨号连接,拨号连接设置(Win10怎么设置宽带自动连接 win10开机自动连接宽带设置方法详解)...
- 沁恒微电子CH347是一款高速USB总线转接芯片
- BMZCTF Ook
- linux 系统编程--标准IO-缓存
- mac 下搭建paly framework体验(环境搭建)
- wx.getLocation接口申请
- 没有执行此操作所需的足够可用空间。_一文详解 MySQL 高可用之 DRBD | 原力计划...
- csp2021-12
- javascript 代码中的use strict是什么意思
- 删除插件mysearchresult(chrome和firebox)