题解 | 喜欢切数组的红

喜欢切数组的红

https://www.nowcoder.com/practice/74cb703f25dc4956acb3b08028a1f4b4

// 前缀和,后缀和,前缀数和,前缀正数个数和,后缀正数个数和,unordered_map,记录<后缀和,下标>
// 会卡总和不是 3 的倍数的优化
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int N=2e5+6;
long long qsum[N];
unordered_multimap<int,int> unmp;
int n;
int arr[N],qzs[N],hzs[N];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>arr[i];
        qsum[i]=qsum[i-1]+arr[i];
        if(arr[i]>0) qzs[i]=qzs[i-1]+1;
        else qzs[i]=qzs[i-1];
    }
    int sum=0;
    for(int i=n;i>=1;i--){
        sum+=arr[i];
        if(arr[i]>0) hzs[i]=hzs[i+1]+1;
        else hzs[i]=hzs[i+1];
        if(hzs[i]>0) unmp.insert({sum,i});
        
    }
    if(sum%3!=0){
        cout<<0;
        return 0;
    }
    int ans=0,zs_sum=qzs[n];
    // cout<<qzs[n]<<" "<<hzs[1]<<endl;
    for(int i=1;i<=n;i++){
        if(qzs[i]<1 || qsum[i]*3!=sum) continue;
        int x=qsum[i];
        if(unmp.count(x)>0 && sum-x-x==x){
            auto p=unmp.find(x);
            for(int j=0;j<unmp.count(x);j++){
                int idx=p->second;
                if(zs_sum-qzs[i]-hzs[idx]>0 && 
                qzs[i]>0 && idx-i>1) ans++;
                p++;
            }
        }
    }
    cout<<ans;

    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务