[Scoi2014]方伯伯的OJ(动态开点splay)
开始没看数据范围差点以为是这题了: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)的更多相关文章
- 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树
洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap
3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec Memory Limit: 256 MBSubmit: 102 Solved: 54[Submit][Status ...
- luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树
LINK:方伯伯的OJ 一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的! 喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排 ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常
Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...
- [SCOI2014]方伯伯的OJ(线段树)
方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题.Oj上注册了n个用户,编号为1-n“,一开始他们按照编号排名. 方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为 ...
- [SCOI2014]方伯伯的OJ
看到这道题的第一想法就是要用FHQ treap 过了这道题...于是至今尚未成功(华丽的 T 掉了 (╯‵□′)╯︵┻━┻ ).于是附个地址. 然后水一波博客. 题意简介 emmmm...方伯伯脑抽做 ...
- 洛谷 P3285 / loj 2212 [SCOI2014] 方伯伯的 OJ 题解【平衡树】【线段树】
平衡树分裂钛好玩辣! 题目描述 方伯伯正在做他的 OJ.现在他在处理 OJ 上的用户排名问题. OJ 上注册了 \(n\) 个用户,编号为 \(1\sim n\),一开始他们按照编号排名.方伯伯会按照 ...
- BZOJ3595 : [Scoi2014]方伯伯的Oj
由于n很大,有2e8,所以不能直接用splay来维护排名 把splay修改一下 每个节点维护一个区间[l,r],表示编号在[l,r]之间的所有点都在这里 需要支持一个takeout操作: 把编号为k的 ...
- 洛谷 P3285 [SCOI2014]方伯伯的OJ
看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...
随机推荐
- FTP故障排除
1,ping 检查 IP是否通 禁PING可以使用TCPING 2,服务器端被动模式设置,可设置固定端口号,保证防火墙上该端口畅通 浏览器默认是主动模式 3,使用FLASHFXP软件可以监测到数据端口 ...
- Loading PDSC Debug Description Failed for STMicroelectronics STM32Lxxxxxxx”
今天在调程序的时候遇到这个问题 解决办法:将安装在MDK下面的文件属性由只读去掉: 成功!可以下载.
- 【LeetCode】克隆图
[问题]给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node]). 解释: 节点 的值是 ,它有两个邻居:节点 和 ...
- 十八、CI框架之数据库操作update用法
一.代码如图: 二.访问一下 三.我们来查看数据库,已经被修改了 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.
- 实验吧web-难-认真一点!(布尔盲注,py脚本)
也可用bp进行爆破,这里用py脚本. 打看网页输入1,显示You are in,输入2,显示You are not in,是个布尔注入. 然后看看过滤了什么. sql注入没有过滤:--+.or sql ...
- equals与hashcode分析
我们经常在面经中看到这样的问题,为什么重写equals方法就一定要重写hashcode方法.本文就是分析这个问题. <!--more--> 在阿里巴巴java开发手册中就给出了这样的规则. ...
- spring boot 接口返回值封装
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- Python 操作csv和excel表格
1. 操作csv表格 使用的库 csv 1. csv文件里读取数据 代码 1. 以列表形式打开 import csv f = open('csv_test.csv', 'r') # 打开csv文件 c ...
- 移动端主页内容 part4 axios
ajax 可以动态获取数据内容 vue中发送ajax有很多工具可用 浏览器自带的fetch 现在推荐: axios第三方模块(vue中发送ajax) 特点: 跨平台的数据请求 浏览器中xhr请求 n ...
- psp --2
PSP0 ---2 项目计划日志 姓名:赵腾 日期:9/12/2017 任务 日期 听课 编写程序 阅读课 ...