LUOGU P3960 列队 (noip2017 day2T3)】的更多相关文章

传送门 解题思路 记得当时考试我还是个孩子,啥也不会QAQ.现在回头写,用动态开点的线段树,在每行和最后一列开线段树,然后对于每次询问,把x行y列的删去,然后再把x行m列的元素加入x行这个线段树,然后再把删去元素加到最后一列里,用一个vector维护变化后的标号. 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #…
P3960 列队 题意 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有\(n \times m\)名学生,方阵的行数为\(n\),列数为\(m\). 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中的学生从\(1\)到\(n \times m\)编上了号码(参见后面的样例).即:初始时,第\(i\)行第\(j\)列的学生的编号是\((i-1) \times m + j\)…
传送门 因为\(Splay\)可以\(O(logn)\)维护区间,所以直接对每一行维护第一个元素到倒数第二个元素的\(Splay\),最后一列维护一个\(Splay\),每次把选出来的点删掉,然后把那一行对应的在最后一列\(Splay\)的点接在这一行后面,然后把选出来的点接在最后一列最后 注意这里要动态开点,即一个点代表一段区间,每次询问再拆开所以我大力分类讨论,写了好长好久qwq #include<bits/stdc++.h> #define LL long long #define il…
正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法,我目前是先只写个最傻逼的方法,等学了splay什么的再来upd一下QAQ(这题好像有,线段树.树状数组.splay等各种方法,我可能都会写只要我麻油咕QAQ 然后就直接进入正题QAQ 首先其实要知道动态开点线段树和线段树思想什么的都是一样儿的,只是实现方法有一点儿区别(就是动态开点线段树节省点儿空间…
题面 线段树入门题. 我们考虑线段树来维护这个矩阵. 首先我们先定n+1棵线段树前n棵维护每行前m-1个同学中没有离队过的同学,还有一棵维护第m列中没有离队过的同学.再定n+1棵线段树前n棵线段树维护每行因一个同学离队而从第m列插♂进来的同学,还有一棵维护到队尾的同学. 具体怎么维护?比如当前的询问是(x,y),先分两种情况: 1.不在第m列. 那么我们就先看看这个同学是不是插♂进来,是的话就在那后n+1棵线段树的第x棵里找,不然就在前n+1棵的第x棵里找. 然后在对应线段树的对应位置里删除离队…
[luogu P3960] [noip2017 d2t3] 队列 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n \times mn×m名学生,方阵的行数为 nn,列数为 mm. 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中 的学生从 1 到 n \times mn×m 编上了号码(参见后面的样例).即:初始时,第 ii 行第 jj 列 的学生的编号是(i-1)…
P3960 列队 题目描述 \(Sylvia\)是一个热爱学习的女♂孩子. 前段时间,\(Sylvia\)参加了学校的军训.众所周知,军训的时候需要站方阵. \(Sylvia\)所在的方阵中有\(n \times m\)名学生,方阵的行数为\(n\),列数为\(m\). 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中 的学生从\(1\)到\(n \times m\)编上了号码(参见后面的样例).即:初始时,第\(i\)行第\(j\)列 的学生的编号是\((i-1)\time…
题目描述 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 . 然而在练习…
洛谷题目传送门 最弱的Splay...... 暴力模拟30分(NOIP2017实际得分,因为那时连Splay都不会)...... 发现只是一个点从序列里搬到了另一个位置,其它点的相对位置都没变,可以想到维护每一行的前\(m-1\)列的平衡树,还有最后一列的平衡树.但是如果对所有点都开一个Splay,因为MLE的问题,只能获得60分...... 因为询问次数只有\(O(N)\)级别,可以发现操作完之后还有很多行的某一些区间是连续的区间.考虑每个点对应一段区间,当某操作使得一个连续区间被破坏掉的时候…
首先可以观察到这样一个事实,如果 \((x, y)\) 出队,那么只会影响 \(x\) 这一行,以及最后一列的排布.并且可以发现,每次一个人出队,总会对最后一列有影响,因此我们可能需要将最后一列单独拿出来维护.让我们来想一想,什么东西可以支持删除一个数,插入一个数,查询排名为第几的数,显然 \(Splay\) 可以完成这样一个事情.于是一个想法呼之欲出,对于每一行以及最后一列我们开一颗 \(Splay\),每次取出第 \(x\) 行第 \(y\) 个元素插入到最后一列最后(赋一个大权值),将最后…
https://www.luogu.org/problemnew/show/P3960 树状数组预处理之后直接搞就可以了,也不是很好解释,反正就是一个模拟过程的暴力用树状数组维护,还挺巧妙的. 我为什么考场上想不出来嘤嘤嘤 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<vector>…
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 #def…
noip2017 D2T3 列队 某zz选手当时直接放弃了写了50还写错了 题目大意: 有一个n行m列的方阵,第i行j列的点编号为(i-1)m+j 每次把第x行y列的点拿出来,然后把这一行它之后的点都向左推,把最后一列x行之后的点都向上推 然后把拿出来的点放到最后一个位置,询问这个点的编号 思路: 因为n+q并不大 可以动态开点每行维护一个权值线段树 并对最后一行单独维护 对于新进来的点使用vector维护 #include<iostream> #include<cstdio> #…
这是NOIP 2017最后一道题 不知道这道题有没有人代码写的和我一样麻烦. Solution 30分暴力 维护每行每列的元素. 每次删除一个元素的时候, 需要修改一行一列 因此复杂度上界\(O(nmq)\). 50分链表 因为查询操作比较少 然后又需要支持快速删除一个数的操作. 显然可以用链表来处理. 具体一点就似乎 70分线段树 这20分的部分分来自于队伍只有一行的情况. 这个做法是比较重要的吧! 应该是100分做法的基础. 用线段树维护队列前m-1个位置. 这个位置有人记为1, 没人记为0…
题意 题目链接 Sol 看不懂splay..,看不懂树状数组... 只会暴力动态开节点线段树 观察之后不难发现,我们对于行和列需要支持的操作都是相同的:找到第\(k\)大的元素并删除,在末尾插入一个元素 这样我们可以维护\(n+1\)棵线段树(对列单独建一棵) 每次操作的时候,如果\(y_i = m\),那么只对列所在的线段树进行操作 否则,首先在第\(x_i\)棵线段树中找到第\(y_i\)大的元素并删除,在列所在的线段树中找到需要插入的元素并记录下来. 然后再删除列中对应的元素 当然,还有许…
传送门 感觉自己好久不打数据结构已经完全不会了orz…… 据说正解树状数组?然而并不会 首先考虑一下每一次操作,就是把一个人从这一行中取出并放到行的最后,再从最后一列取出放到列的最后 那么这两种操作其实可以看做同一个类型,都是把某一个数取出并放到最后 那么这个可以用splay来搞,用splay维护区间,然后每一次找第k个相当于找第k大,然后删除之后在末尾插入 然后如果直接开空间怕是要炸……那只能缩点,等做到这个点的时候再把它split出来…… 然后……看代码好了…… //minamoto #in…
用动态开点线段树分别维护每一行和最后一列,线段树的作用是记录被选的点的个数以及查询第k个没被选的点,每次修改,从行里标记被选的点,从最后一列标记向左看齐之后少的点,然后用vector维护行列的新增点 #include<iostream> #include<cstdio> #include<vector> using namespace std; const int N=600005; int n,m,q,mx,tot,rt[N]; vector<long long…
其实思路并不算太难,就是代码量相对较大. 我们将一次离队转换为一次删除和两次加入,这样就可以保证空间是动态分配的,最大也不会暴空间. 说实话写之前感觉会很恶心,但是代码量就还好吧,有些细节需要特殊注意一下. Code: #include<cstdio> using namespace std; const int maxn = 2000000 + 5; long long val[maxn], arr[maxn]; int f[maxn], ch[maxn][2], root[maxn], s…
P3960 列队 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵的行数为 n,列数为 m. 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中 的学生从 1 到 n×m 编上了号码(参见后面的样例).即:初始时,第 i 行第 j 列 的学生的编号是(i−1)×m+j. 然而在练习方阵的时候,经常会有学生因为各种各样的事情需要离队.在一天 中,一共发生了 …
Day 1 3月有31天废话 今天先颓过了就只剩30天了 初步计划 每天一道字符串/数据结构题 图论学习 根据<若干图论模型探讨>(lyd)复习 二分图与网络流学习 <算法竞赛进阶指南>剩余std 虚树学习 动态规划学习 DP优化学习 特殊DP学习(排名不分先后):插头DP.计数DP.数位DP.概率期望DP.基环树DP.动态DP Day 2 吐槽一句今天的数据结构题P2824 [HEOI2016/TJOI2016]排序-- 数据是真水,纯暴力拿80 然后就不想想正解了......…
Description 方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题. Oj上注册了n个用户,编号为1-”,一开始他们按照编号排名.方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为1 x y,意味着将编号为z的用户编号改为V,而排名不变,执行完该操作后需要输出该用户在队列中的位置,数据保证x必然出现在队列中,同时1,是一个当前不在排名中的编号. 2.操作格式为2 x,意味着将编号为x的用户的排名提升到第一位,执行完该操作后需要输出执行该操作前编号为z用户…
做了几天远古老题,发现不可做,于是咕掉..转而从2005开始.. 1997: P1549 棋盘问题(2):搜索,优化搜索顺序,对于第一行第一列先搜小的(但是其实这样是错的,仅仅能过原题) 加强版咕. 1998: P1011 车站:类似斐波那契,推式子即可. P1012 拼数:sort cmp:a+b>b+a P1013 进制位:观察性质发现,一定是n-1进制. 原因:若进制 <n-1 会出现重复字母,若进制 >n-1 则不会进位导致出现更大的数. 判断一个数字是什么: 其实就是这样 19…
原文链接https://www.cnblogs.com/zhouzhendong/p/9265380.html 题目传送门 - 洛谷P3960 题目传送门 - LOJ#2319 题目传送门 - Vijos P2033 题意 懒了,不概括了. 题解 一开始写了树状数组. 算法非常真,写完全部 WA,但是漏了一步,我快写吐了,于是弃疗之后从某度*了一份代码. 我来说说线段树的做法: 线段树动态开点,每行一个线段树,最后一列一个线段树. 线段树要支持找区间第 $k$ 大,这样方便找出指定位置. 注意一…
题解 是我从来没有做过的裂点splay... 看的时候还是很懵逼的QAQ. 把最后一列的$n$个数放在一个平衡树中, 有 $n$ 个点 剩下的$n$行数, 每行都开一个平衡树,开始时每棵树中仅有$1$个点, 记录了开始时的区间左端点 $1$ 和右端点$m - 1$. 这样每次出队都最多只会影响两棵平衡树, 其中一颗为表示最后一列的平衡树. 然后就可以分成两种情况进行处理 1. $y = m$ 即出队的人位于最后一列,那么仅会影响最后一列的那颗平衡树, 删除位于第$x$个位置的点, 再插入到最后即…
数据结构题还是挺好玩的 注意到每次只变动三个点:(x,y),(x,m),(n,m),其他地方都是整块移动. 可以开n+1个线段树,前n个存每行前m-1个人,最后一个存第m列的人. (x,y)位置的人出列时,抽出该位置的标号,加到第n+1个线段树的最后面去,抽出第n+1个线段树的第x个元素(即(x,m),加到第x个线段树的最后面去. ↑实现这一操作,可以记线段树的size,每次二分查询树上第k个元素即可确定位置. ↑当然树不可能全建出来,需要动态开点.尚未申请的结点,size直接用$ r-l+1…
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…
[luogu P3953] [noip2017 d1t3] 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N$号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策策每天都会去逛公园,他总是从1号点进去,从$N$号点出来. 策策喜欢新鲜的事物,它不希望有两天逛公园的路线完全一样,同时策策还是一个 特别热爱学习的好孩子,它不希望每天在逛公园这件事上花费太多的时间.如果1号点 到$N$…
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m 名学生,方阵的行数为 n ,列数为 m . 为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中的学生从 1 到 n×m 编上了号码(参见后面的样例).即:初始时,第 i 行第 j 列 的学生的编号是 (i−1)×m+j . 然而在练习方阵的时候,经常会有学生因为各种各样的事情需要离…
列队作为NOIP2017最后一道题,其实并不难,只是相对于其它题目,有点小小的工业 首先,这道题我用splay维护的,如果你不会splay,又想学一下splay,可以来这里学一学,接下来步入正题 首先这道题和往年一样,特殊数据会给你极大的启发,在考试时,看到x=1,只有一行的数据时,我就想到,可以维护一颗平衡数,每次只查询(x,y)由于x=1,所以只要查询队列中第y大即可,那么你再想一想,对于每一行和最后一列维护都分别维护一颗splay即可 但是这样空间并不允许n*m个点,我们发现,大部分点自始…
[Luogu 3952] NOIP2017 时间复杂度 一年的时间说长不长,说短,也不短. 一年之内无数次觉得难得可怕的题目,原来也就模拟这么回事儿. #include <cstdio> #include <iostream> #include <set> #include <stack> #include <string> int T; struct Layer { std::string name; int state; Layer(std:…