【NOIP2017 提高组正式赛】列队 题解
题目大意
有一个 \(n\times m\) 的方阵,每次有 \((x,y)\) 离开,离开后有两个命令
- 向左看齐。这时第一列保持不动,所有学生向左填补空缺。这条指令之后,空位在第 \(x\) 行第 \(m\) 列。
- 向前看齐。这时第一行保持不动,所有学生向前填补空缺。这条指令之后,空位在第 \(n\) 行第 \(m\) 列。
最后 \((x,y)\) 回到 \((n,m)\)
现在问每次离队的人的编号。 \((i,j)\) 的编号是 \((i-1)*m+j\)
题解
对每一行前 \(m-1\) 个建 \(n\) 个权值线段树,对第 \(m\) 列单独建。
线段树记录区间离开的个数

因为把一个点加入线段树十分麻烦,考虑用 \(n+1\) 个 \(vector\) 来保存加入的数
接着分类讨论
\(y==m\),就是只有向前看齐。直接在第 \(n+1\) 颗线段树中 \(x\) 的实际位置 \(pos\)
若 \(pos<=n\) 则没有删除,答案为 \(pos*m\) ,否则在 \(vector\) 中
\(y<m\) ,先向左看齐。在第 \(x\) 颗线段树中查询 \(y\) 的实际位置 \(pos\)
若 \(y<m\) 则没有删除,否则在 \(vector\) 中。得到答案再向前看齐
向前看齐加入 \(vector\) 的编号为这里得到的编号
每次得到答案就把它加入对应的 \(vector\) 中。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int n,m,T,pos,maxx,tot,sm[6000000],rt[6000000],ls[6000000],rs[6000000];
vector<LL>del[300005];
int Kth(int k,int l,int r,int rt) {
if(l==r)return l;
register int mid=l+r>>1,tmp=mid-l+1-sm[ls[rt]];
return k<=tmp?Kth(k,l,mid,ls[rt]):Kth(k-tmp,mid+1,r,rs[rt]);
}
void Modify(int p,int l,int r,int &rt) {
if(!rt)rt=++tot; ++sm[rt];
if(l==r)return;
register int mid=l+r>>1;
if(p<=mid)Modify(p,l,mid,ls[rt]);
else Modify(p,mid+1,r,rs[rt]);
}
inline LL Sz(int x,LL y) {
pos=Kth(x,1,maxx,rt[n+1]);
Modify(pos,1,maxx,rt[n+1]);
register LL res;
if(pos<=n)res=1LL*pos*m;
else res=del[n+1][pos-n-1];
del[n+1].push_back(y?y:res);
return res;
}
inline LL Hz(int x,LL y) {
pos=Kth(y,1,maxx,rt[x]);
Modify(pos,1,maxx,rt[x]);
register LL res;
if(pos<m)res=1LL*(x-1)*m+pos;
else res=del[x][pos-m];
del[x].push_back(Sz(x,res));
return res;
}
int main() {
freopen("phalanx.in","r",stdin);
freopen("phalanx.out","w",stdout);
scanf("%d%d%d",&n,&m,&T),maxx=max(n,m)+T;
for(int u,v;T--;) {
scanf("%d%d",&u,&v);
if(v==m)printf("%lld\n",Sz(u,0));
else printf("%lld\n",Hz(u,v));
}
}
【NOIP2017 提高组正式赛】列队 题解的更多相关文章
- [jzoj]5478.【NOIP2017提高组正式赛】列队
Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校 ...
- 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,我们可以用上面的规则产 ...
随机推荐
- java语言和jdk、jre基础
Java语言平台 * J2SE(Java 2 Platform Standard Edition)标准版 * 是为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可以完成一些桌 ...
- git概述
学习资料来源-人家写得比我好 #视频教程: https://www.bilibili.com/video/BV1vy4y1s7k6?spm_id_from=pageDriver #文档教程 https ...
- 实战-DRF快速写接口(认证权限频率)
实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...
- python---二维数组的查找
""" 在一个二维数组中(每个一维数组的长度相同), 每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. """ # ...
- jupyter notebook 调用.py文件
方法1.利用 %run xx.py 直接运行得出结果. 方法2:利用 %load xx.py 载入代码再点击Run运行,这种方法的好处是可以方便修改代码. 说明: Jupyter Notebook中以 ...
- .Net Core 进程守护之Supervisor使用
1.执行下列命令安装supervisor wget https://mirrors.tuna.tsinghua.edu.cn/epel/epel-release-latest-7.noarch.rpm ...
- [Where is My Chicken Soup] 鸡汤来咯
20岁的年纪安逸不是好的选择.尝试突破自己,你的本事不止你现在的样子. 保持适当的焦虑,它会一直鞭策你进步. 失败的原因有很多,并不代表你真的不行.但如果自己真就这么放弃了,那你才是真的不行.
- 微信小程序组件封装及调用-原生
封装一个弹窗组件 1.新建component文件夹存放我们的组件,里边存放的就是我们所用的组件,我们今天要做的事弹出框,新建文件夹popup存放我们的组件模板,点击右键选择新建component,就会 ...
- HCIE-SEC笔记-EVENG模拟器安装
EVEng模拟器安装: 准备:Vmware 16.0 EVEng EVE-NG-Win-Client-Pack.exe [抓包,内置wireshark,内置vnc,用来打开windows系统] Win ...
- go语言编译过程概述
go语言编译过程概述 总结自<go语言设计与实现> 名词解释: 中间代码 中间代码是编译器或者虚拟机使用的语言,它可以来帮助我们分析计算机程序.在编译过程中,编译器会在将源代码转换到机器码 ...