CodeForces - 1353D Constructing the Array

CodeForces - 1353D

这道题也可能比较简单,主要是要想到优先队列要怎么使用,这一点如果用递归会写不了

但是因为对优先队列不太熟悉,只有被提示可以用优先队列才想到要怎么用,

还是很重要的STL

注意运算符的重构应该反着来写

其他的思维很朴素,运算符的重构就是,先比较长度,优先用长度长的,如果一样就是选择左边界小的,用结构体封装数据即可

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int a[200005]={0};
int cnt=0;
struct Node{
    int l;int r;int val;
};
bool operator<(Node a,Node b){
    if(a.val==b.val) return a.l>b.l;
    return a.val<b.val;
}
priority_queue<Node> q;
void solve(){
    while(!q.empty()){
        Node x=q.top();
        q.pop();
        if(x.val==1){
            a[x.l]=++cnt;
            continue;
        }
        int mid=(x.l+x.r)>>1;
        a[mid]=++cnt;
        Node aa;
        aa.l=x.l;
        aa.r=mid-1;
        aa.val=aa.r-aa.l+1;
        if(aa.val>0) q.push(aa); 
        Node bb;
        bb.l=mid+1;
        bb.r=x.r;
        bb.val=bb.r-bb.l+1;
        if(bb.val>0) q.push(bb);
    }
}
signed main(){
    int time;
    cin>>time;
    while(time--){
        int n;
        cnt=0;
        cin>>n;
        Node u;
        u.l=1;u.r=n;u.val=n;
        q.push(u);
        solve();
        for(int i=1;i<=n;++i){
            cout<<a[i]<<" ";
        }
        cout<<endl;
    }
}
posted @ 2024-08-24 13:43  z-zhi  阅读(10)  评论(0编辑  收藏  举报