洛谷P3960 列队(Splay)
感觉自己好久不打数据结构已经完全不会了orz……
据说正解树状数组?然而并不会
首先考虑一下每一次操作,就是把一个人从这一行中取出并放到行的最后,再从最后一列取出放到列的最后
那么这两种操作其实可以看做同一个类型,都是把某一个数取出并放到最后
那么这个可以用splay来搞,用splay维护区间,然后每一次找第k个相当于找第k大,然后删除之后在末尾插入
然后如果直接开空间怕是要炸……那只能缩点,等做到这个点的时候再把它split出来……
然后……看代码好了……
//minamoto
#include<cstdio>
#include<iostream>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,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 sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(ll x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=1e7+,maxn=3e5+;
int n,m,q,x,y;ll t,u;
int fa[N],ch[N][],tot;ll L[N],R[N],sz[N];
struct Splay{
#define ls ch[x][0]
#define rs ch[x][1]
int rt;
inline int newnode(ll l,ll r){
L[++tot]=l,R[tot]=r,sz[tot]=r-l+;return tot;
}
inline void upd(int x){
sz[x]=sz[ls]+sz[rs]+R[x]-L[x]+;
}
void rotate(int x){
int y=fa[x],z=fa[y],d=ch[y][]==x;
ch[z][ch[z][]==y]=x;
fa[x]=z,fa[y]=x,fa[ch[x][d^]]=y,ch[y][d]=ch[x][d^],ch[x][d^]=y,upd(y);
}
void splay(int x){
for(int y=fa[x],z=fa[y];fa[x];y=fa[x],z=fa[y]){
if(fa[y])
((ch[y][]==x)^(ch[z][]==y))?rotate(x):rotate(y);
rotate(x);
}
upd(x),rt=x;
}
inline void ins(ll v){
int x=rt;
while(rs) x=rs;
newnode(v,v),fa[tot]=x,rs=tot,splay(tot);
}
ll split(int x,ll k){
ll s=L[x],t=R[x];
if(k!=s&&k!=t){
if(s+<t){
int a=newnode(k+,t);R[x]=k-;
ch[a][]=ch[x][],ch[x][]=a,fa[a]=x,upd(a),upd(x);
splay(a);
}else{++L[x],splay(x);}
}else{
k==t?--t:++s;
L[x]=s,R[x]=t,sz[x]=t-s+,splay(x);
}
return k;
}
ll rk(int k){
int x=rt;
while(true){
if(sz[ls]>=k) x=ls;
else{
k-=sz[ls];
if(k<=R[x]-L[x]+) return split(x,k+L[x]-);
k-=R[x]-L[x]+,x=rs;
}
}
}
inline void init(ll l,ll r){rt=newnode(l,r);}
int build(int l,int r,int f){
if(l>r) return ;
int mid=(l+r)>>,x=newnode(1ll*m*mid,1ll*m*mid);
fa[x]=f;
ls=build(l,mid-,x);
rs=build(mid+,r,x);
return upd(x),x;
}
}T[maxn];
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read(),q=read();
for(int i=;i<=n;++i) T[i].init(1ll*(i-)*m+,1ll*i*m-);
T[].rt=T[].build(,n,);
while(q--){
x=read(),y=read();
if(y==m){
print(u=T[].rk(x)),T[].ins(u);
}else{
print(u=T[x].rk(y));
t=T[].rk(x);
T[x].ins(t),T[].ins(u);
}
}
Ot();
return ;
}
洛谷P3960 列队(Splay)的更多相关文章
- 洛谷P3960 列队 Splay
其实思路并不算太难,就是代码量相对较大. 我们将一次离队转换为一次删除和两次加入,这样就可以保证空间是动态分配的,最大也不会暴空间. 说实话写之前感觉会很恶心,但是代码量就还好吧,有些细节需要特殊注意 ...
- 洛谷P3960 列队(NOIP2017)(Splay)
洛谷题目传送门 最弱的Splay...... 暴力模拟30分(NOIP2017实际得分,因为那时连Splay都不会)...... 发现只是一个点从序列里搬到了另一个位置,其它点的相对位置都没变,可以想 ...
- 洛谷 P3960 列队 解题报告
P3960 列队 题目描述 \(Sylvia\)是一个热爱学习的女♂孩子. 前段时间,\(Sylvia\)参加了学校的军训.众所周知,军训的时候需要站方阵. \(Sylvia\)所在的方阵中有\(n ...
- 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay
正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...
- 洛谷P3960 列队(动态开节点线段树)
题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...
- 洛谷 P3960 列队
https://www.luogu.org/problemnew/show/P3960 常数超大的treap #pragma GCC optimize("Ofast") #incl ...
- 洛谷 P3960 列队【线段树】
用动态开点线段树分别维护每一行和最后一列,线段树的作用是记录被选的点的个数以及查询第k个没被选的点,每次修改,从行里标记被选的点,从最后一列标记向左看齐之后少的点,然后用vector维护行列的新增点 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...
随机推荐
- 辛星浅析html5中的role属性
我们使用role属性告诉辅助设备.这个元素所扮演的角色.比方点击的按钮,我们通常就使用role="button",会让这个元素可点击. 可是它很多其它的是用来增强语义性,当现有的h ...
- P1355 神秘大三角
题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样例) 所有 ...
- javascript --- 声明提前(学习笔记)
声明提升 未声明变量 console.log(a); 在没有定义 a 的情况下,直接使用,会报错. 声明变量 console.log(a); var a = 2; 输出结果:undefined 并不会 ...
- uboot之logo显示【转】
本文转载自:http://blog.csdn.net/tuwenqi2013/article/details/60583735 版权声明:本文为博主原创文章,博主欢迎各位转载. 一.logo的调用流程 ...
- sublime text3 3176 注册码 License
注册码 sgbteam Single User License EA7E-1153259 8891CBB9 F1513E4F 1A3405C1 A865D53F 115F202E 7B91AB2D 0 ...
- [原创]java对word文档的在线打开
一.材料准备 百度一下:PageOffice,从官网下载PageOffice for Java.压缩包文件: 二. 实现步骤: 1. 打开“集成文件”目录,拷贝“WEB-INF\lib”目录中的pag ...
- Linux-内存进程和软件安装
1 swap分区 swapon -s 查看swap分区 mkswap 某分区挂载点 swapon -a 分区 激活该swap swapoff 挂载点 取消swap分区 2 内存 free 查看内存空间 ...
- vue 路由跳转到外部链接
尝试了几次发现,不论怎么写外部链接,最后跳转的路径都会加上localhost:3030; 这个应该是和vue的路由有关系,最后解决方法, window.location = 'http://www.b ...
- spellchecker inspection helps locate typeos and misspelling in your code, comments and literals, and fix them in one click
项目layout文件中出现 spellchecker inspection helps locate typos and misspelling in your code, comments and ...
- Prime Independence
题意: 对于给定集合,求解最大的子集合,使得集合内两两之商不为质数. 解法: 考虑对于每一个数字分解质因数可以得到 $O(nloglogNUM)$ 条两个数字不可以出现在同一集合的信息. 同时发现一条 ...