1 条题解
-
0
这题不是 CSP-S 初赛的阅读程序吗(还是补全程序来着)?
注意到 很大,考虑二分,然后考虑如何 check,发现枚举一维然后二分另一维时间复杂度是对的,然后就做完了呀。
时间复杂度 ,存在 的做法。
#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
- 上传者