CodeForces 632 B.Alice, Bob, Two Teams(水~)

来源:互联网 发布:金石工程计价软件 编辑:程序博客网 时间:2024/06/11 15:59

Description
有n个物品,分为A和B两种,每个物品有一个价值pi,Bob可以把任意一个前缀或者后缀中所有A物品变成B物品,B物品变成A物品,之后Bob拿到所有B物品,问Bob能拿到的物品的最大价值
Input
第一行一整数n表示物品数量,之后n个整数pi表示第i个物品的价值,最后一个长度为n的字符串表示每个物品的种类(1<=n<=5e5,1<=pi<=1e9)
Output
输出Bob能拿到物品的最大价值
Sample Input
5
1 2 3 4 5
ABABA
Sample Output
11
Solution
分别维护A物品和B物品价值的前缀和和后缀和,pa[i]和pb[i]分别表示前i个物品中A和B物品的价值和,sa[i]和sb[i]分别表示第i个物品到第n个物品中A和B物品的价值和,那么ans=max(max(pa[i]+sb[i+1]),max(pb[i]+sa[i+1]))
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 555555int n,p[maxn];ll pa[maxn],pb[maxn],sa[maxn],sb[maxn];char s[maxn];int main(){    while(~scanf("%d",&n))    {        for(int i=1;i<=n;i++)scanf("%d",&p[i]);        scanf("%s",s+1);        pa[0]=p[0]=0;        for(int i=1;i<=n;i++)        {            pa[i]=pa[i-1],pb[i]=pb[i-1];            if(s[i]=='A')pa[i]+=p[i];            else pb[i]+=p[i];        }        sa[n+1]=sb[n+1]=0;        for(int i=n;i>=1;i--)        {            sa[i]=sa[i+1],sb[i]=sb[i+1];            if(s[i]=='A')sa[i]+=p[i];            else sb[i]+=p[i];        }        ll ans=pb[n];        for(int i=0;i<=n;i++)ans=max(ans,pa[i]+sb[i+1]);        for(int i=n;i>=1;i--)ans=max(ans,pb[i-1]+sa[i]);        printf("%I64d\n",ans);    }    return 0;}
0 0
原创粉丝点击