【NOIP2017提高组正式赛】列队
题解
本题的解法是丰富多彩的!
线段树做法是极好的
代码非常之少
一个很显然的想法是维护 \(n+1\) 颗线段树
那要怎么维护才能不爆空间呢?
我们发现尽管 \(n \times m\) 那么大
但 \(q\) 相比 \(n \times m\) 小得多
也就是说变动的点比较少
于是我们抓住这点
考虑只记录变动的点
行的线段树维护 \([1,m-1]\) 位置的信息
列的线段树维护 \([1,n]\) 的位置的信息
那我一颗线段树就记录那些点不在原来位置了
也就是说一颗线段树长为 \(\max(n,m)+q\) (为什么?待会再解释)
每一位只为 \(0\) 或 \(1\) 表示 没变或变了
\(1\) 表示变了是因为没变的太多无法记录,那就记变的吧
这样线段树动态开点空间就可以接受了
然后变动的点我们考虑它后来的位置
依题知它会到最后一列的末端,然后最后一列它所在的行的点会到它所在行的线段是的末端
我们无法向平衡树一样动态移动(插入,删除)点,但题目只需插入到末端
所以我们预留空间把插入的点放到末端,然后它原来位置标记为 \(1\),表示此处无点
对于查询,我们知道为第 \(x(x<=n)\) 颗线段树的 \(y\) 位置的点的编号为 \((x-1) \times m+y\)
但他不一定在原队列 \(y\) 位置
因为前面有些点为 \(1\) 空置,一个区间长度减去区间 \(1\) 的个数才是区间有的数
所以我们只要查询排名为 \(y\) 的位置的编号,记为 \(z\)
那么在询问中,当 \(z<m\) 时,它的编号为 \((x-1) \times m+z\)
当 \(z >= m\) 时说明前面有空位,有点移动到后面了
我们用 \(n+1\) 个 \(vector\) 储存每个线段树依次移动到后面的点,输出 \(S[x][z-m]\) 即可
列同理
\(Code\)
#include<cstdio>
#include<vector>
#include<iostream>
#define LL long long
using namespace std;
const int N = 3e5 + 5, M = 6e6 + 5;
int n, m, q, sum[M], ls[M], rs[M], rt[N], Len, size;
vector<LL> S[N];
void update(int &p, int l, int r, int x)
{
if (!p) p = ++size;
++sum[p];
if (l == r) return;
int mid = (l + r) >> 1;
if (x <= mid) update(ls[p], l, mid, x);
else update(rs[p], mid + 1, r, x);
}
int query(int p, int l, int r, int k)
{
if (l == r) return l;
int mid = (l + r) >> 1, s = mid - l + 1 - sum[ls[p]];
if (k <= s) return query(ls[p], l, mid, k);
return query(rs[p], mid + 1, r, k - s);
}
inline LL move_forward(int x)
{
int p = query(rt[n + 1], 1, Len, x);
update(rt[n + 1], 1, Len, p);
return (p <= n ? (1LL * p * m) : (S[n + 1][p - n - 1]));
}
inline LL move_left(int x, int y)
{
int p = query(rt[x], 1, Len, y);
update(rt[x], 1, Len, p);
return (p < m ? (1LL * (x - 1) * m + p) : (S[x][p - m]));
}
int main()
{
freopen("phalanx.in", "r", stdin);
freopen("phalanx.out", "w", stdout);
scanf("%d%d%d", &n, &m, &q);
Len = max(n, m) + q;
for(int x, y; q; --q)
{
scanf("%d%d", &x, &y);
LL z;
if (y == m) z = move_forward(x), printf("%lld\n", z), S[n + 1].push_back(z);
else z = move_left(x, y), printf("%lld\n", z), S[n + 1].push_back(z),
z = move_forward(x), S[x].push_back(z);
}
}
【NOIP2017提高组正式赛】列队的更多相关文章
- [jzoj]5478.【NOIP2017提高组正式赛】列队
Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校 ...
- 【NOIP2017 提高组正式赛】列队 题解
题目大意 有一个 \(n\times m\) 的方阵,每次有 \((x,y)\) 离开,离开后有两个命令 向左看齐.这时第一列保持不动,所有学生向左填补空缺.这条指令之后,空位在第 \(x\) 行第 ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
- NOIP2017提高组 模拟赛13(总结)
NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...
- NOIP2017提高组模拟赛 10 (总结)
NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...
- NOIP2017提高组模拟赛 8(总结)
NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...
- NOIP2017提高组模拟赛 9 (总结)
NOIP2017提高组模拟赛 9 (总结) 第一题 星星 天空中有N(1≤N≤400)颗星,每颗星有一个唯一的坐标(x,y),(1≤x,y ≤N).请计算可以覆盖至少K(1≤K≤N)颗星的矩形的最小面 ...
- NOIP2017提高组模拟赛 7(总结)
NOIP2017提高组模拟赛 7(总结) 第一题 斯诺克 考虑这样一个斯诺克球台,它只有四个袋口,分别在四个角上(如下图所示).我们把所有桌子边界上的整数点作为击球点(除了4个袋口),在每个击球点我们 ...
- NOIP2017提高组模拟赛5 (总结)
NOIP2017提高组模拟赛5 (总结) 第一题 最远 奶牛们想建立一个新的城市.它们想建立一条长度为N (1 <= N <= 1,000,000)的 主线大街,然后建立K条 (2 < ...
- NOIP2017提高组模拟赛4 (总结)
NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...
随机推荐
- JavaScript合集(流程控制语句)
流程控制 条件判断语句 条件分支语句 循环语句 条件判断语句 if语句 语法: if(条件表达式){ 语句 } ------- if(a > 10){ alert('a比10大') } if-e ...
- Spring Boot回顾
一.概述 1.Spring的优缺点 优点 无需开发ELB,通过IOC和AOP,就可以使用POJO(简单的Java对象)实现ELB的功能 缺点: 依赖管理导入Maven耗时耗力 注解繁琐 2.Sprin ...
- SQLMap入门——获取当前网站数据库的名称
列出当前网站使用的数据库 python sqlmap.py -u http://localhost/sqli-labs-master/Less-1/?id=1 --current-db
- 微服务项目Git仓库自动化脚本
说明 基于微服务项目,产生的的多项目仓库管理脚本. 目录结构 xxxx Xxx1Api/ Xxx2Api/ git_clone_api.sh git_branch_dev.sh git_pull_al ...
- week_9(推荐系统)
Andrew Ng 机器学习笔记 ---By Orangestar Week_9(推荐系统) 1. Problem Formulation 这节就仅仅简单地介绍了一下 推荐系统的应用和实例.完全可以略 ...
- 如何使用 EF Core 7 批量删除数据
在 EF Core 7 中,我们可以使用批量操作来删除多条数据.这种方式与之前的版本有所不同,本文将对比 EFCore 7 和之前版本批量删除数据的不同方式. 删除给定 ID 的数据 在 EF Cor ...
- 基于容器的PaaS混合云的几种形式
概述 这是 Gartner 的一个图,提供了全球的基于容器的 PaaS 公有云.混合云服务的梳理展示: 这里提供一个其他的视角: 中国市场,基于容器的 PaaS 混合云(公有云 + 私有云)的相关厂商 ...
- JavaScript:七大基础数据类型:数值number及其表示范围
数值number类型,用来表示任何类型的数字:整数或者浮点数都可以: 实际上,JS中的数值,是一个64位的浮点数,这与Java中的double类型的浮点数是一致的: 但是它有表示的范围,在范围内,JS ...
- 笑死,面试官又问我SpringBoot自动配置原理
面试官:好久没见,甚是想念.今天来聊聊SpringBoot的自动配置吧? 候选者:嗯,SpringBoot的自动配置我觉得是SpringBoot很重要的"特性"了.众所周知,Spr ...
- 巧用视觉障眼法,还原 3D 文字特效
最近群里有这样一个有意思的问题,大家在讨论,使用 CSS 3D 能否实现如下所示的效果: 这里的核心难点在于,如何利用 CSS 实现一个立体的数字?CSS 能做到吗? 不是特别好实现,但是,如果仅仅只 ...