1 条题解

  • 0
    @ 2025-3-30 14:33:22

    对于20%的数据,可以考虑枚举两个区间,利用前缀和计算区间和,复杂度 O(n4)O(n^4)

    明显需要 O(n2log)\le O(n^2 log) 的复杂度,考虑枚举一个区间,二分查找和该区间和最匹配的数据。

    \begin{lstlisting}
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 1e3 + 5, INF = 0x3f3f3f3f, MOD = 1E9 + 7;
    ll n,a[N*N/2],s[N];
    
    void solve1(){
        ll ans=1e12;
       for(int l1=1; l1<n; l1++)
         for(int r1=l1; r1<n; r1++)
           for(int l2=r1+1; l2<=n; l2++)
             for(int r2=l2; r2<=n; r2++)
                ans = min(ans, abs(s[r2] - s[l2-1] - (s[r1] - s[l1-1])) );
        cout<<ans<<endl;
    }
    void solve2(){
        ll ans=1e12;
        set<ll> st;st.insert(1e12), st.insert(-1e12);
        for(int l=1; l<=n; l++){
            for(int i=1; i<l; i++) st.insert( s[l-1] - s[i-1] ); // [i, l-1]
            for(int r=l; r<=n; r++){
                ll sum = s[r] - s[l-1];
                auto it = st.lower_bound(sum);
                ans = min(ans, *it - sum);
                --it;
                ans = min(ans, sum - *it);
            }
        }
        cout<<ans<<endl;
    }
    int main(){
        cin>>n;
        for(int i=1; i<=n; i++) {
            cin>>a[i];
            s[i] = s[i-1] +a[i];
        }
        solve2();
    }
    
    • 1

    信息

    ID
    2021
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    18
    已通过
    2
    上传者