#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>
#include <unordered_map>
#include <set>
using namespace std;
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int D=0;
long long n;
cin>>n;
vector<int> f(n);
vector<int> forg(n);
vector<int> ujemneFale(n+1);
int tmp;
long long sum=0;
for(int i=0;i<n;i++){
cin>>f[i];
forg[i]=f[i];
sum = sum + f[i];
ujemneFale[i]=0;
}
if (n==1 && f[0]>0) {cout<<"1";return 0;}
if (n==1 ) {cout<<"0";return 0;}
int prev=0;
int max=1000000000;
/*
prev=0;
int startWzrost=-1;
for(int i=0;i<n;i++){
if (f[i]>0 && startWzrost==-1) {startWzrost=i;}
if (prev>f[i]){
max = i-startWzrost;
//if (D) cout<<"max "<<max<<" "<<i<<" "<<startWzrost<<endl;
break;
}
prev = f[i];
}
prev=0;
startWzrost=-1;
for(int i=n-1;i>-1;i--){
if (f[i]>0 && startWzrost==-1) startWzrost=i;
if (prev>f[i]){
if (max>startWzrost-i) max = startWzrost-i;
//if (D) cout<<"max A "<<max<<" "<<i<<" "<<startWzrost<<endl;
break;
}
prev=f[i];
}
prev=0;
int minimalnaIloscFal=0;
for(int i=0;i<n;i++){
if (f[i]>prev) minimalnaIloscFal = minimalnaIloscFal + f[i]-prev;
prev = f[i];
}
if(D)cout<<"minIloscFal "<<minimalnaIloscFal<<endl;
if (max>(sum/minimalnaIloscFal)) max=sum/minimalnaIloscFal;
*/
if (max>n) max =n;
vector<int> dlfal;
for(int i=max;i>0;i--){
if (sum%i==0)dlfal.push_back(i);
}
if (D){ for (auto i:dlfal) cout<<i<<" "; cout<<endl;}
int fala;
int isOK=1;
int j=0;
/*
{
for(auto i:dlfal){
if (1 or n%i==0){
fala = i;
if (D) cout<<"fala = "<<fala<<endl;
isOK=1;
j=0;
for (j=0;j<n-fala+1;j++){
if (f[j]<0){ isOK=0;break;}
while (f[j]>0){
//if (D) cout<<"fala = "<<fala<<" analizuje j "<<j<<" "<<f[j]<<endl;
for (int jj=0;jj<fala;jj++){
//if (D) cout<<jj<<" jj fala = "<<fala<<" analizuje j "<<j<<" "<<f[j]<<endl;
--f[j+jj];
//if (D) cout<<f[j+jj]<<endl;
if (f[j+jj]<0){ isOK=0;break;}
if (D){
//for(int i=0;i<n;i++)cout<<f[i]<<" ";
//cout<<endl;
} }
if (isOK==0) break;
}
if (j>0) f[j-1]=forg[j-1];
if (isOK==0) break;
}
if (j>0) j--;
while(j<n) {if(f[j]>0) isOK=0; f[j]=forg[j];j++;};
if (isOK ){
cout<<fala;
break;
}
if (D){
//for(int i=0;i<n;i++)cout<<f[i]<<" ";
//cout<<endl;
}
}
}
}
cout<<endl;
*/
{
int aktFali=0;
for(auto i:dlfal){
if (1 or n%i==0){
fala = i;
// if (D) cout<<"fala = "<<fala<<endl;
isOK=1;
j=0;
aktFali=0;
for (j=0;j<n-fala+1;j++){
aktFali = aktFali - ujemneFale[j];
// if (D) cout<<"fala = "<<fala<<" analizuje j "<<j<<" "<<f[j]<<" "<<aktFali<<endl;
// if (D){
// for(int i=0;i<n;i++)cout<<f[i]<<" ";
// cout<<endl;
// for(int i=0;i<n;i++)cout<<ujemneFale[i]<<" ";
// cout<<endl;
// }
if (f[j]>aktFali){
// if (D) cout<<"zwiekszam o "<<f[j]-aktFali<<" na pozycji "<<j+fala<<" f[j] "<<f[j]<<" "<<aktFali<<endl;
ujemneFale[j+fala]=ujemneFale[j+fala]+f[j]-aktFali;
aktFali = f[j];
}
{f[j]=forg[j] ;ujemneFale[j]=0;}
if (f[j]<aktFali){
isOK=0;
j++;
break;
}
}
while(j<n) {
// if (D) cout<<aktFali<<" "<<ujemneFale[j]<<" "<<f[j]<<" j= "<<j<<endl;
// if (D){
// for(int i=0;i<n;i++)cout<<f[i]<<" ";
// cout<<endl;
// for(int i=0;i<n;i++)cout<<ujemneFale[i]<<" ";
// cout<<endl;
// }
aktFali = aktFali - ujemneFale[j]; if(f[j]-aktFali!=0) isOK=0; f[j]=forg[j];ujemneFale[j]=0; j++; };
if (aktFali-ujemneFale[n]!=0) isOK=0;
ujemneFale[n]=0;
if (isOK ){
cout<<fala;
break;
}
}
}
/*
if (D){
cout<<endl;
for(int i=0;i<n;i++)cout<<f[i]<<" ";
cout<<endl;
for(int i=0;i<n;i++)cout<<ujemneFale[i]<<" ";
cout<<endl;
}
*/
}
/*
cout<<endl;
//--------------------
{
int wynik=1;
prev=0;
int g=0;
for(int i=0;i<n;i++){
if (prev==f[i]){
g++;
//cout<<"up "<<i+1<<endl;
wynik++;
} else if(prev>f[i]){
g--;
//cout<<"down << "<<i+1<<endl;
//wynik--;
}
prev=f[i];
}
cout<<wynik;
}
*/
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 | #include <algorithm> #include <iostream> #include <vector> #include <numeric> #include <unordered_map> #include <set> using namespace std; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int D=0; long long n; cin>>n; vector<int> f(n); vector<int> forg(n); vector<int> ujemneFale(n+1); int tmp; long long sum=0; for(int i=0;i<n;i++){ cin>>f[i]; forg[i]=f[i]; sum = sum + f[i]; ujemneFale[i]=0; } if (n==1 && f[0]>0) {cout<<"1";return 0;} if (n==1 ) {cout<<"0";return 0;} int prev=0; int max=1000000000; /* prev=0; int startWzrost=-1; for(int i=0;i<n;i++){ if (f[i]>0 && startWzrost==-1) {startWzrost=i;} if (prev>f[i]){ max = i-startWzrost; //if (D) cout<<"max "<<max<<" "<<i<<" "<<startWzrost<<endl; break; } prev = f[i]; } prev=0; startWzrost=-1; for(int i=n-1;i>-1;i--){ if (f[i]>0 && startWzrost==-1) startWzrost=i; if (prev>f[i]){ if (max>startWzrost-i) max = startWzrost-i; //if (D) cout<<"max A "<<max<<" "<<i<<" "<<startWzrost<<endl; break; } prev=f[i]; } prev=0; int minimalnaIloscFal=0; for(int i=0;i<n;i++){ if (f[i]>prev) minimalnaIloscFal = minimalnaIloscFal + f[i]-prev; prev = f[i]; } if(D)cout<<"minIloscFal "<<minimalnaIloscFal<<endl; if (max>(sum/minimalnaIloscFal)) max=sum/minimalnaIloscFal; */ if (max>n) max =n; vector<int> dlfal; for(int i=max;i>0;i--){ if (sum%i==0)dlfal.push_back(i); } if (D){ for (auto i:dlfal) cout<<i<<" "; cout<<endl;} int fala; int isOK=1; int j=0; /* { for(auto i:dlfal){ if (1 or n%i==0){ fala = i; if (D) cout<<"fala = "<<fala<<endl; isOK=1; j=0; for (j=0;j<n-fala+1;j++){ if (f[j]<0){ isOK=0;break;} while (f[j]>0){ //if (D) cout<<"fala = "<<fala<<" analizuje j "<<j<<" "<<f[j]<<endl; for (int jj=0;jj<fala;jj++){ //if (D) cout<<jj<<" jj fala = "<<fala<<" analizuje j "<<j<<" "<<f[j]<<endl; --f[j+jj]; //if (D) cout<<f[j+jj]<<endl; if (f[j+jj]<0){ isOK=0;break;} if (D){ //for(int i=0;i<n;i++)cout<<f[i]<<" "; //cout<<endl; } } if (isOK==0) break; } if (j>0) f[j-1]=forg[j-1]; if (isOK==0) break; } if (j>0) j--; while(j<n) {if(f[j]>0) isOK=0; f[j]=forg[j];j++;}; if (isOK ){ cout<<fala; break; } if (D){ //for(int i=0;i<n;i++)cout<<f[i]<<" "; //cout<<endl; } } } } cout<<endl; */ { int aktFali=0; for(auto i:dlfal){ if (1 or n%i==0){ fala = i; // if (D) cout<<"fala = "<<fala<<endl; isOK=1; j=0; aktFali=0; for (j=0;j<n-fala+1;j++){ aktFali = aktFali - ujemneFale[j]; // if (D) cout<<"fala = "<<fala<<" analizuje j "<<j<<" "<<f[j]<<" "<<aktFali<<endl; // if (D){ // for(int i=0;i<n;i++)cout<<f[i]<<" "; // cout<<endl; // for(int i=0;i<n;i++)cout<<ujemneFale[i]<<" "; // cout<<endl; // } if (f[j]>aktFali){ // if (D) cout<<"zwiekszam o "<<f[j]-aktFali<<" na pozycji "<<j+fala<<" f[j] "<<f[j]<<" "<<aktFali<<endl; ujemneFale[j+fala]=ujemneFale[j+fala]+f[j]-aktFali; aktFali = f[j]; } {f[j]=forg[j] ;ujemneFale[j]=0;} if (f[j]<aktFali){ isOK=0; j++; break; } } while(j<n) { // if (D) cout<<aktFali<<" "<<ujemneFale[j]<<" "<<f[j]<<" j= "<<j<<endl; // if (D){ // for(int i=0;i<n;i++)cout<<f[i]<<" "; // cout<<endl; // for(int i=0;i<n;i++)cout<<ujemneFale[i]<<" "; // cout<<endl; // } aktFali = aktFali - ujemneFale[j]; if(f[j]-aktFali!=0) isOK=0; f[j]=forg[j];ujemneFale[j]=0; j++; }; if (aktFali-ujemneFale[n]!=0) isOK=0; ujemneFale[n]=0; if (isOK ){ cout<<fala; break; } } } /* if (D){ cout<<endl; for(int i=0;i<n;i++)cout<<f[i]<<" "; cout<<endl; for(int i=0;i<n;i++)cout<<ujemneFale[i]<<" "; cout<<endl; } */ } /* cout<<endl; //-------------------- { int wynik=1; prev=0; int g=0; for(int i=0;i<n;i++){ if (prev==f[i]){ g++; //cout<<"up "<<i+1<<endl; wynik++; } else if(prev>f[i]){ g--; //cout<<"down << "<<i+1<<endl; //wynik--; } prev=f[i]; } cout<<wynik; } */ return 0; } |
English