题目大意

有一个 \(n\times m\) 的方阵,每次有 \((x,y)\) 离开,离开后有两个命令

  1. 向左看齐。这时第一列保持不动,所有学生向左填补空缺。这条指令之后,空位在第 \(x\) 行第 \(m\) 列。
  2. 向前看齐。这时第一行保持不动,所有学生向前填补空缺。这条指令之后,空位在第 \(n\) 行第 \(m\) 列。

最后 \((x,y)\) 回到 \((n,m)\)

现在问每次离队的人的编号。 \((i,j)\) 的编号是 \((i-1)*m+j\)

题解

对每一行前 \(m-1\) 个建 \(n\) 个权值线段树,对第 \(m\) 列单独建。

线段树记录区间离开的个数

因为把一个点加入线段树十分麻烦,考虑用 \(n+1\) 个 \(vector\) 来保存加入的数

接着分类讨论

  1. \(y==m\),就是只有向前看齐。直接在第 \(n+1\) 颗线段树中 \(x\) 的实际位置 \(pos\)

    若 \(pos<=n\) 则没有删除,答案为 \(pos*m\) ,否则在 \(vector\) 中

  2. \(y<m\) ,先向左看齐。在第 \(x\) 颗线段树中查询 \(y\) 的实际位置 \(pos\)

    若 \(y<m\) 则没有删除,否则在 \(vector\) 中。得到答案再向前看齐

    向前看齐加入 \(vector\) 的编号为这里得到的编号

  3. 每次得到答案就把它加入对应的 \(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 提高组正式赛】列队 题解相关推荐

  1. JZOJ 5478. 【NOIP2017提高组正式赛】列队

    Description Sylvia 是一个热爱学习的女孩子.前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数为 n, ...

  2. 【NOIP2017提高组正式赛】列队

    题面 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m名学生,方阵的行数 ...

  3. JZOJ 5475. 【NOIP2017提高组正式赛】逛公园

    Description 策策同学特别喜欢逛公园.公园可以看成一张n个点m条边构成的有向图,且没有自环和重边.其中1号点是公园的入口,n号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的 ...

  4. JZOJ 5476. 【NOIP2017提高组正式赛】奶酪

    Description 现有一块大奶酪,它的高度为 h,它的长度和宽度我们可以认为是无限大的,奶酪中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中,奶酪的下表面为z = ...

  5. JZOJ 5477. 【NOIP2017提高组正式赛】宝藏

    Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋,也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度.小明决心亲自前往挖掘所有宝藏屋中的 ...

  6. JZOJ 5473. 【NOIP2017提高组正式赛】小凯的疑惑

    Description 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小凯想知道在无法准确支付的物品 ...

  7. JZOJ 5474. 【NOIP2017提高组正式赛】时间复杂度

    Description 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!下面请 ...

  8. 5473. 【NOIP2017提高组正式赛】小凯的疑惑

    题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小凯想知道在无法准确支付的物品中,最贵的价值 ...

  9. NOIP2017提高组模拟赛4 (总结)

    NOIP2017提高组模拟赛4 (总结) 第一题 约数 设K是一个正整数,设X是K的约数,且X不等于1也不等于K. 加了X后,K的值就变大了,你可以重复上面的步骤.例如K= 4,我们可以用上面的规则产 ...

最新文章

  1. 人工智能:第二章 知识表示方法
  2. etcd和mysql_etcd和redis比较
  3. Redis中7种集合类型应用场景
  4. Qt 两个Ui 界面传值
  5. ASP.NET MVC 学习之路-5
  6. 【Java】身份证的验证
  7. Python连接mysql密码用密文_druid配置数据库连接使用密文密码
  8. http | 状态码
  9. 学qt的都干什么工作_【板绘前景】学板绘可以干什么工作?学多久才可以工作?好学吗?...
  10. html阿里矢量图标库,矢量图标素材库_阿里巴巴矢量图标库的使用
  11. 金蝶kis专业版服务器不显示,金蝶KIS专业版常见问题解决方法
  12. 设置小程序video标签宽高比例为9/16
  13. MySQL - 实战 棋牌游戏数据库开发
  14. 【转】教程:如何制作一个多功能U盘
  15. 刚入职的新人如何快速了解公司业务--转载
  16. js 获取当前与一个月前的日期
  17. MyBatis超详细笔记
  18. matlab snapnow,任意倾斜椭圆方程的画法.pdf
  19. ttkefu怎么取消英文版?显示中文版
  20. Laravel 教程:使用Fast Excel解决导出超大 XLSX 文件(千万级)带来的内存问题

热门文章

  1. 刘慎宝 :京东集团财务系统架构设计之路
  2. 计算机DIY调研报告,16:9和16:10显示器偏好调研报告
  3. stc15f104实现触摸开关
  4. 人人学人人【一】 —— 谁人打的太极拳?
  5. 07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
  6. 奈奎斯特采样定理-为什么采样率需要时被测信号最高频率的两倍
  7. 解决ubuntu开机循环输入密码无法进入桌面的问题
  8. C语言的链表和数组-诺禾
  9. 祝计算机考试成功,计算机考试来啦,深信小编祝大家逢考必过!
  10. Android高德地图功能总结