[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> ...
随机推荐
- 在win7中解决Visual C++ 6.0打开文件时出现停止工作问题
在使用Visual C++ 6.0打开文件时可能会出现下面的情况 这可能是Vc6.0和win7兼容性问题. 方法: 下载filetool即可 链接:https://pan.baidu.com/s/1X ...
- 不吹不黑,赞一下应用运维管理的cassacdra
不吹不黑的为菊厂的应用运维管理AOM点个赞.Why? 某菊厂应用运维管理工具AOM每天处理着亿级条数据,这么多数据是怎么存储的呢? 说到数据存储就会想到关系型数据库,比如mysql,oracle,sy ...
- extra bytes at beginning or within zipfile
主要用文本文档打开看看是否带有#!/bin/bash 修改pom文件<executable>false</executable>
- Path.Combine(
// 获取程序的基目录. var dir1 = System.AppDomain.CurrentDomain.BaseDirectory; // 获取模块的完整路径. var dir2 = Syste ...
- ASP.NET Core 2.0 中读取 Request.Body 的正确姿势
原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...
- 远程连接windows2003桌面无法使用剪切板的有效解决方法
远程桌面控制服务器时,无法剪切.粘贴一些东西,上网搜了一下,原来是rdpclip.exe(remote desktop clipboard)不起作用了.此程序负责管理本地机与远程服务器之间共享剪切板, ...
- vue.js devtools图标不亮
第一步:打开谷歌扩展程序 第二步:设置允许访问文件地址
- web应用原理之——会话
会话是大家开发Java EE Web应用的常用技术,那么会话是什么,会话的用途还有工作原理又是什么,下面就简单说一说. 什么是会话,在web应用中,作为客户端的浏览器,通过请求/响应这种模式访问同一个 ...
- Hive正则表达式
正则表达式基本语法 用圆括号将所有选择项括起来,相邻的选择项之间用|分隔.但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用. 其中 ?: 是非捕获元之一,还 ...
- [USACO14OPEN]GPS的决斗Dueling GPS's
题目概况 题目描述 给你一个\(N\)个点的有向图,可能有重边. 有两个\(GPS\)定位系统,分别认为经过边\(i\)的时间为\(P_i\),和\(Q_i\). 每走一条边的时候,如果一个系统认为走 ...