#define FOR(i,a,b) for(int i=(int)(a); i<(int)(b); ++i)
#define ulli unsigned long long int
#include <vector>
#include <cstdio>
using namespace std;
int n;
vector<int> P;
vector<int> sub;
bool test_length(int L) {
FOR(i,0,sub.size()) sub[i] = 0;
int currently_open = 0;
FOR(i,0,P.size()) {
currently_open -= sub[i];
if (currently_open < 0) return false;
if (currently_open > P[i]) return false;
int missing = P[i] - currently_open;
currently_open += missing;
if (missing>0) {
if (i+L>=(int)sub.size()) return false;
sub[i+L] += missing;
}
}
if (currently_open!=0) return false;
return true;
}
int main() {
// Read input
scanf("%d", &n);
FOR(i,0,n) {
int a; scanf("%d", &a);
if (a==0 && P.empty()) continue;
if (i>0 && a==0 && P.back()==0) continue;
P.push_back(a);
}
while (!P.empty() && P.back()==0) P.pop_back();
P.push_back(0);
sub.resize(P.size());
// Calculate
int result = 1;
vector<bool> lengths(P.size()+1, true);
lengths[0] = false;
FOR(L,2,lengths.size()) {
if (!lengths[L]) continue;
lengths[L] = test_length(L);
if (!lengths[L]) {
for(int iL=L; iL<(int)lengths.size(); iL+=L) lengths[iL] = false;
} else {
result = L;
}
}
printf("%d\n", result);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #define FOR(i,a,b) for(int i=(int)(a); i<(int)(b); ++i) #define ulli unsigned long long int #include <vector> #include <cstdio> using namespace std; int n; vector<int> P; vector<int> sub; bool test_length(int L) { FOR(i,0,sub.size()) sub[i] = 0; int currently_open = 0; FOR(i,0,P.size()) { currently_open -= sub[i]; if (currently_open < 0) return false; if (currently_open > P[i]) return false; int missing = P[i] - currently_open; currently_open += missing; if (missing>0) { if (i+L>=(int)sub.size()) return false; sub[i+L] += missing; } } if (currently_open!=0) return false; return true; } int main() { // Read input scanf("%d", &n); FOR(i,0,n) { int a; scanf("%d", &a); if (a==0 && P.empty()) continue; if (i>0 && a==0 && P.back()==0) continue; P.push_back(a); } while (!P.empty() && P.back()==0) P.pop_back(); P.push_back(0); sub.resize(P.size()); // Calculate int result = 1; vector<bool> lengths(P.size()+1, true); lengths[0] = false; FOR(L,2,lengths.size()) { if (!lengths[L]) continue; lengths[L] = test_length(L); if (!lengths[L]) { for(int iL=L; iL<(int)lengths.size(); iL+=L) lengths[iL] = false; } else { result = L; } } printf("%d\n", result); return 0; } |
English