中位数题解整活

中位数题解(整活)

题目描述

思路分析

这道题思路很多,比如说堆,平衡树,但还有一种比较简单的做法

主席树!!!

没错,静态区间第k小,这不纯纯主席树板子吗

代码实现

#include<bits/stdc++.h> 
using namespace std;
const int N=2e5+1;
int cnt;
int n,m,a[N],b[N],root[N];
struct tree{
	int l,r,sum;
}pst[N<<5];
int update(int pre,int pl,int pr,int x){
	int rt=++cnt;
	pst[rt].l=pst[pre].l;
	pst[rt].r=pst[pre].r;
	pst[rt].sum=pst[pre].sum+1;
	int mid=(pl+pr)>>1;
	if(pl<pr){
		if(x<=mid) pst[rt].l=update(pst[pre].l,pl,mid,x);
		else pst[rt].r=update(pst[pre].r,mid+1,pr,x);
	}
	return rt;
}
int query(int l,int r,int pl,int pr,int k){
	if(pl==pr) return pl;
	int x=pst[pst[r].l].sum-pst[pst[l].l].sum;
	int mid=(pl+pr)>>1;
	if(k<=x) return query(pst[l].l,pst[r].l,pl,mid,k);
	else return query(pst[l].r,pst[r].r,mid+1,pr,k-x); 
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) {cin>>a[i];b[i]=a[i];}
	sort(b+1,b+n+1);
	int size=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++){//1~i
		int x=lower_bound(b+1,b+size+1,a[i])-b;
		root[i]=update(root[i-1],1,size,x);
	}
	for(int i=1;2*i-1<=n;i+=1){
		cout<<b[query(root[0],root[2*i-1],1,size,i)]<<endl;
	}
	return 0;
}
1 个赞

这是个整活题解,别说我乱放AC代码了,这就是板子

1 个赞

%%%

1 个赞

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%膜大佬

1 个赞

正解!