Description

nodgd的粉丝太多了,每天都会有很多人排队要签名。
今天有n个人排队,每个人的身高都是一个整数,且互不相同。很不巧,nodgd今天去忙别的事情去了,就只好让这些粉丝们明天再来。同时nodgd提出了一个要求,每个人都要记住自己前面与多少个比自己高的人,以便于明天恢复到今天的顺序。
但是,粉丝们或多或少都是有些失望的,失望使她们晕头转向、神魂颠倒,已经分不清楚哪一边是“前面”了,于是她们可能是记住了前面比自己高的人的个数,也可能是记住了后面比自己高的人的个数,而且他们不知道自己记住的是哪一个方向。
nodgd觉得,即使这样明天也能恢复出一个排队顺序,使得任意一个人的两个方向中至少有一个方向上的比他高的人数和他记住的数字相同。可惜n比较大,显然需要写个程序来解决,nodgd很忙,写程序这种事情就交给你了。

Input

第一行输入一个整数n,表示指令的条数。
接下来n行,每行两个整数ai,bi,表示一个人的身高和她记住的数字,保证身高互不相同。

Output

输出一行,这个队列里从前到后的每个人的身高。如果有多个答案满足题意,输出字典序最小。如果不存在满足题意的排列,输出“impossible”(不含引号)。

Sample Input

输入1:

4
4 1
3 1
6 0
2 0

输入2:

6
1 5
8 0
3 1
4 0
2 0
6 0

Sample Output

输出1:

2 4 3 6

输出2:

1 2 4 3 6 8

Data Constraint

对于 40% 的数据:N≤10N\leq10
对于 60% 的数据:N≤1000N\leq1000
对于 100% 的数据:N≤100000N\leq100000

Hint

【样例解释1】
在所给出的答案队列中,第一个人身高为2,前面有0个人比他高,所以他是输入的第4个人;第二个人身高为4,右边有1个人比他高,所以他是输入的第1个人;第三个人身高为3,右边有1个人比他高,所以他是输入的第2个人;第四个人身高为6,左边有0个人比他高,所以他是输入的第3个人。
显然,如果排列为“6 3 4 2”也是满足题意的,但是字典序不是最小的。

Solution

  • 我们可以按高度从大到小排一遍序,倒着处理。

  • 设当前做到第 ii 个人,前 i−1i-1 个人(排好序了)到已经站好了。

  • 我们操作时保证满足条件,为了满足字典序最小,那么填的位置 kk 肯定是满足:

    k=Min{bi+1,i−1−bi}

    k=Min\{b_i+1,i-1-b_i\}

  • 即在往后看和往前看中选一个较小的填进去,最后输出排好的序列即可。

  • 其中的插入操作可以用线段树的二分查找、或者Splay维护。

  • 我用的是 Splay ,时间复杂度为 O(N log N)O(N\ log\ N) ,代码如下:

Code

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+3,inf=1e9;
struct data
{int x,y;
}a[N];
int root,tot;
int fa[N],size[N],key[N],s[N][2];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline bool cmp(data x,data y)
{return x.x>y.x;
}
inline bool pd(int x)
{return x==s[fa[x]][1];
}
inline void update(int x)
{size[x]=size[s[x][0]]+size[s[x][1]]+1;
}
inline void newnode(int &v,int val,int p)
{v=++tot;fa[v]=p,size[v]=1,key[v]=val;s[v][0]=s[v][1]=0;
}
inline void rotate(int x)
{int y=fa[x],w=pd(x);if(s[y][w]=s[x][w^1]) fa[s[x][w^1]]=y;if(fa[x]=fa[y]) s[fa[y]][pd(y)]=x;s[fa[y]=x][w^1]=y;update(y);
}
inline void splay(int x,int k)
{for(int y;(y=fa[x])^k;rotate(x))if(fa[y]^k) rotate(pd(x)==pd(y)?y:x);update(x);if(!k) root=x;
}
inline int kth(int x,int k)
{if(size[s[x][0]]+1==k) return x;if(k<=size[s[x][0]]) return kth(s[x][0],k);return kth(s[x][1],k-size[s[x][0]]-1);
}
inline void print(int x)
{if(s[x][0]) print(s[x][0]);if(key[x]<inf) write(key[x]),putchar(' ');if(s[x][1]) print(s[x][1]);
}
int main()
{int n=read();for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++)if(a[i].y>i-1) return 0&puts("impossible");newnode(root,inf,0);newnode(s[root][1],inf,root);update(root);for(int i=1;i<=n;i++){int k=min(a[i].y,(size[root]-2)-a[i].y)+1;splay(kth(root,k),0);splay(kth(root,k+1),root);newnode(s[s[root][1]][0],a[i].x,s[root][1]);update(s[root][1]),update(root);}print(root);return 0;
}

