社区讨论

全WA,求调

P1168中位数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lpnqvw9j
此快照首次捕获于
2023/12/02 15:41
2 年前
此快照最后确认于
2023/12/02 16:03
2 年前
查看原帖
CPP
/*
思路:
1.维护一个小根堆(.top()>mid),一个大根堆(.top()<=mid) 
2.每一次奇数次加入时调整一下
3.调整时,比较小根堆和大根堆的元素个数,然后加入 
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+10;
int n,mid,a[N];
int heap_max[N],heap_min[N],heap_size_min,heap_size_max;
void push_min(int x){
	heap_min[++heap_size_min]=x;
	int now=heap_size_min;
	while(now>>1){
		int father=now>>1;
		if(heap_min[father]>heap_min[now]) swap(heap_min[father],heap_min[now]);
		else break;
		now=father;
	}
}
void push_max(int x){
	heap_max[++heap_size_max]=x;
	int now=heap_size_max;
	while(now>>1){
		int father=now>>1;
		if(heap_max[father]<heap_max[now]) swap(heap_max[father],heap_max[now]);
		else break;
		now=father;
	}
}
void delete_heap_top_min(){
	heap_min[1]=heap_min[heap_size_min--];
	int now=1;
	while(now<<1<=heap_size_min){
		int son=now<<1;
		if(son+1<=heap_size_min&&heap_min[son]>heap_min[now]) son++;
		if(heap_min[son]<heap_min[now]) swap(heap_min[son],heap_min[now]);
		now=son;
	}
}
void delete_heap_top_max(){
	heap_max[1]=heap_max[heap_size_max--];
	int now=1;
	while(now<<1<=heap_size_max){
		int son=now<<1;
		if(son+1<=heap_size_max&&heap_max[son]<heap_min[now]) son++;
		if(heap_max[son]>heap_max[now]) swap(heap_max[son],heap_max[now]);
		now=son;
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	mid=a[1];
	cout<<mid<<endl;
	for(int i=2;i<=n;i++){
		if(a[i]>mid) push_min(a[i]);
		if(a[i]<=mid) push_max(a[i]);
		if(i&1){
			if(heap_size_min<heap_size_max){
				push_min(mid);
				mid=heap_max[1];
				delete_heap_top_max();
			}
			if(heap_size_min>heap_size_max){
				push_max(mid);
				mid=heap_min[1];
				delete_heap_top_min();
			}
			cout<<mid<<endl;
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...