离散化+树状数组41pts求调
查看原帖
离散化+树状数组41pts求调
502314
Just_A_Sentence楼主2024/7/14 22:41
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n;
struct stu{
	ll high,num;
	int id;
}a[200005],s[200005];
bool cmp(stu a,stu b){
	return a.high<b.high;
}
ll p[200005];
ll tr[200005];
int lowbit(int x){
	return x&(-x);
}
void add(int id,ll x){
	for(int i=id;i<=n;i+=lowbit(i)) tr[i]+=x;
}
ll find(int x){
	ll ans=0;
	for(int i=x;i>0;i-=lowbit(i)) ans+=tr[i];
	return ans;
}
int tot=1;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld%lld",&a[i].high,&a[i].num);
		s[i]=a[i];
	}
	sort(a+1,a+n+1,cmp);
	p[1]=a[1].high;
	for(int i=2;i<=n;i++){
		if(a[i].high!=p[tot]){
			p[++tot]=a[i].high;
		}
	}
	for(int i=1;i<=n;i++){
		int l=1,r=tot;
		while(l<r){
			int mid=(l+r)/2;
			if(p[mid]>s[i].high) r=mid-1;
			else if(p[mid]<s[i].high) l=mid+1;
			else{
				l=mid;
				r=mid;
			}
		}
		s[i].id=l;
	}
	for(int i=1;i<=n;i++){
		add(s[i].id,s[i].num);
		int all_num=find(n);
		int all_mid=(all_num+1)/2;
		int l=1,r=n;
		while(l<r){
			int mid=(l+r)/2;
			int fi=find(mid);
			if(fi<all_mid){
				l=mid+1;
			}
			else r=mid;
		}
		printf("%lld\n",p[l]);
	}
	return 0;
}
2024/7/14 22:41
加载中...