# hdu 6215 -- Brute Force Sorting（双向链表+队列）

Problem Description
Beerus needs to sort an array of

Input
The first line of input contains an integer

Output
For eact test case output two lines.
The first line contains an integer

Sample Input
5
5
1 2 3 4 5
5
5 4 3 2 1
5
1 2 3 2 1
5
1 3 5 4 2
5
2 4 1 3 5

Sample Output
5
1 2 3 4 5
0

2
1 2
2
1 3
3
2 3 5

a[pre].r=a[next].r;
a[a[next].r].l=pre;
a[next].l=pre;

前两个很明显表示删除now和next，最后一个a[next].l=pre，是因为可能next也在队列中，下一个要判断是否删除 next 和 a[next].r , 删除之后都需要将链表前后连接起来，例如对于n=5 , 2 5 3 1 4这样的数据，删除5和3数值后（对应的下表为2和3，下标从1开始），下一个3和1也不满足。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=1e5+5;
struct Node
{
int l,r;
int x;
}a[N];
queue<int>Q;

int main()
{
int T; cin>>T;
while(T--)
{
int n; scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].x);
a[i].l=i-1;
a[i].r=i+1;
Q.push(i);
}
a.r=1; a[n+1].x=9999999;
while(!Q.empty())
{
int now=Q.front(); Q.pop();
int pre=a[now].l;
int next=a[now].r;
if(a[now].x>a[next].x)
{
Q.push(pre);
a[pre].r=a[next].r;
a[a[next].r].l=pre;
a[next].l=pre;
}
}
int ans=0;
int now=a.r;
while(now<=n)
{
ans++;
now=a[now].r;
}
printf("%d\n",ans);
now=a.r;
while(now<=n)
{
printf("%d ",a[now].x);
now=a[now].r;
}
puts("");
}
return 0;
}

posted @ 2017-11-01 20:58  茶飘香~  阅读(...)  评论(...编辑  收藏