#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MX = 2e5+9;
int tab[MX], delta[MX];
vector<pair<int, int>>seg;
unordered_map<int, int>umap;
signed main(){
cin.tie(0)->sync_with_stdio(0);
int n; cin >> n;
int l = 0;
for(auto i = 1; i <= n; ++i){
int x; cin >> x;
tab[i] = x;
if(x && !l) l = i;
if(!x && l){
seg.emplace_back(l, i);
l = 0;
}
}
if(l) seg.emplace_back(l, n+1);
for(auto [l, r] : seg){
int len = r-l+1, sum = 0;
set<int>fac;
for(auto i = l; i <= r; ++i) sum += tab[i];
for(auto i = 1; (i*i <= sum && i <= len); ++i){
if(sum%i) continue;
int j = sum/i;
fac.insert(i);
if(j <= len) fac.insert(j);
}
for(auto k : fac){
// cout << k << endl;
bool b = 1;
int cur = 0;
for(auto i = l; i < r; ++i){
cur -= delta[i];
int need = tab[i]-cur;
if(need < 0){
b = 0;
break;
}
if(need > 0 && i+k > r){
b = 0;
break;
}
delta[i+k] = need;
cur = tab[i];
}
for(auto i = l; i <= r; ++i){
delta[i] = 0;
}
umap[k] += b;
}
}
int res = 0;
for(auto [i, val] : umap){
if(val == seg.size()) res = max(res, i);
// cout << i << " " << val << " " << seg.size() << endl;
}
cout << res;
}
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 60 61 62 63 | #include <bits/stdc++.h> #define int long long using namespace std; const int MX = 2e5+9; int tab[MX], delta[MX]; vector<pair<int, int>>seg; unordered_map<int, int>umap; signed main(){ cin.tie(0)->sync_with_stdio(0); int n; cin >> n; int l = 0; for(auto i = 1; i <= n; ++i){ int x; cin >> x; tab[i] = x; if(x && !l) l = i; if(!x && l){ seg.emplace_back(l, i); l = 0; } } if(l) seg.emplace_back(l, n+1); for(auto [l, r] : seg){ int len = r-l+1, sum = 0; set<int>fac; for(auto i = l; i <= r; ++i) sum += tab[i]; for(auto i = 1; (i*i <= sum && i <= len); ++i){ if(sum%i) continue; int j = sum/i; fac.insert(i); if(j <= len) fac.insert(j); } for(auto k : fac){ // cout << k << endl; bool b = 1; int cur = 0; for(auto i = l; i < r; ++i){ cur -= delta[i]; int need = tab[i]-cur; if(need < 0){ b = 0; break; } if(need > 0 && i+k > r){ b = 0; break; } delta[i+k] = need; cur = tab[i]; } for(auto i = l; i <= r; ++i){ delta[i] = 0; } umap[k] += b; } } int res = 0; for(auto [i, val] : umap){ if(val == seg.size()) res = max(res, i); // cout << i << " " << val << " " << seg.size() << endl; } cout << res; } |
English