题解[NOIP2017] 列队
题解[NOIP2017] 列队
题面
解析
看到这题时感觉这个编号很难维护啊?
后来看了lzf大佬的题解才会..
首先,考虑一个稍微暴力的做法,
维护每一行的前\(m-1\)个人和最后一列的\(n\)个人的编号,
也就是用\(n+1\)个区间分开维护
设当前询问\((x,y)\),
那么就在第\(x\)行中把它删掉,
再把最后一列的对应第\(x\)行的人加入第\(x\)行中,
最后将询问的人加入最后一列.
(当然如果询问的人在最后一列要特判)
但显然这样时间和空间都会炸...
于是考虑优化,
首先意识到只有\(q\)个询问,即每个区间长度最多只会加\(q\)
那么可以考虑对每个区间用一棵类似于权值线段树的结构动态开点,
具体来说,拿一个区间举个例子,
设区间长度为\(l\),
那么我们开一棵区间总长度为\(l+q\)的权值线段树,
其中前\(l\)个是本来就在那里的,后面的是后来加进来的,
显然前\(l\)个的编号就是它本来的编号规则,而后面的可以用一个\(vector\)维护,
这样空间复杂度也就下来了.
每个节点维护一个\(cnt\)表示它代表的区间里有多少个元素被删(出队)了,
那么区间长度-\(cnt\)就是区间里还剩下的人数,
而询问其实也就是找剩下的第\(y\)个人.
和左子树的剩下的人数比大小就行了.
最后还是注意如果询问在最后一列要特判.
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define int long long
#define fre(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;
inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
}
const int N=1000005;
struct tree{int cnt,l,r;}t[N<<2];
int n,m,Q,rt[N],tot;
vector<int> v[N];
inline int dinf(int &p,int l,int r,int x){
if(!p) p=++tot,t[p].cnt=0;
t[p].cnt++;
if(l==r) return l;
int mid=(l+r)>>1;
int cc=mid-l+1-t[t[p].l].cnt;
if(cc>=x) return dinf(t[p].l,l,mid,x);
else return dinf(t[p].r,mid+1,r,x-cc);
}
signed main(){
n=read();m=read();Q=read();
int l1=m-1+Q,l2=n+Q;
while(Q--){
int x=read(),y=read();
if(y<m){
int pos=dinf(rt[x],1,l1,y);
int ans=pos<m? (x-1)*m+pos:v[x][pos-m];
v[n+1].push_back(ans);
int pos1=dinf(rt[n+1],1,l2,x);
int ans1=pos1<=n? pos1*m:v[n+1][pos1-n-1];
v[x].push_back(ans1);
printf("%lld\n",ans);
}
else{
int pos=dinf(rt[n+1],1,l2,x);
int ans=pos<=n? pos*m:v[n+1][pos-n-1];
v[n+1].push_back(ans);
printf("%lld\n",ans);
}
}
return 0;
}
题解[NOIP2017] 列队的更多相关文章
- [NOIP2017]列队 离线+SBT
[NOIP2017]列队 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵 ...
- 【题解】NOIP2017 提高组 简要题解
[题解]NOIP2017 提高组 简要题解 小凯的疑惑(数论) 不讲 时间复杂度 大力模拟 奶酪 并查集模板题 宝藏 最优解一定存在一种构造方法是按照深度一步步生成所有的联通性. 枚举一个根,随后设\ ...
- 【题解】NOIP2017逛公园(DP)
[题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...
- 【NOIP题解】NOIP2017 TG D2T3 列队
列队,NOIP2017 TG D2T3. 树状数组经典题. 题目链接:洛谷. 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. ...
- NOIP2017 列队 题解报告【56行线段树】
题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n \times mn×m名学生,方阵的行数 ...
- NOIP2017列队(phalanx)解题报告
列队作为NOIP2017最后一道题,其实并不难,只是相对于其它题目,有点小小的工业 首先,这道题我用splay维护的,如果你不会splay,又想学一下splay,可以来这里学一学,接下来步入正题 首先 ...
- [NOIP2017]列队 (Splay)
题目链接 NOIP2017真的是不按常理出牌: 1.数学题不在Day2T1 2.一道水题一道细节极多的模拟题一道不知道怎么形容的题(小凯的疑惑)(因为我太菜了) 3.3道大火题 当时看到列队这题是毫无 ...
- <noip2017>列队
题解: 考场实际得分:45 重新看了一下,发现至少80分是很好拿的 对于前30% 暴力 另20% 显然离线搞一下就可以了(大概当初连离线是啥都不知道) 另另30%其实只要维护第一行和最后一列就可以了, ...
- Luogu 3960 [NOIP2017] 列队 - splay|线段树
题解 是我从来没有做过的裂点splay... 看的时候还是很懵逼的QAQ. 把最后一列的$n$个数放在一个平衡树中, 有 $n$ 个点 剩下的$n$行数, 每行都开一个平衡树,开始时每棵树中仅有$1$ ...
随机推荐
- Redis SETNX实现分布式锁
1.某进程1执行 SETNX lock 以尝试获取锁 2.由于某进程2已获得了锁,所以进程1执行 SETNX lock 返回0,即获取锁失败 3.进程1执行 GET lock 来检测锁是否已超时,如果 ...
- Markdonw 详细入门教程
1. Markdown语法快速入门手册 2 Markdown概述 2.1 Markdown宗旨 2.2 Markdown兼容HTML 2.3 Markdown特殊字符自动转换 2.4 Markdown ...
- Vue基础知识学习(后端)
### Vue学习(后端) Vue安装 -引入文件安装,直接在官网下载vue.js引入项目中 -直接引用CDN -NPM安装(构建大型应用使用,在这不用) -命令行工具(构建大型单页应用,在这不用) ...
- python学习--12 基本数据类型
数字 int -int 功能 1.转换 例如: a = '123' # 字符串print(type(a),a)b = int(a) # 将字符串转换成intprint(type(b),b) 运算结果 ...
- Python之数字的四舍五入(round(value, ndigits) 函数)
round(value, ndigits) 函数 print(round(1.23)) # 1 print(round(1.27)) # 1 print(round(1.23,1)) # 1.2 第二 ...
- 变量————if语句——结构使用
1简述变量的命名规范 变量是以字母 数字 下划线组合而成 不能以数字开头 不能使用python中的关键字命名 变量要具有可描述性 区分大小写 name变量是什么数据类型通过代码检测 name = in ...
- Codeforces 1249 E. By Elevator or Stairs?
传送门 首先显然下楼的操作一定是不优的,所以只要考虑上楼 设 $f[i]$ 表示到第 $i$ 层时需要的最少时间 那么首先考虑走楼梯,有转移,$f[i]=f[i-1]+a[i-1]$ 然后考虑坐电梯有 ...
- 夯实基础:彻底搞清楚Cookie 和 Session 关系和区别(转)
原文地址:http://www.sohu.com/a/281228178_120047080 网络请求中的cookie与set-Cookie的交互模式和作用:https://my.oschina.ne ...
- (八)Redis之持久化之AOF方式
一.概念 AOF方式:将以日志,记录每一个操作 优势:安全性相对RDB方式高很多: 劣势:效率相对RDB方式低很多: 二.案例 appendonly no默认关闭aof方式 我们修改成yes 就开启 ...
- 安装mysql时出现 mysql Install/Remove of the Service Denied! 错误的解决办法
用cmd在mysql的bin目录下面执行: mysqld --install 命令,出现错误: mysql Install/Remove of the Service Denied! 解决方法:以管理 ...