https://www.luogu.org/problemnew/show/P3960

常数超大的treap

 #pragma GCC optimize("Ofast")
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
#define N 6001000
queue<int> q;
int ch[N][],r[N],mem;
ll lx[N],rx[N],sz[N];
int rand1()
{
static int x=;
return x=(48271LL*x+)%;
}
int getnode()
{
int t=q.front();q.pop();r[t]=rand1();
lx[t]=rx[t]=sz[t]=ch[t][]=ch[t][]=;
return t;
}
void delnode(int x) {q.push(x);}
void upd(int x) {sz[x]=sz[ch[x][]]+sz[ch[x][]]+rx[x]-lx[x]+;}
int merge(int a,int b)
{
if(!a||!b) return a+b;
if(r[a]<r[b])
{
ch[a][]=merge(ch[a][],b);upd(a);
return a;
}
else
{
ch[b][]=merge(a,ch[b][]);upd(b);
return b;
}
}
pi split(int a,ll n)
{
if(!a) return mp(,);
ll ls=sz[ch[a][]];pi t;
if(n<=ls)
{
t=split(ch[a][],n);ch[a][]=t.se;
upd(a);t.se=a;
}
else
{
t=split(ch[a][],n-ls-(rx[a]-lx[a]+));ch[a][]=t.fi;
upd(a);t.fi=a;
}
return t;
}
int split_node(int a,ll n)
{
ll ls=sz[ch[a][]];
if(n<=ls) {ch[a][]=split_node(ch[a][],n);return a;}
else if(n<=ls+rx[a]-lx[a]+)
{
n-=ls;
int now=ch[a][],rc=ch[a][],t;ll l=lx[a],r=rx[a];
if(n!=)
{
t=getnode();lx[t]=l;rx[t]=l+n-;upd(t);
now=merge(now,t);
}
t=getnode();lx[t]=rx[t]=l+n-;upd(t);
now=merge(now,t);
if(n!=r-l+)
{
t=getnode();lx[t]=l+n;rx[t]=r;upd(t);
now=merge(now,t);
}
now=merge(now,rc);delnode(a);
return now;
}
else {ch[a][]=split_node(ch[a][],n-(ls+rx[a]-lx[a]+));return a;}
}
int rt[];
ll n,m;int qq;
int main()
{
int i,t;ll x,y,ans;pi p1,p2,p3,p4;
for(i=;i<N;++i) q.push(i);
scanf("%lld%lld%d",&n,&m,&qq);
for(i=;i<=n;i++)
{
t=getnode();lx[t]=ll(i-)*m+;rx[t]=ll(i)*m-;upd(t);
rt[i]=t;
}
for(i=;i<=n;i++)
{
t=getnode();lx[t]=rx[t]=i*m;upd(t);
rt[]=merge(rt[],t);
}
while(qq--)
{
scanf("%lld%lld",&x,&y);
if(y==m)
{
rt[]=split_node(rt[],x);
p1=split(rt[],x-);p2=split(p1.se,);
ans=lx[p2.fi];
rt[]=merge(p1.fi,merge(p2.se,p2.fi));
}
else
{
rt[x]=split_node(rt[x],y);
p1=split(rt[x],y-);p2=split(p1.se,);
ans=lx[p2.fi];
rt[x]=merge(p1.fi,p2.se);
rt[]=split_node(rt[],x);
p3=split(rt[],x-);p4=split(p3.se,);
rt[x]=merge(rt[x],p4.fi);
rt[]=merge(p3.fi,merge(p4.se,p2.fi));
}
printf("%lld\n",ans);
}
return ;
}

洛谷 P3960 列队的更多相关文章

  1. 洛谷P3960 列队(NOIP2017)(Splay)

    洛谷题目传送门 最弱的Splay...... 暴力模拟30分(NOIP2017实际得分,因为那时连Splay都不会)...... 发现只是一个点从序列里搬到了另一个位置,其它点的相对位置都没变,可以想 ...

  2. 洛谷 P3960 列队 解题报告

    P3960 列队 题目描述 \(Sylvia\)是一个热爱学习的女♂孩子. 前段时间,\(Sylvia\)参加了学校的军训.众所周知,军训的时候需要站方阵. \(Sylvia\)所在的方阵中有\(n ...

  3. 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay

    正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...

  4. 洛谷P3960 列队(动态开节点线段树)

    题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元 ...

  5. 洛谷P3960 列队(Splay)

    传送门 感觉自己好久不打数据结构已经完全不会了orz…… 据说正解树状数组?然而并不会 首先考虑一下每一次操作,就是把一个人从这一行中取出并放到行的最后,再从最后一列取出放到列的最后 那么这两种操作其 ...

  6. 洛谷 P3960 列队【线段树】

    用动态开点线段树分别维护每一行和最后一列,线段树的作用是记录被选的点的个数以及查询第k个没被选的点,每次修改,从行里标记被选的点,从最后一列标记向左看齐之后少的点,然后用vector维护行列的新增点 ...

  7. 洛谷P3960 列队 Splay

    其实思路并不算太难,就是代码量相对较大. 我们将一次离队转换为一次删除和两次加入,这样就可以保证空间是动态分配的,最大也不会暴空间. 说实话写之前感觉会很恶心,但是代码量就还好吧,有些细节需要特殊注意 ...

  8. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  9. NOIP2017提高组Day2T3 列队 洛谷P3960 线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vij ...

随机推荐

  1. Arcgis Engine(ae)接口详解(5):IGeometry几何基础操作

    //点操作~~~~~~~~~~~~~~~~~~~~~~~~~ //通过坐标生成点 IPoint point = new PointClass(); point.PutCoords(, ); //获取点 ...

  2. Eclipse搭建Web Service服务

    1.建立动态Web工程(Dynamic Web Project),工程名为Server.编写类HelloWorld. package com.mysever; public class HelloWo ...

  3. 端口扫描 开启 防火墙 iptables SELinux

    Linux 如何打开端口 - lclc - 博客园 https://www.cnblogs.com/lcword/p/5869522.html linux如何查看端口相关信息_百度经验 https:/ ...

  4. [RK3399][Android7.1] 调试笔记 --- 模块编译32位动态库【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/78923784 Platform: RK3399 OS: Android 7.1 Board: ...

  5. javascript中基本类型和引用类型的区别分析

    大多数人系统学习过的程序设计语言,在这些语言的学习过程中最早学到的几个要点之一就是值类型和引用类型的区别.下面我们来看一下在 JavaScript 中基本数据类型(Primitive Types)和引 ...

  6. Android中的ProgressBar的android:indeterminate

    不明确(false)就是滚动条的当前值自动在最小到最大值之间来回移动,形成这样一个动画效果,这个只是告诉别人“我正在工作”,但不能提示工作进度到哪个阶段.主要是在进行一些无法确定操作时间的任务时作为提 ...

  7. Tomcat 系统架构与设计模式之一

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理 来自:http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/index.html 这 ...

  8. UISwitch用法:

    代码: #import "ViewController.h" @interface ViewController () @end @implementation ViewContr ...

  9. June Challenge 2017

    A Good Set 分析:水题,选奇数即可 #include "iostream" #include "cstdio" #include "cstr ...

  10. UVA 11174 Stand in a Line 树上计数

    UVA 11174 考虑每个人(t)的所有子女,在全排列中,t可以和他的任意子女交换位置构成新的排列,所以全排列n!/所有人的子女数连乘   即是答案 当然由于有MOD 要求逆. #include & ...