1 条题解

  • 0
    @ 2025-1-11 20:03:55

    这题不是 CSP-S 初赛的阅读程序吗(还是补全程序来着)?

    注意到 kk 很大,考虑二分,然后考虑如何 check,发现枚举一维然后二分另一维时间复杂度是对的,然后就做完了呀。

    时间复杂度 O(nlog2n)O(n\log^2 n),存在 O(nlogn)O(n\log n) 的做法。

    #include <iostream>
    #include <algorithm>
    #define ll long long
    using namespace std;
    const ll N=1e5+10;
    const ll INF=2147483647;
    ll a[N],b[N],n,m,k,sum[N];
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0),cout.tie(0);
    	cin>>n>>m>>k;
    	for(ll i=1;i<=n;i++) cin>>a[i];
    	for(ll i=1;i<=m;i++) cin>>b[i];
    	sort(a+1,a+1+n);
    	sort(b+1,b+1+m);
    	for(ll i=m;i>=1;i--) sum[i]=sum[i+1]+b[i];
    	ll L=0,R=INF,cnt;
    	while(L<R){
    		cnt=0;
    		ll mid=(L+R)>>1;
    		for(ll i=1;i<=n;i++){
    			ll LL=1,RR=m+1,mmiidd;
    			while(LL<RR){
    				mmiidd=(LL+RR)>>1;
    				if(a[i]+b[mmiidd]>=mid) RR=mmiidd;
    				else LL=mmiidd+1;
    			}
    			cnt+=(m-RR+1);
    		}
    		if(cnt>=k) L=mid+1;
    		else R=mid;
    	}
    	L--;
    	cnt=0;
    	ll ans=0;
    	for(ll i=1;i<=n;i++){
    		ll LL=1,RR=m+1,mmiidd;
    		while(LL<RR){
    			mmiidd=(LL+RR)>>1;
    			if(a[i]+b[mmiidd]>=L) RR=mmiidd;
    			else LL=mmiidd+1;
    		}
    		cnt+=(m-RR+1);
    		ans+=(m-RR+1)*a[i]+sum[RR];
    	}
    	ans-=(cnt-k)*L;
    	cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    7
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    53
    已通过
    11
    上传者