题解 CF264C 【Choosing Balls】
题解- CF246C Choosing Balls
题目意思
说人话就是你可以选若干个物品,若这次选择的物品与上次选的
相同那么这个的贡献就是
否则是
。要使得利益最大化。
一开始我以为是什么贪心。后来想想认为还是一个
。就是要利用其特殊的一个性质单调性
我们设
表示到现在选择的最后一个元素的颜色为
的最优解。
显然对于上次颜色相同的只要
即可,对于颜色不同的即
于是我们只要去求
即可。此时我们就要去维护最大值以及次大值。而且因为单调性我们可以做到
更新最大值与次大值。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,a[N],c[N],f[N],las,ans,ret;
signed main()
{
scanf("%lld%lld",&n,&m);
for ( int i=1;i<=n;i++ ) scanf("%lld",&a[i]);
for ( int i=1;i<=n;i++ ) scanf("%lld",&c[i]);
for (;m--;)
{
int A,B;
scanf("%lld%lld",&A,&B);
memset(f,-63,sizeof(f));
ans=0;
int lp=0,lb=0;
for ( int i=1;i<=n;i++ )
{
ans=max(B*a[i],f[c[i]]+A*a[i]);
if(c[i]!=lp) ans=max(ans,f[lp]+B*a[i]);
else ans=max(ans,f[lb]+B*a[i]);
if(ans>f[lp])
{
if(lp!=c[i]) lb=lp,lp=c[i];
else lp=c[i];
}
else
if(ans>f[lb]&&c[i]!=lp) lb=c[i];
f[c[i]]=max(f[c[i]],ans);
ret=max(ret,ans);
}
printf("%lld\n",ret);
ret=0;
}
return 0;
}
查看12道真题和解析