天天看点

Wannafly挑战赛21 C:大水题

#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]);
}      

继续阅读