循环数组

计算a[i]的前缀和s[i],计算l[i]为1~i-1中最小的s值,r[i]为i~n中最大的s值。

则a[i]~a[n]满足性质的条件为r[i]-s[i-1]>0,a[1]~a[i-1]满足性质的条件为l[i]+s[n]-s[i-1]>0

#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<functional>
#include<math.h>
//#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef queue<int> QI;


void makedata() {
    freopen("input.txt", "w", stdout);
    fclose(stdout);
}

lint a[110000], s[110000], l[110000], r[110000];

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    //makedata();
    std::ios::sync_with_stdio(0), cin.tie(0);
    int n;
    cin >> n;

    for(int i = 1; i <= n; i++) cin >> a[i];

    s[1] = a[1];

    for(int i = 2; i <= n; i++) s[i] = s[i - 1] + a[i];

    l[1] = 0, l[2] = s[1];

    for(int i = 3; i <= n; i++) l[i] = min(l[i - 1], s[i - 1]);

    r[n] = s[n];

    for(int i = n - 1; i >= 1; i--) r[i] = min(s[i], r[i + 1]);

    for(int i = 1; i <= n; i++) {
        if((r[i] - s[i - 1] > 0) && (s[n] - s[i - 1] + l[i] > 0)) {
            cout << i << endl;
            return 0;
        }
    }

    cout << -1 << endl;
    return 0;
}
View Code

相关文章: