描述 YYY景点的自助餐厅提供N道主菜和M道配菜。第i道主菜的价格是Ai ,第j道配菜的价格是Bj 。餐厅正在考虑推出新的套餐菜单。一份套餐包括一道主菜和一道配菜。设S是主菜和配菜的价格之和,那么套餐的价格将以S为准,但最大不超过上限P。
显然,菜单中有N×M种主菜和配菜搭配的套餐。求所有这些套餐的总价。
输入 第一行3个以空格分隔的正整数 N, M, P;
第二行N个以空格分隔的正整数,依次表示A1,A2,A3,...AN;
第三行M个以空格分隔的正整数,依次表示B1,B2,B3,...BM;
输出 一个整数,表示答案。
样例
输入
2 2 7
3 5
6 1
输出
24
输入
1 3 2
1
1 1 1
输出
6
输入
7 12 25514963
2436426 24979445 61648772 23690081 33933447 76190629 62703497
11047202 71407775 28894325 31963982 22804784 50968417 30302156 82631932 61735902 80895728 23078537 7723857
输出复制 2115597124
数据范围
对于20%的数据,1≤N,M≤100, 1≤Ai,Bj,P≤100
对于30%的数据,满足Ai+Bj≤P(1≤i≤N, 1≤j≤M)
对于80%的数据,1≤N,M≤200000, 1≤Ai,Bj,P≤5000
对于100%的数据,1≤N,M≤200000, 1≤Ai,Bj,P≤ 1 0 9 10 9
#include <bits/stdc++.h>
//#pragma GCC optimize(3) //?????????2
using namespace std;
long long a[200001];
long long b[200001];
long long s[200001];
int main ()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
long long n,m,p;
cin>>n>>m>>p;
for (int i=1;i<=n;i++)cin>>a[i];
for (int i=1;i<=m;i++)cin>>b[i];
sort(a+1,a+1+n);
sort(b+1,b+1+m);
long long sum=0;
for (int i=1;i<=m;i++)s[i]=s[i-1]+b[i];
for (int i=1;i<=n;i++)
{
int l=0,r=m,ans=0;
while (l<r)
{
int mid=(l+r)/2;
if (b[mid]+a[i]<=p)ans=mid,l=mid+1;
else r=mid-1;
}
sum+=s[ans]+ans*a[i]+(m-ans)*p;
}
cout<<sum;
return 0;
}