求条!!!
查看原帖
求条!!!
1036707
chzhh_111楼主2025/1/25 14:15

小数据活了,大数据死了,我的心也死了(50pts)

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1,M=2e5+1;
#define int long long
int n,m,f,ans,maxi;
int root[M],tot;
struct student{
	int a,b;
}d[M];
struct tree{
	int sonl,sonr,sum,cnt;
}tr[N<<6];
bool cmp(student aa,student bb) {return aa.a<bb.a;}
void build(int k,int l,int r)
{
	if(l==r) return;
	int mid=(l+r)>>1;
	tr[k].sonl=++tot;
	build(tot,l,mid);
	tr[k].sonr=++tot;
	build(tot,mid+1,r);
}
void add(int k1,int k2,int l,int r,int x,int v)
{
	tr[k1].sum=tr[k2].sum+v;
	tr[k1].cnt=tr[k2].cnt+1;
	if(l==r) return;
	int mid=(l+r)>>1;
	if(x<=mid)
	{
		tr[k1].sonr=tr[k2].sonr;
		tr[k1].sonl=++tot;
		add(tot,tr[k2].sonl,l,mid,x,v);
	}
	else
	{
		tr[k1].sonl=tr[k2].sonl;
		tr[k1].sonr=++tot;
		add(tot,tr[k2].sonr,mid+1,r,x,v);
	}
}
int query(int k1,int k2,int l,int r,int x,int s,int ss)
{
	if(l==r) return ss+tr[k1].sum-tr[k2].sum;
	int mid=(l+r)>>1;
	if(s+tr[tr[k1].sonl].cnt-tr[tr[k2].sonl].cnt>=x)
	  return query(tr[k1].sonl,tr[k2].sonl,l,mid,x,s,ss);
	else
	  return query(tr[k1].sonr,tr[k2].sonr,mid+1,r,x,s+tr[tr[k1].sonl].cnt-tr[tr[k2].sonl].cnt,ss+tr[tr[k1].sonl].sum-tr[tr[k2].sonl].sum);
}
signed main()
{
	scanf("%lld%lld%lld",&m,&n,&f);
	for(int i=1;i<=n;i++) scanf("%lld%lld",&d[i].a,&d[i].b),maxi=max(maxi,d[i].b);
	sort(d+1,d+1+n,cmp);
	root[0]=++tot;
	build(tot,0,maxi);
	for(int i=1;i<=n;i++)
	{
		root[i]=++tot;
		add(tot,root[i-1],0,maxi,d[i].b,d[i].b);
	}
	for(int i=n-m/2;i>=(m+1)/2;i--)
	{
		int mon=query(root[i-1],root[0],0,maxi,m/2,0,0)+query(root[n],root[i],0,maxi,m/2,0,0)+d[i].b;
		if(mon<=f) {printf("%lld",d[i].a);return 0;}
	}
	printf("-1");
	return 0;
}
2025/1/25 14:15
加载中...