思路:
用链表记录数据,将所有数据存入队列,然后每次删除不符合的数据,将符合要求的数据如队列,
逐步缩小数据范围。(注意:最后输出的每个数字后面接一个空格)。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 2e5+10;
int a[maxn],pre[maxn],nxt[maxn],que[maxn];
int main(void)
{
int T,n,i,j;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
int top = 0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
pre[i] = i-1;
nxt[i] = i+1;
que[top++] = i;
}
pre[n+1] = n;nxt[0] = 1;
int ans = n;
while(1){
int fg = 0,tp = 0,now = 0;
while(now<top){
int pos = que[now],len = 0;
while(nxt[pos]<=n&&a[pos]>a[nxt[pos]]){
len++;
fg = 1;
pos = nxt[pos];
}
if(len){
ans = ans - (len+1);
pre[nxt[pos]] = pre[que[now]];
nxt[pre[que[now]]] = nxt[pos];
que[tp++] = pre[que[now]];
}
while(now<top&&que[now]<=pos) now++;
}
top = tp;
if(!fg) break;
}
printf("%d\n",ans);
for(i=nxt[0];i<=n;i=nxt[i]){
printf("%d ",a[i]);
}
printf("\n");
}
return 0;
}