解析:
对于每一个分界点,都会分成两端,我们用优先队列存储,这样可以让区间长度长的且在左边的,优先处理
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
const int N=2e5+10000;
int a[N];
int t,n;
struct node
{
int x;
int y;
friend bool operator<(node a, node b) {
if(abs(a.y-a.x)==abs(b.y-b.x)) return a.x>b.x;
return abs(a.y-a.x)<abs(b.y-b.x);
}
};
int main()
{
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
memset(a,0,sizeof a);
priority_queue<node > q;
cin>>n;
if(n==1)
{
cout<<1<<endl;
continue;
}
q.push({1,n});
int k=0;
while(q.size())
{
auto t=q.top();q.pop();
int x=t.x;int y=t.y;
// cout<<x<<" "<<y<<endl;
int mid;
if((y-x+1)%2==0) mid=(x+y-1)/2;
else mid=(x+y)/2;
a[mid]=++k;
if((mid-1)>0&&x<mid-1) q.push({x,mid-1});
if((mid+1)<n+1&&mid+1<y) q.push({mid+1,y});
}
//cout<<k<<"----"<<endl;
for(int i=1;i<=n;i++)
{
if(a[i]==0) cout<<++k<<" ";
else cout<<a[i]<<" ";
}
cout<<endl;
}
}