题解:P12708 [KOI 2021 Round 1] 分割

· · 题解

蒟蒻的第一篇题解OvO,求过QWQ。

题意简述

核心分析

优化思路

提示

代码呈现

#include<bits/stdc++.h>  
using namespace std;
#define int long long   
int n,cnt,sum;//n:数列长度/cnt:数列总和/sum:当前前缀和
int cnt1,cnt2,ans;//cnt1:前缀和等于t的次数/cnt2:前缀和等于2t的累计组合数/ans:最终答案
signed main(){          
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n;              
    vector<int> a(n);    
    for(int i=0;i<n;i++){
        cin>>a[i];      
    }
    for(int i:a){// 计算数列总和
        cnt+=i;
    }
    if(cnt%4!=0){//核心:总和无法被4整除,直接输出0
        cout<<"0";
        return 0;
    }
    int t=cnt/4;//每段需要满足的目标和         
    for(int i=0;i<n-1;i++){//遍历到n-1(保证第四段至少有一个数)
        sum+=a[i];// 累加当前元素,更新前缀和
        if(sum==3*t){// 找到第三个分割点:累加前两个分割点组合数
            ans+=cnt2;
        }
        if(sum==2*t){//找到第二个分割点:累加第一个分割点
            cnt2+=cnt1;
        }
        if(sum==t){//找到第一个分割点:计数+1
            cnt1++;
        }
    }
    cout<<ans;
    return 0;
}

总复杂度:O(n)

作者太蒻了,就这还WA了2发才过。

完结撒花!求关OvO。