立希喂猫
提供一个c++的代码,轻喷。
关于思路可以参考上面Python同学的讲解,主要用到了前缀和,降低复杂度。
不过c++的处理要麻烦一些。
下面是代码
#include<bits/stdc++.h>
#define lli long long int
using namespace std;
const int N = 1e5 + 10;
int a[N];
vector<pair<int,int> >b;
lli c[N];
lli d[N];
bool paircom(int a, pair<int,int> b){
return a < b.first;
}
int main(void){
int n; scanf("%d", &n);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
int x;
for(int i = 0; i < n; i++){
scanf("%d", &x);
b.push_back({x, i});
}
sort(b.begin(),b.end());
// # b[i].first < k, 即全部吃完的种类
for(int i = 0; i < n; i++){
if (i==0) c[i] = b[i].first * a[b[i].second];
else c[i] = c[i-1] + b[i].first * a[b[i].second];
}
// # b[i].first >= k, 没有全部吃完的种类, 只能吃k*a[-]
for(int i = n-1; i >= 0; i--){
if (i==n-1) d[i] = a[b[i].second];
d[i] = d[i+1] + a[b[i].second];
}
int q; scanf("%d", &q);
while(q--){
lli k; scanf("%lld", &k);
lli ind = upper_bound(b.begin(), b.end(), k, paircom) - b.begin();
lli ans = 0;
if (ind >= 1) ans += c[ind-1];
ans += k*d[ind];
printf("%lld\n", ans);
}
return 0;
}