Codeforces D.Constructing the Array(优先队列)

https://codeforces.ml/contest/1353/problem/D
(题目链接↑)
题解
这题主要用到优先队列,size(区间长度)大的排在前,size相同的left(左端点)小的排在前。
主要积累一下这里的语法:

struct node{
	int size,l,r;
	bool operator > (const node& a) const{
		if(size!=a.size) return size<a.size;
		else return l>a.l;
	}
};
priority_queue< node, vector<node>, greater<node> >q;

AC代码:

#include 
#include 
using namespace std;
int a[200005];
struct node{
	int size,l,r;
	bool operator > (const node& a) const{
		if(size!=a.size) return size<a.size;
		else return l>a.l;
	}
};
int main(){
	int t,n;
	cin>>t;
	while(t--){
		cin>>n;
		int k=1;
		priority_queue< node, vector<node>, greater<node> >q;
		q.push( node{n,1,n} );
		while(!q.empty()){
			node m=q.top();
			q.pop();
			int l,r;
			l=m.l; r=m.r;
			int mid=(l+r)/2;
			a[mid]=k++;
			if(l<=mid-1) q.push( node{mid-l,l,mid-1} );
			if(r>=mid+1) q.push( node{r-mid,mid+1,r} );
		}
		for(int i=1;i<=n;i++){
			cout<<a[i]<<" ";
		}
		cout<<endl;
	}
	return 0;
}

你可能感兴趣的:(数据结构,Codeforces)