Codeforces Round #162 (Div. 1) C Choosing Balls dp

来源:互联网 发布:数据复制 编辑:程序博客网 时间:2024/05/21 13:54
//dp[i] 表示以颜色为i结尾的最大值
//dp[i] = max(dp[i] , dp[i] + a*v[i] ,other_max + b*v[i]) ;
//为除颜色i以外的其它颜色的最大值
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 100010 ;
const __int64 inf = 0x7fffffffffffffff;
__int64 dp[maxn] ;
__int64 c[maxn] ;
__int64 v[maxn] ;
int main()
{
   // freopen("input.txt","r" ,stdin) ;
    int n , q;
    while(~scanf("%d%d" ,&n ,&q))
    {
        for(int i = 1;i <= n;i++)
        scanf("%I64d" ,&v[i]) ;
        for(int i = 1;i <= n;i++)
        scanf("%I64d" ,&c[i]) ;
        while(q--)
        {
            for(int i = 1;i <= n;i++)
            dp[i] = -inf;
            __int64 a,b;
            scanf("%I64d%I64d"  ,&a ,&b) ;
            __int64 ma  = 0, ma_s  = 0, ma_c = 0;
            for(int i = 1;i <= n;i++)
            {
                __int64 temp_b;
                __int64 temp_a;
                if(dp[c[i]] == -inf)
                temp_a = b*v[i];
                else
                temp_a = a*v[i] + dp[c[i]] ;
                if(ma_c == c[i])
                {
                    temp_b = b*v[i] + ma_s;
                    dp[c[i]] = max(max(dp[c[i]] , temp_b) ,temp_a) ;
                    ma = max(ma , dp[c[i]]);
                }
                else
                {
                     temp_b = b*v[i] + ma;
                     dp[c[i]] = max(max(dp[c[i]] , temp_b),temp_a);
                     if(dp[c[i]] >= ma)
                     {
                         ma_s = ma;
                         ma_c = c[i] ;
                         ma = dp[c[i]] ;
                     }
                     else ma_s = max(ma_s , dp[c[i]]);
                }
            }
            printf("%I64d\n" , ma) ;
        }
    }
    return  0;
}





























































0 0