DP,应为前面一个球有颜色相同和不同两种情况,维护两个颜色不同的球的最值,就可以转移了.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long int LL;
const LL INF=(1LL<<60);
int n,q;
LL c[100100],v[100100];
LL dp[100100],x,y;
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>v[i];
for(int i=1;i<=n;i++) cin>>c[i];
while(q--)
{
cin>>x>>y;
fill(dp,dp+n+10,-INF);
int id1=0,id2=0;
LL ans=0;
for(int i=1;i<=n;i++)
{
dp[c[i]]=max(dp[c[i]],max(dp[c[i]]+v[i]*x,v[i]*y));
if(id1!=c[i])
dp[c[i]]=max(dp[c[i]],dp[id1]+v[i]*y);
else
dp[c[i]]=max(dp[c[i]],dp[id2]+v[i]*y);
if(id1!=c[i])
{
if(dp[c[i]]>dp[id1])
{
id2=id1; id1=c[i];
}
else if(dp[c[i]]>dp[id2])
{
id2=c[i];
}
}
ans=max(ans,dp[c[i]]);
}
cout<<ans<<endl;
}
return 0;
}