洛谷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 ...
随机推荐
- 九度OJ 1104:整除问题 (整除、因式分解)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4142 解决:1346 题目描述: 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除. 输入: 两个整数n(2< ...
- ElasticSearch(十五) _search api 分页搜索及deep paging性能问题
1.分页搜索 语法: size,from GET /_search?size=10 GET /_search?size=10&from=0 GET /_search?size=10&f ...
- 【C++基础学习】成员对象与对象数组
第一部分 对象成员与对象数组 从一个简单的例子开始说起,首先定义一个Coordinate的类,里面有两个公有的成员变量m_iX和m_iY,分别代表横坐标和纵坐标. 接下来,定义一个对象数组cood和一 ...
- Post Man 调用CRMAPI
官方文档 https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/setup-postman ...
- Codeforces Round #254 (Div. 2) A. DZY Loves Chessboard —— dfs
题目链接: http://codeforces.com/problemset/problem/445/A 题解: 这道题是在现场赛的最后一分钟通过的,相当惊险,而且做的过程也很曲折. 先是用递推,结果 ...
- haproxy官方配置文档地址
http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#4-option%20http-keep-alive
- 让人头疼一晚上的 select 下拉框赋值问题
一开始做这个功能 批量修改用户组 , 当勾选若干用户组后, 点击[批量修改用户组]->ajax提交后台查询->返回下拉菜单列表内容-> 弹出对话框并赋予下拉菜单select 动态数值 ...
- Swift扩展
Swift中的「扩展」(extensions)和OC中的categories类似,只是Swift中的「扩展」没有名字.Swift中的「扩展」可以向一个已有的类/结构体/枚举类型添加新功能,这包括在没有 ...
- 万径人踪灭(FFT+manacher)
传送门 这题--我觉得像我这样的菜鸡选手难以想出来-- 题目要求求出一些子序列,使得其关于某个位置是对称的,而且不能是连续一段,求这样的子序列的个数.这个直接求很困难,但是我们可以先求出所有关于某个位 ...
- vue-cli脚手架搭建Vue.js项目
前提条件: 一.node.js 下载 https://nodejs.org/zh-cn/download/ 二.webpack 安装 npm install webpack -g PS:-g 就是 ...