数据太水啦!!!
查看原帖
数据太水啦!!!
290959
聊机楼主2022/11/25 15:52

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次才过的水题》——

2022/11/25 15:52
加载中...