题目链接:Brute Force Sorting
题目大意:给你一个序列,要求a[i] <= a[i+1],不满足这个情况的数就得删掉,问最后的序列是什么
题目思路:因为如果两个数不满足的话,不光后面那个,前面那个也得删掉,所以我们考虑用双向链表维护,用一个队列去维护这个双向链表的前继,普通链表维护后继,然后就可以做了
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
int que[maxn],a[maxn],pre[maxn],nxt[maxn],n,top;
int main(){
int T;
scanf("%d",&T);
while(T--){
top = 0;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
pre[i] = i-1;
nxt[i] = i+1;
scanf("%d",&a[i]);
que[top++] = i;
}
nxt[0] = 1;
int ans = n,flag = 0;
while(1){
int cnt = 0,cur = 0,flag = 0;
while(cur < top){
int p = que[cur],num = 0;
while(nxt[p] <= n&&a[p] > a[nxt[p]]){
flag = 1;
num++;
p = nxt[p];
}
if(num){
ans -= num+1;
nxt[pre[que[cur]]] = nxt[p];
pre[nxt[p]] = pre[que[cur]];
que[cnt++] = pre[que[cur]];
}
while(que[cur] <= p&&cur < top) cur++;
}
top = cnt;
if(!flag) break;
}
printf("%d\n",ans);
int cur = 0;
while(cur <= n){
if(cur) printf("%d ",a[cur]);
cur = nxt[cur];
}
puts("");
}
return 0;
}