循环数组
计算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; }