题目描述
已知一个消息流会不断地吐出整数1 \sim N1∼N,但不一定按照顺序吐出。如果上次打印的数为i,那么当i+1出现时,请打印i+1及其之后接收过的并且连续的所有数,直到1 \sim N1∼N全部接收并打印完,请设计这种接收并打印的结构
[要求]
消息流最终会吐出全部的1 \sim N1∼N,当然最终也会打印完所有的1\sim N1∼N,要求接收和打印1 \sim N1∼N的整个过程,时间复杂度为O(N)O(N)。
输入描述:
第一行一个整数N。
接下来一行有N个整数。保证输入是一个1到N的排列
输出描述:
输出N行,每行两个数。
为了检验输出的正确性,请在输出当前打印的数字之后输出此时最后一个加入的元素。
具体看输入输出样例
示例1
输入
复制
9
2 1 4 5 7 3 9 8 6
输出
复制
1 1
2 1
3 3
4 3
5 3
6 6
7 6
8 6
9 6
说明
消息流吐出2,一种结构接收而不打印2,因为1还没出现。
消息流吐出1,一种结构接收1,并且打印:1, 2。
消息流吐出4,一种结构接收而不打印4,因为3还没出现。
消息流吐出5,一种结构接收而不打印5,因为3还没出现。
消息流吐出7,一种结构接收而不打印7,因为3还没出现。
消息流吐出3,一种结构接收3,并且打印:3, 4, 5。
消息流吐出9,一种结构接收而不打印9,因为6还没出现。
消息流吐出8,一种结构接收而不打印8,因为6还没出现。
消息流吐出6,一种结构接收6,并且打印:6, 7, 8, 9。
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
bool a[100007];
int main()
{
int min_a=1;
int n,x;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
a[x]=true;
if(x==min_a)//可以输出
{
int k=x;
while(a[k])
{
cout<<k++<<" "<<min_a<<endl;
}
min_a=k;
}
}
return 0;
}