luogu

sol

震惊!\(NOIP\)居然也出数据结构!

话说回来,其实只需要对每一行的前\(m-1\)个人维护一个数据结构,然后对最后一列的\(m\)个人也维护一个数据结构就好了。具体的话写平衡树就可以了。

那么对于一次\((x,y)\)的操作,其实就是先把最后一列的第\(y\)个元素丢到第\(x\)行里面,再查出第\(x\)行的第\(y\)个元素,把他丢到最后一列的最后一个。

现在的问题是:根本开不了\(O(nm)\)的空间啊!

所以就把编号连续的所有点合并成一个点,这样的话初始时就只有\(n+n=2n\)个点,然后每次查询时会把一个点至多\(split\)成\(3\)个,所以总空间复杂度就是\(O(n)\)级别的。

时间复杂度一个\(\log\)。

code

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 3e6+5;
int n,m,q,fa[N],ch[2][N],tot;
ll L[N],R[N],sz[N];
struct Splay{
int root;
int newnode(ll l,ll r)
{
++tot;
L[tot]=l;R[tot]=r;sz[tot]=r-l;
return tot;
}
void pushup(int x)
{
sz[x]=sz[ch[0][x]]+sz[ch[1][x]]+R[x]-L[x];
}
bool son(int x){return x==ch[1][fa[x]];}
void rotate(int x)
{
int y=fa[x],z=fa[y],c=son(x);
ch[c][y]=ch[c^1][x];if (ch[c][y]) fa[ch[c][y]]=y;
fa[x]=z;if (z) ch[son(y)][z]=x;
ch[c^1][x]=y;fa[y]=x;pushup(y);
}
void splay(int x)
{
for (int y=fa[x];y;rotate(x),y=fa[x])
if (fa[y]) son(x)^son(y)?rotate(x):rotate(y);
root=x;pushup(x);
}
int split(int x,ll k)
{
k+=L[x];int y=newnode(k,R[x]);R[x]=k;
if (!ch[1][x]) fa[ch[1][x]=y]=x;
else
{
x=ch[1][x];
while (ch[0][x]) x=ch[0][x];
fa[ch[0][x]=y]=x;
}
splay(y);return y;
}
ll popkth(ll k)
{
int x=root;
while (233)
{
if (k<=sz[ch[0][x]]) x=ch[0][x];
else
{
k-=sz[ch[0][x]];
if (k<=R[x]-L[x])
{
if (k<R[x]-L[x]) split(x,k);
if (k>1) x=split(x,k-1);
break;
}
else k-=R[x]-L[x],x=ch[1][x];
}
}
splay(x);
fa[ch[0][x]]=fa[ch[1][x]]=0;
if (!ch[0][x]) root=ch[1][x];
else
{
int y=ch[0][x];
while (ch[1][y]) y=ch[1][y];
splay(y);
root=fa[ch[1][y]=ch[1][x]]=y;
pushup(y);
}
return L[x];
}
void pushback(ll k)
{
int y=newnode(k,k+1);
if (!root) root=y;
else{
int x=root;
while (ch[1][x]) x=ch[1][x];
splay(x);
fa[ch[1][x]=y]=x;pushup(x);
}
}
}S[N];
int main()
{
n=gi();m=gi();q=gi();
for (int i=1;i<=n;++i) S[i].root=S[i].newnode(1ll*(i-1)*m+1,1ll*i*m);
for (int i=1;i<=n;++i) S[0].pushback(1ll*i*m);
while (q--)
{
int x=gi(),y=gi();ll ans;
S[x].pushback(S[0].popkth(x));
printf("%lld\n",ans=S[x].popkth(y));
S[0].pushback(ans);
}
return 0;
}

