rt,因为我忘了怎么写主席树了所以写了个朴素二分,结果后来发现是假的,然后我就加了一个乱搞,直接进了最优解第一页……
#include<bits/stdc++.h>
using namespace std;
struct node{
int a,b,id;
}s[200002],s1[200002];
inline int qr() {
int k=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) {k=(k<<1)+(k<<3)+(ch^48);ch=getchar();}
return k;
}
bool comp (node x,node y) {
return x.b<y.b;
}
bool cmp2 (node x,node y) {
if(x.a==y.a) return x.b<y.b;
return x.a<y.a;
}
int n,c,f,nx[200002];
inline bool check(int x) {
int cnt1=0,cnt2=0,cnt=1;
long long ans=s1[x].b;
for(int i=1;i<=c;i++) {
if(i==s1[x].id) continue;
if(s[i].a>s1[x].a) {
if(cnt1<n>>1) ++cnt,++cnt1,ans+=s[i].b;
else continue;
}
if(s[i].a<s1[x].a) {
if(cnt2<n>>1) ++cnt,++cnt2,ans+=s[i].b;
else continue;
}
if(s[i].a==s1[x].a) ++cnt,ans+=s[i].b;
if(ans>f||cnt==n) break;
}
// printf("%d %d %d %d %d\n",s1[x].a,s1[x].b,cnt,cnt1,cnt2);
return ans<=f&&cnt==n;
}
//inline int Rndom() {
// return (long long)rand()*rand()%5+3;
//}
int main() {
n=qr(),c=qr(),f=qr();
for(int i=1;i<=c;i++)
s[i].a=qr(),s[i].b=qr(),
s1[i].a=s[i].a,s1[i].b=s[i].b,
s[i].id=i;
sort(s+1,s+c+1,comp);
for(int i=1;i<=c;i++) s1[s[i].id].id=i;
sort(s1+1,s1+c+1,cmp2);
int l=1,r=c;
while(l<=r) {
int mid=(l+r)>>1;
if(check(mid)) l=mid+1;
else {
r=mid-1;
bool flag=l>r;//乱搞部分
for(int i=r;i<=r+5&&i<=c;i++)
if(check(i)) l=i;
if(l>r&&(!flag)) r=c;//这里判断flag是因为无解可能会死循环
}
}
s1[0].a=-1;
printf("%d",s1[r].a);
return 0;
}
祭奠我交了65次才过的水题》——