#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
ll n;
cin >> n;
vector<ll> segments(n + 1);
for (ll i = 0; i < n; i++)
{
cin >> segments[i];
}
n++;
segments[n - 1] = 0;
ll sum = 0;
for (ll i = 0; i < n; i++)
{
sum += segments[i];
}
vector<ll> divisors(n);
for (ll div = 1; div <= n; div++)
{
if (sum % div == 0)
{
divisors.push_back(div);
}
}
reverse(divisors.begin(), divisors.end());
for (ll div : divisors)
{
ll current_waves = 0;
queue<pair<ll, ll>> expire;
bool works = true;
for (ll s = 0; s < n; s++)
{
while (expire.size() > 0 && expire.front().first == s)
{
current_waves -= expire.front().second;
expire.pop();
}
if (current_waves > segments[s])
{
works = false;
break;
}
else if (current_waves < segments[s])
{
ll add_waves = segments[s] - current_waves;
current_waves += add_waves;
expire.push({s + div, add_waves});
}
}
if (works)
{
cout << div << endl;
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 60 61 62 63 64 65 | #include <bits/stdc++.h> using namespace std; using ll = long long; int main() { ios::sync_with_stdio(0); cin.tie(0); ll n; cin >> n; vector<ll> segments(n + 1); for (ll i = 0; i < n; i++) { cin >> segments[i]; } n++; segments[n - 1] = 0; ll sum = 0; for (ll i = 0; i < n; i++) { sum += segments[i]; } vector<ll> divisors(n); for (ll div = 1; div <= n; div++) { if (sum % div == 0) { divisors.push_back(div); } } reverse(divisors.begin(), divisors.end()); for (ll div : divisors) { ll current_waves = 0; queue<pair<ll, ll>> expire; bool works = true; for (ll s = 0; s < n; s++) { while (expire.size() > 0 && expire.front().first == s) { current_waves -= expire.front().second; expire.pop(); } if (current_waves > segments[s]) { works = false; break; } else if (current_waves < segments[s]) { ll add_waves = segments[s] - current_waves; current_waves += add_waves; expire.push({s + div, add_waves}); } } if (works) { cout << div << endl; return 0; } } } |
English