[Luogu] 列队
https://www.luogu.org/problemnew/show/P3960
如果 x = 1,相当于维护一条链,每次取出第 k 个数放在序列末尾
假设有 n + m + q 个位置,每个位置有数为 1 ,没有数为 0,
取出后不前移,那么第 k 个数就是第 k 个 1 的位置
初始时 1 ~ n + m - 1 为 1,其他位置为 0,
用线段树维护区间和即可
类似对于这道题把每行看做一条链,最后一列看做一条链
一次操作可以看成对两条链的操作
套用上面的方法即可
注意要动态开点
#include <bits/stdc++.h> using namespace std;
const int N = 3e5 + ; int n, m, Q, N_;
int size[N * ], lson[N * ], rson[N * ];
int root[N], jdjs;
int ins[N];
int now_root; #define LL long long LL val[N * ];
LL Ans1; #define gc getchar() inline int read() {
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} int Calc_size(int l, int r) {
if(now_root != n + ) {
if(r <= m - ) return r - l + ;
else {
if(l <= m - ) return (m - ) - l + ;
else return ;
}
} else {
if(r <= n) return r - l + ;
else {
if(l <= n) return n - l + ;
else return ;
}
} } void Sec_A(int l, int r, int & jd, int x) {
if(!jd) {
jd = ++ jdjs;
size[jd] = Calc_size(l, r);
if(l == r) {
if(now_root <= n) val[jd] = (LL) 1ll * (now_root - ) * m + l;
else val[jd] = (LL) 1ll * l * m;
}
}
size[jd] --;
if(l == r) {Ans1 = val[jd]; return ;}
int mid = (l + r) >> ;
if((!lson[jd] && x <= mid - l + ) || x <= size[lson[jd]]) Sec_A(l, mid, lson[jd], x);
else {
if(!lson[jd]) x -= (mid - l + );
else x -= size[lson[jd]];
Sec_A(mid + , r, rson[jd], x);
}
} void Ins(int l, int r, int & jd, int whe, LL Num) {
if(!jd) {
jd = ++ jdjs;
size[jd] = Calc_size(l, r);
if(l == r) val[jd] = Num;
}
size[jd] ++;
if(l == r) return ;
int mid = (l + r) >> ;
if(whe <= mid) Ins(l, mid, lson[jd], whe, Num);
else Ins(mid + , r, rson[jd], whe, Num);
} int main() {
n = read(), m = read(), Q = read();
N_ = max(n, m) + Q;
while(Q --) {
int x = read(), y = read();
if(y == m) now_root = n + , Sec_A(, N_, root[now_root],x);
else now_root = x, Sec_A(, N_, root[now_root], y);
cout << Ans1 << endl;
now_root = n + ; Ins(, N_, root[n + ], n + (++ ins[n + ]), Ans1);
if(y != m) {
now_root = n + ; Sec_A(, N_, root[now_root], x);
now_root = x; Ins(, N_, root[x], m - + (++ ins[x]), Ans1);
}
}
return ;
}
[Luogu] 列队的更多相关文章
- [LUOGU] [NOIP2017] P3960 列队
题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n \times mn×m 名学生,方阵的行 ...
- luogu 3960 列队
noip2017 D2T3 列队 某zz选手当时直接放弃了写了50还写错了 题目大意: 有一个n行m列的方阵,第i行j列的点编号为(i-1)m+j 每次把第x行y列的点拿出来,然后把这一行它之后的点都 ...
- Luogu P3960 列队(动态开点线段树)
P3960 列队 题意 题目描述 Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有\(n \times m ...
- luogu P3960 列队
传送门 因为\(Splay\)可以\(O(logn)\)维护区间,所以直接对每一行维护第一个元素到倒数第二个元素的\(Splay\),最后一列维护一个\(Splay\),每次把选出来的点删掉,然后把那 ...
- Luogu 3960 [NOIP2017] 列队 - splay|线段树
题解 是我从来没有做过的裂点splay... 看的时候还是很懵逼的QAQ. 把最后一列的$n$个数放在一个平衡树中, 有 $n$ 个点 剩下的$n$行数, 每行都开一个平衡树,开始时每棵树中仅有$1$ ...
- Luogu P3960 列队 线段树
题面 线段树入门题. 我们考虑线段树来维护这个矩阵. 首先我们先定n+1棵线段树前n棵维护每行前m-1个同学中没有离队过的同学,还有一棵维护第m列中没有离队过的同学.再定n+1棵线段树前n棵线段树维护 ...
- LUOGU P3960 列队 (noip2017 day2T3)
传送门 解题思路 记得当时考试我还是个孩子,啥也不会QAQ.现在回头写,用动态开点的线段树,在每行和最后一列开线段树,然后对于每次询问,把x行y列的删去,然后再把x行m列的元素加入x行这个线段树,然后 ...
- [luogu P3960] [noip2017 d2t3] 队列
[luogu P3960] [noip2017 d2t3] 队列 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Syl ...
- Luogu 魔法学院杯-第二弹(萌新的第一法blog)
虽然有点久远 还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题 沉迷游戏,伤感情 #include <queue> ...
随机推荐
- php分页思路
<?php class page{ public $nowPage=1; public $perPage=10; public $showPage=10; public $totalPage; ...
- python — 协程
1. 协程 1.1 协程基础 1.协程 :能够在一个线程下的多个任务之间来回切换,那么每一个任务都是一个协程. 2.协程的优点: 1.一个线程中的阻塞都被其他的各种任务沾满了 2.让操作系统觉得这个线 ...
- golang之工厂模式
说明: golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题 如果包里面的结构体变量首字母小写,引入后,不能直接使用,可以工厂模式解决: ch1.go package ch1 type ...
- tesseract ocr .Net demo
环境vs 2019 .Net 4.8 新建一个wpf工程,拖放上一个button一个textbox nuget下载tesseract,版本信息如图所示 MainWindow.xaml.cs文件代码如下 ...
- Springboot使用外置tomcat的同时使用websocket通信遇到的坑
随意门:https://blog.csdn.net/qq_43323720/article/details/99660430 另外,使用了nginx的话,需要注意开放websocket支持 serve ...
- js文字跑马灯
实现文字跑马灯效果,主要控制scrollLeft. 效果图如下 代码如下 <html> <head> <script type="text/javascript ...
- 待解决问题 jscore 与 node.js jsbridge
jscore 与 node.js jsbridge https://juejin.im/post/5b395eb96fb9a00e556123ef
- luogu1005矩阵取数游戏题解--区间DP
题目链接 https://www.luogu.org/problemnew/show/P1005 分析 忽然发现这篇题解好像并没有什么意义...因为跟奶牛零食那道题一模一样,博主比较懒如果您想看题解的 ...
- 无法删除登录名 '***',因为该用户当前正处于登录状态。 (Microsoft SQL Server,错误: 15434)
问题描述: 当删除数据库用户时,有时会得到这样的提示: 无法删除登录名 '***',因为该用户当前正处于登录状态. (Microsoft SQL Server,错误: 15434) 解决办法: 1.首 ...
- C# list to dictionary
示例: 新建一个类: public class Lang { public string En; public string Ch; } 实例化并转为字典: List<Lang> lang ...