传送门&& 原题解

蒟蒻终于做到一道方伯伯的题了……

调了一个上午一直TLE(发现自己打了好久的splay板子竟然是错的这种丢人事情我就不说了)

很明显,要建两棵树,$T1$维护排名,$T2$维护编号,$T2$表示编号为$x$的点在$T1$中的节点编号

操作一:在$T2$中找到编号,到$T1$算排名,然后更新$T2$

其他操作类似

然后重点讲一下分点操作

因为只有$10^5$个操作,但却有$10^8$个点,所以不可能对每一个点都建树

于是我们考虑一下,让splay的每一个节点代表的不是点,而是一个区间。当需要用到点时,再把这个点从区间中分裂出来

这样可以保证不需要用到的节点不会影响复杂度

关于分点操作具体如何实现,可以参考代码

 //minamoto
#include<bits/stdc++.h>
using namespace std;
const int N=,INF=0x3f3f3f3f;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<15,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char obuf[<<],*o=obuf;
void print(int x){
if(x>) print(x/);
*o++=x%+;
}
map<int,int> f;int n,m,ans;
struct node{
int fa,ch[];
int sz,l,r;
} e[N];
int cnt,root;
void pushup(int x){
e[x].sz=e[e[x].ch[]].sz+e[e[x].ch[]].sz+e[x].r-e[x].l+;
}
void rotate(int x){
int y=e[x].fa,z=e[y].fa;
int op= e[y].ch[]==x;
e[x].fa=z;
if(z) e[z].ch[e[z].ch[]==y]=x;
e[y].ch[op]=e[x].ch[op^],e[e[x].ch[op^]].fa=y;
e[y].fa=x;e[x].ch[op^]=y;
pushup(x),pushup(y);
}
void splay(int x,int goal){
while(e[x].fa!=goal){
int y=e[x].fa,z=e[y].fa;
if(z!=goal)
((e[z].ch[]==y)^(e[y].ch[]==x))?rotate(x):rotate(y);
rotate(x);
}
pushup(x);
if(goal==) root=x;
}
int query(int x){
splay(x,);
return e[x].sz-e[e[x].ch[]].sz;
}
void pop(int x){
int lower=e[x].ch[];
int upper=e[x].ch[];
while(e[lower].ch[]) lower=e[lower].ch[];
while(e[upper].ch[]) upper=e[upper].ch[];
if(!lower&&!upper) {root=;return;}
if(!lower){
splay(upper,);
e[x].fa=e[upper].ch[]=;
e[x].sz=,pushup(upper);
}
else if(!upper){
splay(lower,);
e[x].fa=e[lower].ch[]=;
e[x].sz=,pushup(lower);
}
else{
splay(lower,),splay(upper,lower);
e[upper].ch[]=e[x].fa=;
e[x].sz=;
pushup(upper),pushup(lower);
}
}
int getKth(int x){
int now=root;
while(true){
int sum=e[e[now].ch[]].sz+e[now].r-e[now].l+;
if(e[e[now].ch[]].sz>=x) now=e[now].ch[];
else if(sum>=x){x-=e[e[now].ch[]].sz;break;}
else x-=sum,now=e[now].ch[];
}
return e[now].l+x-;
}
void push_front(int x){
if(!root){root=x;return;}
int fa=root;
while(e[fa].ch[]) e[fa].sz++,fa=e[fa].ch[];
e[fa].sz++;
e[fa].ch[]=x,e[x].fa=fa;
splay(x,);
}
void push_back(int x){
if(!root){root=x;return;}
int fa=root;
while(e[fa].ch[]) e[fa].sz++,fa=e[fa].ch[];
e[fa].sz++;
e[fa].ch[]=x,e[x].fa=fa;
splay(x,);
}
void split(int x,int id){
int l=e[x].l,r=e[x].r,ls,rs;
if(l==r) return;
if(l==id){
rs=++cnt;
f[r]=rs,f[id]=x;
e[rs].ch[]=e[x].ch[];
e[e[rs].ch[]].fa=rs;
e[x].ch[]=rs,e[rs].fa=x;
e[rs].l=l+,e[rs].r=r;
e[x].r=l;
pushup(rs),pushup(x);
}
else if(r==id){
ls=++cnt;
f[r-]=ls,f[id]=x;
e[ls].ch[]=e[x].ch[];
e[e[ls].ch[]].fa=ls;
e[x].ch[]=ls,e[ls].fa=x;
e[ls].l=l,e[ls].r=r-;
e[x].l=r;
pushup(ls),pushup(x);
}
else{
ls=++cnt,rs=++cnt;
f[id]=x,f[id-]=ls,f[r]=rs;
e[ls].ch[]=e[x].ch[],e[rs].ch[]=e[x].ch[];
e[e[ls].ch[]].fa=ls,e[e[rs].ch[]].fa=rs;
e[x].ch[]=ls,e[x].ch[]=rs,e[ls].fa=x,e[rs].fa=x;
e[x].l=e[x].r=id;
e[ls].l=l,e[ls].r=id-;
e[rs].l=id+,e[rs].r=r;
pushup(ls),pushup(rs),pushup(x);
}
splay(x,);
}
void init(){
root=cnt=;
e[].l=,e[].r=n,e[].sz=n;
f[n]=;
}
int main(){
//freopen("testdata.in","r",stdin);
n=read(),m=read();
init();
while(m--){
int opt=read();
switch(opt){
case :{
int oid=read()-ans,nid=read()-ans;
int x=f.lower_bound(oid)->second;
split(x,oid);
ans=query(x);
e[x].l=e[x].r=nid,f[nid]=x;
print(ans),*o++='\n';
break;
}
case :{
int id=read()-ans;
int x=f.lower_bound(id)->second;
split(x,id);
ans=query(x);
pop(x);
push_front(x);
print(ans),*o++='\n';
break;
}
case :{
int id=read()-ans;
int x=f.lower_bound(id)->second;
split(x,id);
ans=query(x);
pop(x);
push_back(x);
print(ans),*o++='\n';
break;
}
case :{
int k=read()-ans;
ans=getKth(k);
print(ans),*o++='\n';
break;
}
}
}
fwrite(obuf,o-obuf,,stdout);
return ;
}

