爆0求条全RE555
  • 板块P5462 X龙珠
  • 楼主Bella_chen
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/7/26 15:39
  • 上次更新2025/7/26 21:42:14
查看原帖
爆0求条全RE555
1666936
Bella_chen楼主2025/7/26 15:39
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
int a[MAXN],nxt[MAXN],n,len;
bool b[MAXN];
struct node{
	int x; int i;
}tree[MAXN];
void put(node k){
	len++;
	tree[len]=k;
	int son=len;
	while (son>1){
		int fa=son/2;
		if (tree[fa].x>=tree[son].x) return;
		swap(tree[fa],tree[son]);
		son=fa;
	}
}
int get(){
	node k=tree[1];
	tree[1]=tree[len--];
	int fa=1;
	while (fa*2<=len){
		int son=fa*2;
		if (son+1<=len&&tree[son].x<tree[son+1].x) son++;
		if (tree[fa].x>=tree[son].x) break;
		swap(tree[son],tree[fa]);
		fa=son;
	}
	if (b[k.i]) return get();
	while (b[nxt[k.i]]&&nxt[k.i]<=n) {
		nxt[k.i]=nxt[nxt[k.i]];
	}
	if (nxt[k.i]>n) return get();
	cout<<a[k.i]<<' '<<a[nxt[k.i]]<<' ';
	b[k.i]=b[nxt[k.i]]=1;
}
int main()
{
    cin>>n;
	for (int i=1;i<=n;i++) cin>>a[i];
	for (int i=1;i<=n;i++){
		tree[i].x=a[i];
		tree[i].i=i;
		nxt[i]=i+1;
		if (i!=n) put(tree[i]);
	}
	for (int i=1;i<=n/2;i++) get();
}
2025/7/26 15:39
加载中...