WA*3 求调,用的是类似前缀和的思想
查看原帖
WA*3 求调,用的是类似前缀和的思想
780737
SocialPanda楼主2024/3/25 00:12
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>
#define int long long
//#define LL long long
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define endl "\n"
#define VI vector<int>
#define PII pair<int,int>
#define Gheap priority_queue<int,vector<int>,greater<int>>
#define Lheap priority_queue<int>
#define MAXN 0x3f3f3f3f
#define MINN -0x3f3f3f3f
using namespace std;
//const int N=1e6+100,M=2*N;
//int e[N],w[M],h[M],ne[M],idx;
const int N=2e5+100;
int a[N];
vector<int> b;
int hz[N];
int qz[N];

void solve()
{
    int n;
    cin>>n;
    string s;
    cin>>s;s=' '+s;
    for(int i=1;i<=n;i++) cin>>a[i];

    for(int i=1;i<n;i++)
    {
        if(s[i]==s[i+1])
        {
            b.eb(i);
        }
    }

    for(int i=1;i<=n;i++) qz[i]=qz[i-1]+a[i];
    for(int i=n;i>=1;i--) hz[i]=hz[i+1]+a[i];

    int qzs=0,qzd=0,hzs=0,hzd=0;

    vector<int> c(b.size());

    for(int i=0;i<b.size();i++)
    {
        if(i%2==0)
        {
            qzs+=qz[b[i]]-(qzd+qzs);
            c[i]+=qzd;
        }
        else
        {
            qzd+=qz[b[i]]-(qzd+qzs);
            c[i]+=qzs;
        }
    }

    for(int i=b.size()-1;i>=0;i--)
    {
        if((b.size()-i)%2==0)
        {
            hzs+=hz[b[i]+1]-(hzs+hzd);
            c[i]+=hzd;
        }
        else
        {
            hzd+=hz[b[i]+1]-(hzs+hzd);
            c[i]+=hzs;
        }
    }
    int ans=1e18;
    //for(auto z:c) cout<<z<<' ';
    //cout<<endl;
    for(auto z:c) ans=min(ans,z);
    if(b.size()) cout<<ans<<endl;
    else cout<<0<<endl;
}

signed main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    //cin >> t;
    while(t--) solve();
}
2024/3/25 00:12
加载中...