您的位置:首页 > 其它

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

2017-04-27 11:45 295 查看
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 555555
int 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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: