[NOIP2017]列队 离线+SBT】的更多相关文章

[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最后一道题,其实并不难,只是相对于其它题目,有点小小的工业 首先,这道题我用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. 然而在练习方阵的时候…
题目链接 NOIP2017真的是不按常理出牌: 1.数学题不在Day2T1 2.一道水题一道细节极多的模拟题一道不知道怎么形容的题(小凯的疑惑)(因为我太菜了) 3.3道大火题 当时看到列队这题是毫无头绪的,因为数据大得让你存都存不下,于是果断打了个30分暴力(如果打个离散化还能多骗20分). 蓦然回首,豁然开朗. 思考可知,一个人出列影响的只是当前一行和最后一列,于是,我们只需要对每一行和最后一列分别用数据结构维护,这个数据结构要支持 1.查询并删除第\(k\)个数. 2.在末尾插入一个数.…
https://www.luogu.org/problemnew/show/P3960 p<=500 50分 模拟 每个人的出队只会影响当前行和最后一列 p<=500,有用的行只有500行 所以只维护这p行和最后一列的信息 然后模拟 时间复杂度:O(p*(n+m)) 空间复杂度:O(p*m+n) #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #defi…
题解: 考场实际得分:45 重新看了一下,发现至少80分是很好拿的 对于前30% 暴力 另20% 显然离线搞一下就可以了(大概当初连离线是啥都不知道) 另另30%其实只要维护第一行和最后一列就可以了,显然可以用splay来完成加点删点 满分做法: 1 .splay(是看了题解才知道了) 类似线段树的动态开点,splay也可以先把一个节点作为一段序列的维护,当使用时再裂点 2.动态开点线段树 #upd:8.8写了一下 写了30min,debug了30min左右 思路挺简单的,动态开点线段树维护,对…
定义第i行为所有的点(i,j),0<j<m 可以发现,每一行是相对独立的,每一次操作只会影响到当前行和最后一列 考虑每一行和最后一列各开一个树状数组,但这样显然会爆空间 实际上,对于没有离队过的点是没必要储存的,可以直接算出编号, 因此只要用vector储存每一行和最后一列后加入的点即可 还需要预处理一个数组d[i]表示第i次询问当前行的离队的点的纵坐标 这个可以离线做出来,然后只需要对最后一列维护一个树状数组即可 Code #include <cstdio> #include &…
题目链接 题意不说了,一辈子也忘不掉 解法1.平衡树 这题就是平衡树裸题,每一行开一棵维护前 \(m-1\) 个,最后一列单独维护,因为很多人没有用到,所以平衡树每个节点是一个区间(pair),分裂时顺便把区间裂开来.这也是最暴力的解法 这里以Fhq_Treap为例(其实是我不熟练Splay) //Fhq_Treap //http://uoj.ac/submission/296955 #include<stdio.h> #include<cctype> #include<cs…
考虑转化题意: 设这次操作删掉点\((x, y)\) 对于每一次向左看齐:在第x行删除\((x, y)\),并将y以后的点全部前移一位 对于每一次向前看齐:x以后的点全部上移一位,并在最后一列插入\((x, y)\) 这些操作都可以用\(Splay\)解决: 我们开\(N+1\)棵\(Splay\),1到N棵表示的是第i行,[1,m-1]的位置,第\(N+1\)棵表示最后一列的位置 这样我们可以把所有的点都扔进一棵\(Splay\)里面 题意有一次转化成: 设这次操作删掉点\((x, y)\)…