题解[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. db2 数据库配置HADR+TSA添加集群节点

    Db2配置HADR高可用+TSA添加集群节点 一.服务器资源 Master IP:10.78.10.1 数据库:dbclassSlave IP:10.78.10.2 数据库:dbclassVIP:10 ...

  2. C++:标准C函数(随机数,时间函数)

    介绍 ANSI组织定义了C标准和标准库函数. 使用标准C函数优点: 使用标准C函数在任何平台上都支持,使得同一个源码,在Windows编译运行的结果和Linux上编译运行结果相同,无需更改代码. 随机 ...

  3. 资源|《美团机器学习实践》PDF+思维导图

    今天再给大家推荐一本由美团算法团队出版的<美团机器学习实践>,下载链接见文末. 美团算法团队由数百名优秀算法工程师组成,负责构建美团这个生活服务互联网大平台的"大脑", ...

  4. Ubuntu16.04 换源(或者404 Not Found问题)

    当执行sudo apt-get update或者sudo apt-get install命令时,出现以下两个问题: “apt-get 404 Not Found Package Repository ...

  5. VS2013+WDK8.1 驱动开发环境配置

    Windows Driver Kit 是一种完全集成的驱动程序开发工具包,它包含 WinDDK 用于测试 Windows 驱动器的可靠性和稳定性,本次实验使用的是 WDK8.1 驱动开发工具包,该工具 ...

  6. Python 的 Mixin 类(转)

    转1:https://www.cnblogs.com/aademeng/articles/7262520.html 转2:https://blog.csdn.net/u010377372/articl ...

  7. JS强制关闭浏览器页签并且不提示关闭信息

    工作中很多奇葩的需求都会出现,现在就有一个问题,描述如下: 现在的登录跳转权限页面要去掉,集成在第三方系统信息上,当退出登录的时候需要关掉打开的Tab页面,因此考虑使用window.close()关闭 ...

  8. CentOS7.5 安装MySql教程

    CentOS7位安装MySql教程 1.先检查系统是否装有mysql rpm -qa | grep mysql 2.下载mysql的repo源 wget http://repo.mysql.com/m ...

  9. 怎样解决Chrome浏览器因为禁止音频自动播放所造成的视频无法自动播放且报错: Uncaught (in promise) DOMException的问题

    这个问题是谷歌基于用户体验方面的考虑, 对页面加载时自动播放的音频作了限制, 试想一下, 如果你打开某个页面就立刻自动播放某种不可描述的声音, 那体验想必是十分酸爽. 尽管这个设定是针对音频的, 但实 ...

  10. DP动态规划学习笔记——高级篇上

    说了要肝的怎么能咕咕咕呢? 不了解DP或者想从基础开始学习DP的请移步上一篇博客:DP动态规划学习笔记 这一篇博客我们将分为上中下三篇(这样就不用咕咕咕了...),上篇是较难一些树形DP,中篇则是数位 ...