创建一个max[100005][2]数组,max[i][0]存储温度不超过i的最大学分,max[i][1]存储次大学分(可能与max[i][0]的值相同,也可能为0,即无次大值)
//2025/11/21
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
int maxv[100005][2], h[1000005], v[100005];
int main() {
cin.tie(0) -> sync_with_stdio(0);
int n, T; cin >> n >> T;
int maxh = 0;
for(int i = 1; i <= n; ++i) cin >> h[i], maxh = max(maxh, h[i]);
for(int i = 1; i <= n; ++i) {
cin >> v[i];
if(!maxv[h[i]][0]) maxv[h[i]][0] = v[i];
else if(!maxv[h[i]][1]) {
maxv[h[i]][1] = v[i];
if(maxv[h[i]][1] > maxv[h[i]][0]) swap(maxv[h[i]][0], maxv[h[i]][1]);
} else if(v[i] > maxv[h[i]][0]) maxv[h[i]][0] = v[i];
else if(v[i] > maxv[h[i]][1]) maxv[h[i]][1] = v[i];
}
for(int i = 1; i <= 100000; ++i) {
if(maxv[i][0] < maxv[i-1][0]) {
maxv[i][1] = max({maxv[i][1], maxv[i][0], maxv[i-1][1]});
maxv[i][0] = maxv[i-1][0];
} else if(maxv[i][1] < maxv[i-1][0]) maxv[i][1] = maxv[i-1][0];
}
ll ans = 0;
while(T--) {
int x; cin >> x;
ans += maxv[x-1][0]+maxv[x-1][1];
}
cout << ans << endl;
return 0;
}

京公网安备 11010502036488号