[BZOJ3678]wangxz与OJ-[Splay一类的平衡树]
Description
Solution
直接splay搞定吧。。似乎非旋treap也ok?
我已经菜到模板题都写不出来了qaq
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,A[];
struct Splay
{
int rt,cnt=;
int ch[][],num[][],sz[],fa[];
void pushup(int k){ sz[k]=sz[ch[k][]]+sz[ch[k][]]+num[k][]-num[k][]+;}
void build(int &k,int l,int r)
{
k=++cnt;
int mid=(l+r)/;
num[k][]=num[k][]=A[mid];
if (l<mid) build(ch[k][],l,mid-);
if (mid<r) build(ch[k][],mid+,r);
fa[ch[k][]]=fa[ch[k][]]=k;
pushup(k);
}
void rotate(int x,int &rt)
{
int y=fa[x],k=ch[y][]==x;
ch[y][k]=ch[x][k^];fa[ch[y][k]]=y;
if (y==rt) rt=x;else ch[fa[y]][ch[fa[y]][]==y]=x;
fa[x]=fa[y];
fa[y]=x;ch[x][k^]=y;
pushup(y);pushup(x);
}
void splay(int x,int &rt)
{
int y;
while (x!=rt)
{
y=fa[x];
if (y!=rt&&(ch[fa[y]][]==y)==(ch[y][]==x)) rotate(y,rt);
rotate(x,rt);
}
}
int work(int x,int k)
{
if (sz[ch[x][]]>=k) return work(ch[x][],k);
if (sz[x]-sz[ch[x][]]<k) return work(ch[x][],k-sz[x]+sz[ch[x][]]);
k-=sz[ch[x][]];int son;
if (k!=)
{
son=++cnt;
num[son][]=num[x][];num[son][]=num[son][]+k-;
num[x][]=num[son][]+; fa[son]=x;
ch[son][]=ch[x][];
ch[x][]=son;
pushup(son);
k=;
}
if (k!=num[x][]-num[x][]+)
{
son=++cnt;
num[son][]=num[x][]+k;
num[son][]=num[x][];
num[x][]=num[son][]-; fa[son]=x;
ch[son][]=ch[x][];
ch[x][]=son;
pushup(son);
}
return x;
}
void insert(int p,int a,int b)
{
int x1=work(rt,p),x2=work(rt,p+);
splay(x1,rt);
splay(x2,ch[x1][]);
int son=++cnt;
num[son][]=a;num[son][]=b;fa[son]=x2;
ch[x2][]=son;
sz[son]=b-a+;
pushup(x2);
pushup(x1);
}
void remove(int a,int b)
{
int x1=work(rt,a-),x2=work(rt,b+);
splay(x1,rt);
splay(x2,ch[x1][]);
ch[x2][]=;
pushup(x2);
pushup(x1);
}
int query(int x,int q)
{
if (!x) return ;
if (sz[ch[x][]]>=q) return query(ch[x][],q);
if (sz[x]-sz[ch[x][]]>=q)
{q-=sz[ch[x][]];return num[x][]+q-;}
return query(ch[x][],q-sz[x]+sz[ch[x][]]); }
}splay;
int _type,p,a,b;
int main()
{
scanf("%d%d",&n,&m);
n++;
for (int i=;i<=n;i++) scanf("%d",&A[i]);
n++;
splay.build(splay.rt,,n);
for (int i=;i<=m;i++)
{
scanf("%d",&_type);
if (!_type)
{
scanf("%d%d%d",&p,&a,&b);p++;
splay.insert(p,a,b);
}
if (_type==)
{
scanf("%d%d",&a,&b);a++;b++;
splay.remove(a,b);
}
if (_type==)
{
scanf("%d",&p);p++;
printf("%d\n",splay.query(splay.rt,p));
}
}
}
[BZOJ3678]wangxz与OJ-[Splay一类的平衡树]的更多相关文章
- 【BZOJ3678】wangxz与OJ Splay
[BZOJ3678]wangxz与OJ Description 某天,wangxz神犇来到了一个信息学在线评测系统(Online Judge).由于他是一位哲♂学的神犇,所以他不打算做题.他发现这些题 ...
- BZOJ3678 wangxz与OJ (平衡树 无旋treap)
题面 维护一个序列,支持以下操作: 1.在某个位置插入一段值连续的数. 2.删除在当前序列位置连续的一段数. 3.查询某个位置的数是多少. 题解 显然平衡树,一个点维护一段值连续的数,如果插入或者删除 ...
- BZOJ3678: wangxz与OJ
splay缩点. #include<bits/stdc++.h> #define L(t) (t)->c[0] #define R(t) (t)->c[1] #define F ...
- bzoj 3678 wangxz与OJ
3678: wangxz与OJ Time Limit: 10 Sec Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.php ...
- 洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树
洛谷P3285 [SCOI2014]方伯伯的OJ 动态开点平衡树 题目描述 方伯伯正在做他的 \(Oj\) .现在他在处理 \(Oj\) 上的用户排名问题. \(Oj\) 上注册了 \(n\) 个用户 ...
- 【bzoj3678】wangxz与OJ
Portal -- > bzoj 3678 Solution 这题==真实智力康复qwq 然而众多神犇都说是10min写完的题我..可能写了近1h吧==深深感受到自己的弱小qwq (丢上来是因为 ...
- 【BZOJ3678】Wangxz和OJ
题意: 不想讲 题解: Rope真香! 正解是Splay缩点,访问时再拆成一个序列 代码: //STL dafa good! #include<algorithm> #include< ...
- BZOJ 3595: [Scoi2014]方伯伯的Oj Splay + 动态裂点 + 卡常
Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和 ...
- luogu P3285 [SCOI2014]方伯伯的OJ splay 线段树
LINK:方伯伯的OJ 一道稍有质量的线段树题目.不写LCT splay这辈子是不会单独写的 真的! 喜闻乐见的是 题目迷惑选手 \(op==1\) 查改用户在序列中的位置 题目压根没说位置啊 只有排 ...
随机推荐
- 聊聊host中ip/域名映射记录的解析规则
今天宝叔突然在群里发了个问题; host做如下配置,a.com会指向哪里?或者说ping一下a.com结果会是什么? 127.0.0.1 a.com 192.168.4.106 a.com 192.1 ...
- 在Django中使用Q()对象
转载于: http://www.smallerpig.com/1000.html 问题 一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码: >>& ...
- React 简单实例 (React-router + webpack + Antd )
React Demo Github 地址 经过React Native 的洗礼之后,写了这个 demo :React 是为了使前端的V层更具组件化,能更好的复用,同时可以让你从操作dom中解脱出来, ...
- ethereumjs/ethereumjs-vm-2-API文档
https://github.com/ethereumjs/ethereumjs-vm/blob/master/docs/index.md vm.runBlockchain Processes blo ...
- Linux常用监控服务器性能命令
列举比较常用的几种监控服务器性能的Linux命令.其实,在我看来,目前针对Linux系统内存.硬盘.TCP/IP等等相关的指标,Linux本身自带的或者是一些开源项目等基本上都能达到这个获取服务器性能 ...
- I、Q信号是如何产生的,I、Q信号复用的作用
接收机在中频部分实现模数变换和采样,采样后的信号和数字域的同频相乘,就可以得到基带的I.Q分量.在无线接口传输时,每一种使用特定的载波频率.码(扩频码和扰码)以及载波相对相位(I或Q)的信道都可以理解 ...
- PCA方法从原理到实现
一.简介 PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法,大家知道,我们在处理有关数字图像处理方面的问题时,比如经常用的图像的查询问题 ...
- Linux内存管理-高端内存(二)
在支持MMU的32位处理器平台上,Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Lin ...
- Java单例模式几种实现方式
在平时的工作.学员的学习以及面试过程中,单例模式作为一种常用的设计模式,会经常被面试官问到,甚至笔试会要求学员现场默写,下面将会就单例模式的实现思路和几种常见的实现方式进行简单的分享. 单例模式,是一 ...
- 【js】Redux基本原理和使用
Redux不是说任何的应用都要用到它,如果遇到了react解决不了得问题,可以考虑使用它. 例如: 用户的使用方式复杂不同身份的用户有不同的使用方式(比如普通用户和管理员)多个用户之间可以协作与服务器 ...