D. Constructing the Array(优先队列,思维)

传送门呢大门校门中俺是个的

如 果 你 一 直 在 打 表 找 规 律 什 么 的 就 会 发 现 如果你一直在打表找规律什么的就会发现

很 难 有 什 么 规 律 很难有什么规律

如 果 把 连 续 0 的 段 看 成 一 个 一 个 的 元 素 , 长 度 大 的 左 端 点 小 的 优 先 级 高 如果把连续0的段看成一个一个的元素,长度大的左端点小的优先级高 0,

并 且 在 这 个 区 间 中 间 加 上 点 后 , 区 间 分 成 了 2 个 小 的 全 0 子 区 间 并且在这个区间中间加上点后,区间分成了2个小的全0子区间 ,20

所 以 可 以 用 优 先 队 列 做 所以可以用优先队列做

#include 
using namespace std;
struct p{
	int l,r,len;
	bool operator < (const p&tmp )	const{
		if(this->len==tmp.len)	return this->l>tmp.l;
		return this->lenl=l,this->r=r,this->len=len;
//	}
};int a[200009];
priority_queue

q; int main() { int t; cin>>t; while(t--) { int n; cin>>n; while(!q.empty()) q.pop(); q.push( (p) {1,n,n} ); int k=0; while(1) { p now=q.top();q.pop(); int l=now.l,r=now.r,s; if((r-l+1)%2==1) a[(l+r)/2]=++k,s=(l+r)/2; else a[(l+r-1)/2]=++k,s=(l+r-1)/2; if(k==n) break; if(s-1>=l) q.push( (p) {l,s-1,(s-1)-l+1} ); if(r>=s+1) q.push( (p) {s+1,r,r-(s+1)+1} ); } for(int i=1;i<=n;i++) cout<

你可能感兴趣的:(CF刷题计划)