Codeforces 1353 D. Constructing the Array(优先队列)
程序员文章站
2022-06-02 22:16:16
...
题意:
按照题意模拟即可,因为每次要选长度最大的,相等的话靠左的
用优先队列模拟即可
代码:
using namespace std;
const int MAXN=1e5+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
//::iterator it;
struct node
{
int x,y;
bool operator < (const node & a) const
{
if(y!=a.y)
return y<a.y;
else return x>a.x;
}
}k;//运算符重载,y大的排前面,如果y相等,x小的排前面
int a[2*MAXN];
int main()
{
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
priority_queue<node>q;//x区间左边界坐标,y区间长度
int t;
cin>>t;
int n;
while(t--){
//priority_queue<int>q;
cin>>n;
int m;
if(n&1)m=(n+1)/2;
else m=n/2;
int p=1;
a[m]=p;
int l=1,r=n;
k.x=1,k.y=m-1;
q.push(k);
k.x=m+1,k.y=r-m;
q.push(k);
while(!q.empty()){
p++;
node j=q.top();
q.pop();
//cout<<j.x<<" "<<j.y<<endl;
if(j.y==0)continue;
if(j.y==1){
a[j.x]=p;
continue;
}
l=j.x;
r=j.y+l-1;
if(j.y&1)
m=(l+r)/2;
else m=(l+r-1)/2;
a[m]=p;
//if(p==20)break;
k.x=j.x,k.y=m-j.x;
q.push(k);
k.x=m+1,k.y=r-m;
q.push(k);
}
for(int i=1;i<=n;i++)cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
/*
*/