参考第一篇题解的思路,码风良好。
代码如下:
#include<bits/stdc++.h>
#define ls tree[p].l
#define rs tree[p].r
#define N 200010
using namespace std;
int n,m,f,ans=-1,t[N],cnt,f1[N],f2[N],rt[N];
struct Student{
int a,b;
} st[N];
struct node{
int l,r,sum;
} tree[N<<5];
void build(int &p,int l,int r){
p=++cnt;
if(l==r) return;
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
}
void update(int &p,int fa,int l,int r,int a){
p=++cnt;
tree[p]=tree[fa];
tree[p].sum++;
if(l==r) return;
int mid=l+r>>1;
if(a<=mid) update(ls,tree[fa].l,l,mid,a);
else update(rs,tree[fa].r,mid+1,r,a);
}
int query(int l,int r,int a,int b,int c){
if(l==r) return l;
int mid=l+r>>1,x=tree[tree[b].l].sum-tree[tree[a].l].sum;
if(c<=x) return query(l,mid,tree[a].l,tree[b].l,c);
else return query(mid+1,r,tree[a].r,tree[b].r,c-x);
}
int main(){
scanf("%d%d%d",&m,&n,&f);
m>>=1;
for(int i=1;i<=n;i++) scanf("%d%d",&st[i].a,&st[i].b);
for(int i=1;i<=n;i++) t[i]=st[i].b;
sort(t+1,t+n+1);
int q=unique(t+1,t+n+1)-t-1;
build(rt[0],1,q);
for(int i=1;i<=n;i++) update(rt[i],rt[i-1],1,q,lower_bound(t+1,t+q+1,st[i].b)-t);
for(int i=1;i<=m;i++) f1[i]=f1[i-1]+st[i].b;
for(int i=n;i>=n-m+1;i--) f2[i]=f2[i+1]+st[i].b;
for(int i=m+1;i<=n;i++) f1[i]=f1[i-1]+min(0,st[i].b-t[query(1,q,rt[0],rt[i-1],m)]);
for(int i=n-m;i>=1;i--) f2[i]=f2[i+1]+min(0,st[i].b-t[query(1,q,rt[i],rt[n],m)]);
for(int i=m+1;i<=n-m;i++){
if(st[i].b+f1[i-1]+f2[i+1]<=f) ans=max(ans,st[i].a);
}
printf("%d",ans);
return 0;
}