救我,P1081,手写对顶堆,28pts
  • 板块灌水区
  • 楼主guimei121212
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/9 18:07
  • 上次更新2024/12/9 21:32:09
查看原帖
救我,P1081,手写对顶堆,28pts
1340936
guimei121212楼主2024/12/9 18:07
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void push(int k,vector<int> &bheap,int &blen,vector<int> &sheap,int &slen,char l);
void pop(vector<int> &bheap,int &blen,vector<int> &sheap,int &slen,char l);
void swap(vector<int> &bheap,vector<int> &sheap,int &blen,int &slen,int &mid,int &id);

int main(){
	int n,m;
	cin>>n>>m;
	int blen=0,slen=0,mid;
	vector<int> bheap(n);
	vector<int> sheap(n);
	vector<int> a(n+1),u(m+1);
	for(int i=1;i<=n;i++){	
		cin>>a[i];
	}
	
	for(int i=1;i<=m;i++){
		cin>>u[i];
	}
	int id=u[1];
	mid=a[1];
	for(int i=1,j=1;i<=n;i++){
		if(a[i]<mid){
			push(a[i],bheap,blen,sheap,slen,'b');
		}else if(a[i]>mid){
			push(a[i],bheap,blen,sheap,slen,'s');
		}
		
		if(i>=u[j] && j<=m ){
			j++;
			swap(bheap,sheap,blen,slen,mid,id);
			cout<<mid<<endl;
			
		}
	
		
	}
}

void swap(vector<int> &bheap,vector<int> &sheap,int &blen,int &slen,int &mid,int &id){
	int y=blen;
	if(y+1>id){
		while(y+1>id){
			push(mid,bheap,blen,sheap,slen,'s');
			mid=bheap[1];
			pop(bheap,blen,sheap,slen,'b');
			y=blen;
		}
	}else if(y+1<id){
		while(y+1<id){
			push(mid,bheap,blen,sheap,slen,'b');
			mid=sheap[1];
			pop(bheap,blen,sheap,slen,'s');
			y=blen;
		}
	}
	id++; 
}

void pop(vector<int> &bheap,int &blen,vector<int> &sheap,int &slen,char l){
	if(l=='b'){
		bheap[1]=bheap[blen--];
		
		int t=1;
		while(t*2<=blen){
			int son=t*2;
			
			if(son+1<=blen && bheap[son+1]>bheap[son]){
				son++;
			}
			
			if(bheap[son]>bheap[t]){
				swap(bheap[son],bheap[t]);
				t=son;
			}else{
				break;
			}
		}
	}else if(l=='s'){
		sheap[1]=sheap[slen--];
		int t=1;
		while(t*2<=slen){
			int son=t*2;
			if(son+1<=slen && sheap[son+1]<sheap[son]){
				son++;
			}
			
			if(sheap[son]<sheap[t]){
				swap(sheap[son],sheap[t]);
				t=son;
			}else{
				break;
			}
		}
	}
	
}


void push(int k,vector<int> &bheap,int &blen,vector<int> &sheap,int &slen,char l){
	if(l=='b'){
		bheap[++blen]=k;
		for(int i=blen;i/2>=1;i/=2){
			if(bheap[i/2]<bheap[i]){
				swap(bheap[i/2],bheap[i]);
			}else{
				break;
			}
		}
	}else if(l=='s'){
		sheap[++slen]=k;
		for(int i=slen;i/2>=1;i/=2){
			if(sheap[i/2]>sheap[i]){
				swap(sheap[i/2],sheap[i]);
			}else{
				break;
			}
		}
	}
}


2024/12/9 18:07
加载中...