题解[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$ ...
随机推荐
- java源码--Map
Map接口 用于保存具有映射关系的数据结构,实现该接口的类可以通过键来获取对应的值.. 可以将给定一个键值对存储在Map接口的实现类实例中,如:map.put("key", &qu ...
- Java基础---Java 开发工具IntelliJ IDEA 快捷操作
IDE中快捷编写函数的方法 public static void main(String[] args) ===> psvm System.out.println(); ====> sou ...
- ThinkPHP读取配置信息
use think\Config; dump(Config::get()); // 或者 dump(config());示例:dump(Config::get('database.database') ...
- diy操作系统 附录:常用命令
ld -m elf_i386 as --32 gcc -m 16 o
- 硬件实现IIC协议读取EEPROM
我TMD也是服了,反正我板子搞了半天也不成功我也不知道为什么,野火STM32-MINI,一直卡EV5,不管了 先代码沾上 工程目录(板子为野火STM32 MINI) 串口相关代码: bsp_usart ...
- Python开发【第三章】:函数介绍
一. 函数介绍 1.函数是什么? 在学习函数之前,一直遵循面向过程编程,即根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复 ...
- JS 02 函数
函数 一.创建函数 1.function 函数名( 形参列表 ){ 函数体 } 2.var 函数名 = function( 形参列表 ) { 函数体 } 3.var 函数名 = new Functio ...
- 怎样手写实现 new 命令的功能
实现new命令的功能, 首先需要知道new命令都做了些什么: 第一步: 创建一个空对象, 作为实例对象的容器; 第二步: 将空对象的prototype指向构造函数的prototype; 第三步: 将空 ...
- 数据库中间件之mycat安装部署(一)
在学习数据库中间件前,我们先抛出三个问题 1.数据库数据量不大,但并发读写操作很大,应该怎么办? 此时我们首先考虑使用缓存中间件来减轻读压力,如果不能满足则考虑数据库读写分离,此时就会引入新的问题,这 ...
- 设计模式(三)——装饰器模式(Decorator Pattern)
发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装 ...