题目描述 给出一个 $n\times m$ 的矩阵,第 $i$ 行第 $j$ 列的数为 $(i-1)\times m+j$ . 现在有 $q$ 次操作,每次操作给出位置 $(x,y)$ ,取出 $(x,y)$ 位置的数,然后令 $(x,y+1)\sim (x,m)$ 的所有数向左(列减小)平移一格,再令 $(x+1,m)\sim (n,m)$ 的所有数向上(行减小)平移一格,最后将取出的数放到位置 $(n,m)$ . 求每次取出的数是多少. 题解 Splay 考场上觉得正解一定不是Splay(以…
题解 是我从来没有做过的裂点splay... 看的时候还是很懵逼的QAQ. 把最后一列的$n$个数放在一个平衡树中, 有 $n$ 个点 剩下的$n$行数, 每行都开一个平衡树,开始时每棵树中仅有$1$个点, 记录了开始时的区间左端点 $1$ 和右端点$m - 1$. 这样每次出队都最多只会影响两棵平衡树, 其中一颗为表示最后一列的平衡树. 然后就可以分成两种情况进行处理 1. $y = m$ 即出队的人位于最后一列,那么仅会影响最后一列的那颗平衡树, 删除位于第$x$个位置的点, 再插入到最后即…
[NOIP2017]列队 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 n,列数为 m. 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中 的学生从 1 到 n×m 编上了号码(参见后面的样例).即:初始时,第 i 行第 j 列 的学生的编号是(i−1)×m+j. 然而在练习方阵的时候,经常会有学生因为各种各样的事情需要离队.在一天 中,一…
题解[NOIP2017] 列队 题面 解析 看到这题时感觉这个编号很难维护啊? 后来看了lzf大佬的题解才会.. 首先,考虑一个稍微暴力的做法, 维护每一行的前\(m-1\)个人和最后一列的\(n\)个人的编号, 也就是用\(n+1\)个区间分开维护 设当前询问\((x,y)\), 那么就在第\(x\)行中把它删掉, 再把最后一列的对应第\(x\)行的人加入第\(x\)行中, 最后将询问的人加入最后一列. (当然如果询问的人在最后一列要特判) 但显然这样时间和空间都会炸... 于是考虑优化, 首…
题目链接 NOIP2017真的是不按常理出牌: 1.数学题不在Day2T1 2.一道水题一道细节极多的模拟题一道不知道怎么形容的题(小凯的疑惑)(因为我太菜了) 3.3道大火题 当时看到列队这题是毫无头绪的,因为数据大得让你存都存不下,于是果断打了个30分暴力(如果打个离散化还能多骗20分). 蓦然回首,豁然开朗. 思考可知,一个人出列影响的只是当前一行和最后一列,于是,我们只需要对每一行和最后一列分别用数据结构维护,这个数据结构要支持 1.查询并删除第\(k\)个数. 2.在末尾插入一个数.…
当年太菜了啊,连$60$分的暴力都没拿满,只打了一个$30$分的. 考虑到这题最多只会询问到$30W$个点,且整个矩阵会去到$30W\times 30W$,显然不能将所有的点存下来. 对于每一行(除最右侧的数)我们维护一个$splay$,存储该位置的值,考虑到矩阵很大肯定不能全部开下,我们用一个节点存储一个区间(详情见代码) 这样会发现最右侧一列被吃了,所以我们还要维护一个$splay$去存储这一列的数. 对于一组询问$(x,y)$,当$y=m$时,那么显然直接在最右侧的$slpay$上删去某个…
考虑n=1的做法,就是支持: 1.在线删一个数 2.在结尾加一个数 3.查询序列的第y个数 用线段树记录区间内被删元素的个数,可以通过线段树上二分快速得解,对于新增的数,用vector记录即可. 对于满分同样如此,对每行开一个线段树,再对最后一列单独开一个. 对于每次操作: 若在最后一列:就是对最后一列直接使用n=1的做法. 若不在:对第x列的前m-1个用n=1的做法,再将最后一列的第x个加入第x列的末尾,然后再对最后一列使用n=1的做法. #include<cstdio> #include&…
令splay中的一个点表示一段区间,需要使用其中某个点时将区间分裂即可,剩下的都是splay的基本操作了.写的非常丑陋,注意细节.感觉考场上肯定只能靠部分分苟活了.想起来去年因为各种莫名其妙的原因50->0 考虑一维时的线段树做法.维护区间内有多少人,每次找到第x个人把他拿出来放到最后就行了.扩展到二维动态开点即可.不写了 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib…
列队作为NOIP2017最后一道题,其实并不难,只是相对于其它题目,有点小小的工业 首先,这道题我用splay维护的,如果你不会splay,又想学一下splay,可以来这里学一学,接下来步入正题 首先这道题和往年一样,特殊数据会给你极大的启发,在考试时,看到x=1,只有一行的数据时,我就想到,可以维护一颗平衡数,每次只查询(x,y)由于x=1,所以只要查询队列中第y大即可,那么你再想一想,对于每一行和最后一列维护都分别维护一颗splay即可 但是这样空间并不允许n*m个点,我们发现,大部分点自始…
题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n \times mn×m名学生,方阵的行数为 nn,列数为 mm. 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中 的学生从 1 到 n \times mn×m 编上了号码(参见后面的样例).即:初始时,第 ii 行第 jj 列 的学生的编号是(i-1)\times m + j(i−1)×m+j. 然而在练习方阵的时候…