【bzoj 3595】: [Scoi2014]方伯伯的Oj的更多相关文章

  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 Splay + 动态裂点 + 卡常

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

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

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

  4. bzoj 3597: [Scoi2014]方伯伯运椰子 0/1分数规划

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 144  Solved: 78[Submit][Status ...

  5. bzoj 3594: [Scoi2014]方伯伯的玉米田 dp树状数组优化

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 314  Solved: 132[Submit][Sta ...

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

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

  7. bzoj 3597: [Scoi2014]方伯伯运椰子 [01分数规划 消圈定理 spfa负环]

    3597: [Scoi2014]方伯伯运椰子 题意: from mhy12345 给你一个满流网络,对于每一条边,压缩容量1 需要费用ai,扩展容量1 需要bi, 当前容量上限ci,每单位通过该边花费 ...

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

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

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

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

  10. [SCOI2014]方伯伯的OJ

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

随机推荐

  1. 112. Path Sum (Tree; DFS)

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  2. jmeter压力测试的简单实例+badboy脚本录制

    JMeter的安装:在网上下载,在下载后的zip解压后,在bin目录下找到JMeter.bat文件,双击就可以运行JMeter. http://jmeter.apache.org/ 在使用jmeter ...

  3. 混合开发Js bridge新秀-DSBridge iOS篇

    这个DSBridge 和我之前开发做的混合开发 用的方式 很相似,所以觉得很是不错,推荐给你大家. DSBridge-IOS:https://github.com/wendux/DSBridge-IO ...

  4. HTTP协议简析(二)

    HTTP响应也包含四部分内容: 响应行: 协议版本:HTTP/1.1 状态码:200 状态描述:对状态码的说明 响应头:用来规范数据,常用的有: server:服务器信息 date:响应的时间 las ...

  5. HAproxy-1.6.3 安装部署

    反向代理优缺点: haproxy反向代理高性能的HTTP,TCP反向代理 nginx:优点:1.web服务器,比较广泛2.工作7层location设置比较复杂基于HTTP(url,cookies,ag ...

  6. Luogu 4705 玩游戏

    看见这个题依稀想起了$5$月月赛时候的事情,到现在仍然它感觉非常神仙. 游戏$k$次价值的期望答案 $$ans_k = \frac{1}{nm}\sum_{i = 1}^{n}\sum_{j = 1} ...

  7. mosquitto配置文件/etc/mosquitto/mosquitto.conf配置参数详细说明

    mosquitto配置文件/etc/mosquitto/mosquitto.conf配置参数详细说明 摘自:https://blog.csdn.net/weixin_43025071/article/ ...

  8. sed命令n,N,d,D,p,P,h,H,g,G,x解析2

    摘自: https://blog.csdn.net/xiexingshishu/article/details/50514132 sed命令n,N,d,D,p,P,h,H,g,G,x解析 2016年0 ...

  9. 设计模式(java)--简单工厂模式之女娲造人.水果农场

    女娲抟土造人 话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面. 女娲造人,这就是简单工厂模式的应用.  首先,在这个造人的思 ...

  10. UVa 11996 Jewel Magic (splay + Hash + 二分)

    题意:给定一个长度为n的01串,你的任务是依次执行如表所示的m条指令: 1 p c 在第p个字符后插入字符,p = 0表示在整个字符串之前插入2 p 删除第p个字符,后面的字符往前移3 p1 p2反转 ...