题解 [ABC321D] Set Menu
cjh20090318 · · 题解
题意
给定一个长度为
你需要求:
分析
说实话感觉这题比 C 还要简单。
先考虑单个
所以先将
再考虑
时间复杂度
代码
//the code is from chenjh
#include<cstdio>
#include<algorithm>
#define MAXN 200002
using namespace std;
typedef long long LL;
int n,m,p;
int a[MAXN],b[MAXN];
LL s[MAXN];//b 的前缀和。
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
sort(b+1,b+m+1);//排序。
for(int i=1;i<=m;i++) s[i]=s[i-1]+b[i];
LL ans=0;
for(int i=1,x;i<=n;i++){
x=lower_bound(b+1,b+m+1,p-a[i])-b;//找到第一个 b[x]>=p-a[i] 的位置。
ans+=(LL)a[i]*(x-1)+s[x-1]+(LL)p*(m-x+1);//两部分的贡献加起来即可。
}
printf("%lld\n",ans);
return 0;
}