​题目传送门​​​ 思路很简单
直接上代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn=300000+100;

ll ans[maxn],val[maxn],sum[maxn],dp[maxn];
map<int,ll>M;

int main(){

int n;
scanf("%d",&n);
sum[0]=dp[0]=0;
for(int i=1;i<=n;i++) scanf("%lld",&ans[i]);
for(int i=1;i<=n;i++) scanf("%lld",&val[i]),sum[i]=sum[i-1]+val[i];
for(int i=1;i<=n;i++){

dp[i]=dp[i-1];
if(M.count(ans[i])) dp[i]=max(dp[i],M[ans[i]]+sum[i]),M[ans[i]]=max(M[ans[i]],dp[i-1]-sum[i-1]);
else M[ans[i]]=dp[i-1]-sum[i-1];

}
printf("%lld\n",dp[n]);
}