题解[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] 列队的更多相关文章

  1. [NOIP2017]列队 离线+SBT

    [NOIP2017]列队 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有n×m名学生,方阵 ...

  2. 【题解】NOIP2017 提高组 简要题解

    [题解]NOIP2017 提高组 简要题解 小凯的疑惑(数论) 不讲 时间复杂度 大力模拟 奶酪 并查集模板题 宝藏 最优解一定存在一种构造方法是按照深度一步步生成所有的联通性. 枚举一个根,随后设\ ...

  3. 【题解】NOIP2017逛公园(DP)

    [题解]NOIP2017逛公园(DP) 第一次交挂了27分...我是不是必将惨败了... 考虑这样一种做法,设\(d_i\)表示从该节点到n​节点的最短路径,\(dp(i,k)\)表示从\(i\)节点 ...

  4. 【NOIP题解】NOIP2017 TG D2T3 列队

    列队,NOIP2017 TG D2T3. 树状数组经典题. 题目链接:洛谷. 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. ...

  5. NOIP2017 列队 题解报告【56行线段树】

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

  6. NOIP2017列队(phalanx)解题报告

    列队作为NOIP2017最后一道题,其实并不难,只是相对于其它题目,有点小小的工业 首先,这道题我用splay维护的,如果你不会splay,又想学一下splay,可以来这里学一学,接下来步入正题 首先 ...

  7. [NOIP2017]列队 (Splay)

    题目链接 NOIP2017真的是不按常理出牌: 1.数学题不在Day2T1 2.一道水题一道细节极多的模拟题一道不知道怎么形容的题(小凯的疑惑)(因为我太菜了) 3.3道大火题 当时看到列队这题是毫无 ...

  8. <noip2017>列队

    题解: 考场实际得分:45 重新看了一下,发现至少80分是很好拿的 对于前30% 暴力 另20% 显然离线搞一下就可以了(大概当初连离线是啥都不知道) 另另30%其实只要维护第一行和最后一列就可以了, ...

  9. Luogu 3960 [NOIP2017] 列队 - splay|线段树

    题解 是我从来没有做过的裂点splay... 看的时候还是很懵逼的QAQ. 把最后一列的$n$个数放在一个平衡树中, 有 $n$ 个点 剩下的$n$行数, 每行都开一个平衡树,开始时每棵树中仅有$1$ ...

随机推荐

  1. 多文件上传,添加重复文件时无法触发onchange事件。

    <input type="file" id="upload" @change="getFile($event)" multiple=& ...

  2. Pywinauto使用方法

    3 Pywinauto使用 连接为 http://pywinauto.github.io/ 3.1 关联到一个应用,用以下方法: ? start_(path) connect_(handle or p ...

  3. Android 卸载应用程序

    最近工作中接触Android应用实现卸载自身的逻辑,踩了一些坑之后整理下来.使用的方法是Intent.ACTION_DELETE,这里没有什么好说的. MainActivity.java : pack ...

  4. SAS学习笔记11 SAS宏

    宏是一个被储存的文本,用一个名字识别它.最简单的宏就像一个宏变量一样工作,但复杂的宏可以完成许多宏变量不能做的事. 定义宏的语句格式为: %macro 宏名称: 宏文本 %mend <宏名称&g ...

  5. 浅析ARM协处理器CP15寄存器有关指令:MCR\MRC

    ref:http://blog.csdn.net/gameit/article/details/13169405 背景: 在uboot中,start.s中涉及到了 CP15 的有关操作.查阅有关资料, ...

  6. Centos7安装gitlab11 学习笔记之备份恢复及邮箱配置

    一.备份 修改配置文件 vim /etc/gitlab/gitlab.rb 默认路径为 # gitlab_rails['backup_path'] = "/var/opt/gitlab/ba ...

  7. opencv-04--图像金字塔

    图像金字塔被广泛应用于各种视觉应用中.图像金字塔是一个图像集合,集合中图像都源于同一个原始图像,而且是通过对原始图像连续降采样获得,直到达到某个中止条件才停止降采样.(当然,降为一个像素肯定是中止条件 ...

  8. JS 断点调试心得

    1.断点调试是啥?难不难? 断点调试其实并不是多么复杂的一件事,简单的理解无外呼就是打开浏览器,打开sources找到js文件,在行号上点一下罢了.操作起来似乎很简单,其实很多人纠结的是,是在哪里打断 ...

  9. iOS 如何判断一个点在圆、方框、三角形区域内?

    如何判断一个点是不是在方框(CGRect).圆(Circle).三角形(Triangle)内呢? 1.方框 //苹果官方方法可以判断 + (BOOL)point:(CGPoint)point inSq ...

  10. ASIHTTPRequest源码简单分析

      1.前言      ASIHttprequest 是基于CFNetwork的,由于CFNetwork是比较底层的http库,功能比较少,因此,在ASIHttprequest中实现了http协议中比 ...