开始没看数据范围差点以为是这题了:https://www.cnblogs.com/hfctf0210/p/10911340.html

然后看到n<=1e8,怎么这么大?

所以这题需要用动态开点线段树或者动态开点splay,而我上面的那题写的树状数组,为了熟悉splay就用动态开点splay吧而且也不知道这题动态开点线段树怎么写。正常要开两棵splay,但是关于用户的一棵操作简单没有必要开,所以可以用map代替,为了方便lower_bound查询,map记录右端点。然后先要执行三个基本操作:1、查询第k大。2、查询k节点的rank。3、分裂节点,分裂就是直接开新节点即可。然后重点在于2,3操作,一种简便的方法就是将目标节点拆开并旋转到根,将左右子树合并,使其成为第一/倒一。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
struct node{int ch[],sz,l,r,fa;}t[N<<];
int n,m,root,cnt,ans;
map<int,int>mp;
int newnode(int l,int r)
{
int k=++cnt;
t[k].ch[]=t[k].ch[]=;
t[k].l=l,t[k].r=r;
t[k].sz=t[k].r-t[k].l+;
return k;
}
void pushup(int k){t[k].sz=t[t[k].ch[]].sz+t[t[k].ch[]].sz+t[k].r-t[k].l+;}
int dir(int k){return t[t[k].fa].ch[]==k;}
void rotate(int x)
{
int y=t[x].fa,z=t[y].fa,d1=dir(x),d2=dir(y);
t[y].ch[d1]=t[x].ch[d1^];
t[t[x].ch[d1^]].fa=y;
t[z].ch[d2]=x;
t[x].fa=z;
t[y].fa=x;
t[x].ch[d1^]=y;
pushup(y),pushup(x);
}
void splay(int x,int goal)
{
while(t[x].fa!=goal)
{
int y=t[x].fa,z=t[y].fa,d1=dir(x),d2=dir(y);
if(z!=goal){if(d1==d2)rotate(y);else rotate(x);}
rotate(x);
}
if(!goal)root=x;
}
int getkth(int rk)
{
int k=root;
while()
{
int son=t[k].ch[];
if(rk<=t[t[k].ch[]].sz)k=t[k].ch[];
else if(rk>t[t[k].ch[]].sz+t[k].r-t[k].l+)
rk-=t[t[k].ch[]].sz+t[k].r-t[k].l+,k=t[k].ch[];
else return t[k].l+rk-t[t[k].ch[]].sz-;
}
}
int getrk(int k){splay(k,);return t[t[k].ch[]].sz+;}
void split(int k,int id)
{
if(t[k].l==t[k].r)return;
int l=,r=;
mp[id]=k;
if(t[k].l!=id)
{
mp[id-]=l=newnode(t[k].l,id-);
t[l].ch[]=t[k].ch[];
t[t[l].ch[]].fa=l;
t[k].ch[]=l;
t[l].fa=k;
}
if(t[k].r!=id)
{
mp[t[k].r]=r=newnode(id+,t[k].r);
t[r].ch[]=t[k].ch[];
t[t[r].ch[]].fa=r;
t[k].ch[]=r;
t[r].fa=k;
}
t[k].l=t[k].r=id;
if(l)pushup(l);
if(r)pushup(r);
pushup(k);
}
void change(int k,int tp)
{
splay(k,);
k=root;
if(!t[k].ch[tp])return;
if(!t[k].ch[tp^])t[k].ch[tp^]=t[k].ch[tp],t[k].ch[tp]=;
else{
k=t[k].ch[tp^];
while(t[k].ch[tp])k=t[k].ch[tp];
t[t[root].ch[tp]].fa=k;
t[k].ch[tp]=t[root].ch[tp];
t[root].ch[tp]=;
splay(t[k].ch[tp],);
}
}
int main()
{
scanf("%d%d",&n,&m);
root=mp[n]=newnode(,n);
while(m--)
{
int op,x,y,pos;scanf("%d%d",&op,&x),x-=ans;
if(op==)
{
scanf("%d",&y),y-=ans;
pos=(*mp.lower_bound(x)).second;
split(pos,x);
printf("%d\n",ans=getrk(pos));
t[pos].l=t[pos].r=y;
mp[y]=pos;
}
else if(op==)printf("%d\n",ans=getkth(x));
else{
int pos=(*mp.lower_bound(x)).second;
split(pos,x);
printf("%d\n",ans=getrk(pos));
change(pos,op-);
}
}
}

[Scoi2014]方伯伯的OJ(动态开点splay)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [SCOI2014]方伯伯的OJ

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

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

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

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

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

  9. 洛谷 P3285 [SCOI2014]方伯伯的OJ

    看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...

随机推荐

  1. FTP故障排除

    1,ping 检查 IP是否通 禁PING可以使用TCPING 2,服务器端被动模式设置,可设置固定端口号,保证防火墙上该端口畅通 浏览器默认是主动模式 3,使用FLASHFXP软件可以监测到数据端口 ...

  2. Loading PDSC Debug Description Failed for STMicroelectronics STM32Lxxxxxxx”

    今天在调程序的时候遇到这个问题 解决办法:将安装在MDK下面的文件属性由只读去掉: 成功!可以下载.

  3. 【LeetCode】克隆图

    [问题]给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node]). 解释: 节点 的值是 ,它有两个邻居:节点 和 ...

  4. 十八、CI框架之数据库操作update用法

    一.代码如图: 二.访问一下 三.我们来查看数据库,已经被修改了 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.

  5. 实验吧web-难-认真一点!(布尔盲注,py脚本)

    也可用bp进行爆破,这里用py脚本. 打看网页输入1,显示You are in,输入2,显示You are not in,是个布尔注入. 然后看看过滤了什么. sql注入没有过滤:--+.or sql ...

  6. equals与hashcode分析

    我们经常在面经中看到这样的问题,为什么重写equals方法就一定要重写hashcode方法.本文就是分析这个问题. <!--more--> 在阿里巴巴java开发手册中就给出了这样的规则. ...

  7. spring boot 接口返回值封装

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  8. Python 操作csv和excel表格

    1. 操作csv表格 使用的库 csv 1. csv文件里读取数据 代码 1. 以列表形式打开 import csv f = open('csv_test.csv', 'r') # 打开csv文件 c ...

  9. 移动端主页内容 part4 axios

    ajax  可以动态获取数据内容 vue中发送ajax有很多工具可用 浏览器自带的fetch 现在推荐: axios第三方模块(vue中发送ajax) 特点: 跨平台的数据请求 浏览器中xhr请求 n ...

  10. psp --2

    PSP0 ---2 项目计划日志 姓名:赵腾                                                日期:9/12/2017 任务 日期 听课 编写程序 阅读课 ...