JZOJ 5456. 【NOIP2017提高A组冲刺11.6】奇怪的队列相关推荐

  1. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列

    Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...

  2. JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数

    Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数 ...

  3. JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  4. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  5. JZOJ 5466. 【NOIP2017提高A组冲刺11.9】玩游戏

    Description 小A得了忧郁综合症,小B正在想办法开导她. 机智的小B决定陪着小A玩游戏,他从魔法的世界里变出一张无向联通图,每条边上都有边权.小B定义一条路径的权值为所有经过边中的最大权值, ...

  6. JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章

    Description nodgd写了一篇文章,自认为这是一篇好文章.nodgd的文章由n个小写英文字母组成.文章的一个子串指的是文章中的一段连续的字母,子串的长度就是这一段的字母个数.nodgd在文 ...

  7. JZOJ 5463. 【NOIP2017提高A组冲刺11.8】证书

    Description Pulumi生活在P城的角落,而他的朋友们gjdy,oyski,tutuwai等等生活在P城的靠中心位置. P城很大,但它拥有优秀的城市结构,同时P城重视文化教育的发展,P城共 ...

  8. JZOJ 5460. 【NOIP2017提高A组冲刺11.7】士兵训练

    Description Input 第一行两个数n,q 表示士兵数以及阅兵次数. 接下来一行n-1 个整数,第i 个整数表示士兵i+1 的直属教官. 接下来n 行每行两个整数i i b ,l 描述一位 ...

  9. JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室

    Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 ...

最新文章

  1. Javascript中{}+[]===0为true,而[]+{}===0为false
  2. 租不起房!你离逃离北上广还有多长时间?
  3. MySQL a库备份恢复为B库_MySQL数据库备份的基础知识_MySQL
  4. linux测试dvi接口,液晶显示器DVI接口及测试规范.pdf
  5. 一篇文章,了解清楚路由器的各种组网
  6. 保证你现在和未来不失业的十种关键技术
  7. 带你手写基于 Spring 的可插拔式 RPC 框架(四)代理类的注入与服务启动
  8. SLAM Cartographer(3)定位和子图构建节点
  9. 在qt中获取halcon窗口图片_Qt联合HALCON显示文件夹图片及初步处理
  10. ASP.NET 创建网站地图
  11. 华为HG8347R V3R016C10S135光猫桥接 北京联通 恢复华为原版
  12. 【转】布同:如何循序渐进学习Python语言
  13. 吐血分享:QQ群霸屏技术教程2017(维护篇)
  14. matmul product(一般矩阵乘积),hadamard product(哈达玛积)、kronecker product(克罗内克积)
  15. linux不出现图形界面的解决方法
  16. 项目经理版《野狼disco》
  17. iOS中把故事板中视功能和美工结合在1起
  18. 苹果手机更新后开不了机_苹果7突然黑屏,苹果7开不了机
  19. MyBatis官方文档-Java API
  20. HTTP协议-教程(一)

热门文章

  1. kepler架构GPU新特性--HyperQ
  2. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170401
  3. < Android数据存储> 任务二 应用程序数据文件夹里的文件读写
  4. python模板语言_Python Django 模板语言之 Tags(标签)
  5. ubuntu mysql 改密码_ubuntu——mysql的安装(1)
  6. 基于光学导航系统,矩阵变换和3D-2D配准研究
  7. 期待着DELPHI的浴火重生
  8. BUUCTF-Reverse:[GKCTF2020]Check_1n
  9. 用递归合并两个排序的链表
  10. ubuntu 终端内查找/搜索