[Luogu3960][NOIP2017]列队的更多相关文章

  1. Luogu3960 NOIP2017列队(splay/线段树)

    令splay中的一个点表示一段区间,需要使用其中某个点时将区间分裂即可,剩下的都是splay的基本操作了.写的非常丑陋,注意细节.感觉考场上肯定只能靠部分分苟活了.想起来去年因为各种莫名其妙的原因50 ...

  2. [NOIP2017]列队 离线+SBT

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

  3. 题解[NOIP2017] 列队

    题解[NOIP2017] 列队 题面 解析 看到这题时感觉这个编号很难维护啊? 后来看了lzf大佬的题解才会.. 首先,考虑一个稍微暴力的做法, 维护每一行的前\(m-1\)个人和最后一列的\(n\) ...

  4. 【noip2017】【Luogu3960】列队 线段树

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

  5. NOIP2017列队(phalanx)解题报告

    列队作为NOIP2017最后一道题,其实并不难,只是相对于其它题目,有点小小的工业 首先,这道题我用splay维护的,如果你不会splay,又想学一下splay,可以来这里学一学,接下来步入正题 首先 ...

  6. NOIP2017 列队 题解报告【56行线段树】

    题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n \times mn×m名学生,方阵的行数 ...

  7. [NOIP2017]列队 (Splay)

    题目链接 NOIP2017真的是不按常理出牌: 1.数学题不在Day2T1 2.一道水题一道细节极多的模拟题一道不知道怎么形容的题(小凯的疑惑)(因为我太菜了) 3.3道大火题 当时看到列队这题是毫无 ...

  8. NOIP2017 列队

    https://www.luogu.org/problemnew/show/P3960 p<=500 50分 模拟 每个人的出队只会影响当前行和最后一列 p<=500,有用的行只有500行 ...

  9. [NOIP2017] 列队(平衡树)

    考虑转化题意: 设这次操作删掉点\((x, y)\) 对于每一次向左看齐:在第x行删除\((x, y)\),并将y以后的点全部前移一位 对于每一次向前看齐:x以后的点全部上移一位,并在最后一列插入\( ...

随机推荐

  1. hdu1695(容斥 or 莫比乌斯反演)

    刚开始看题,想了一会想到了一种容斥的做法.复杂度O( n(3/2) )但是因为题目上说有3000组测试数据,然后吓尿.完全不敢写. 然后想别的方法. 唉,最近精神有点问题,昨天从打完bc开始想到1点多 ...

  2. Java获取字符串的CRC8校验码(由C程序的代码修改为了Java代码)

    CRC8算法请百度,我也不懂,这里只是把自己运行成功的结构贴出来了.方法CRC8_Tab这里没有处理,因为我的程序中没有用到. package com.crc; public class CCRC8_ ...

  3. SpringMVC结合REST

    一.什么是REST REST即 Representational State Transfer,也就是(资源)表现层状态转化.资源是指网络上的一个实体或者说是网络上的一个具体信息. 每种资源对应一个特 ...

  4. Entity Framework 4.1 : 贪婪加载和延迟加载

    这篇文章将讨论查询结果的加载控制. EF4.1 允许控制对象之间的关系,当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有 ...

  5. 【JavaScript专题】--- 立即执行函数表达式

    一 什么是立即执行函数表达式 立即执行函数表达式,其实也可以叫初始化函数表达式,英文名:IIFE,immediately-inovked-function expression.立即执行函数表达式就是 ...

  6. [ACM] FZU 2087 统计数边 (有多少边至少存在一个最小生成树里面)

    Problem Description 在图论中,树:随意两个顶点间有且仅仅有一条路径的图. 生成树:包括了图中全部顶点的一种树. 最小生成树:对于连通的带权图(连通网)G,其生成树也是带权的. 生成 ...

  7. Java从零开始 第一天

    java是一门优秀的编程语言.java也有很多优点.从零开始.这是第一天,不是为什么,而是让自己学的更多. 1.下载JDK 在浏览器输http://www.oracle.com/index.html. ...

  8. 从HttpServletRequest获取POST数据的代码

    我们经常需要从HttpServletRequest对象获取POST请求的数据,下面给出简练的代码共大家参考 StringBuffer jb = new StringBuffer(); String l ...

  9. C# ADO.NET学习

    Connetction 对象: 数据库服务器 数据库名字 登录名.密码 连接数据库所需要的其他参数 Command对象: ExecuteScalar();//首行首列的内容 ExecuteNomQue ...

  10. zipfile.BadZipFile: File is not a zip file

    zipfile.BadZipFile: File is not a zip file 出现这个问题一般是文件损坏的可能性比较大