用优先队列来把个数最多的、个数相同区间靠左的放在队列的前端
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
//#include<vector>
using namespace std;
struct node
{
int x,y;
int len=0;
};
struct map
{
bool operator ()(const node& a,const node& b) const
{
if(a.len!=b.len)
return a.len<b.len;
else
return a.x>b.x;
}
};
int cur[200009];
priority_queue <node,vector<node>,map> q;
int main()
{
int t,n;
scanf("%d",&t);
for(int r=1;r<=t;r++)
{
memset(cur,0,sizeof(cur));
int s=0;
scanf("%d",&n);
node a;
a.x=1;a.y=n;a.len=n;
q.push(a);
while(!q.empty())
{
node n=q.top();
q.pop();
if((n.y-n.x+1)%2==1)
{
node u1,u2;
cur[(n.y+n.x)/2]=++s;
u1.x=n.x;
u1.y=(n.y+n.x)/2-1;
u1.len=(n.y+n.x)/2-1-n.x+1;
u2.x=(n.y+n.x)/2+1;
u2.y=n.y;
u2.len=n.y-(n.y+n.x)/2-1+1;
if(u1.x<=u1.y)
q.push(u1);
if(u2.x<=u2.y)
q.push(u2);
}
else
{
node u1,u2;
cur[(n.y+n.x-1)/2]=++s;
u1.x=n.x;
u1.y=(n.y+n.x-1)/2-1;
u1.len=(n.y+n.x-1)/2-1-n.x+1;
u2.x=(n.y+n.x-1)/2+1;
u2.y=n.y;
u2.len=n.y-(n.y+n.x-1)/2-1+1;
if(u1.x<=u1.y)
q.push(u1);
if(u2.x<=u2.y)
q.push(u2);
}
}
for(int i=1;i<=n;i++)
{
if(i==n)
printf("%d\n",cur[i]);
else
printf("%d ",cur[i]);
}
}
return 0;
}