#include <bits/stdc++.h> #define f first #define s second #define LL long long #define ALL(V) V.begin(),V.end() #define boost ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define endl "\n" #define debug(x) cerr<<#x<<": "<<x<<endl using namespace std; const LL N=1e6+69, base=1024*1024,mod=1e9+7; string t[N]; int lenght[N], n; long long wynik; bool isBigger(int v) { if(t[v].size()>t[v-1].size()) return true; if(t[v].size()<t[v-1].size()) return false; for(int i = 0; i < (int)t[v].size(); i++) { if(t[v][i] > t[v-1][i]) return true; if(t[v][i] < t[v-1][i]) return false; } return false; } bool isSmaller(int v) { for(int i = 0; i < min((int)t[v].size(), (int)t[v-1].size()); i++) { if(t[v][i] < t[v-1][i]) return true; if(t[v][i] > t[v-1][i]) return false; } return false; } int por(int v,int dl) { //1 = wiekszy for(int i=0;i<dl;i++) { if(t[v][i] > t[v-1][i]) return 1; if(t[v][i] < t[v-1][i]) return -1; } return 0; } void addOne(int v) { for(int i=t[v].size()-1;i>=0;i--) { if(t[v][i]!='9') { t[v][i]++; return; } t[v][i]='0'; } } int32_t main(void) { boost; cin>>n; for(int i=1;i<=n;i++) { cin>>t[i]; lenght[i]=t[i].size(); } int akt=1; while(akt<n&&t[akt].size()<18) { akt++; if(isBigger(akt)) continue; int dl=t[akt].size(); while(t[akt].size()<t[akt-1].size()) t[akt].push_back('0'), wynik++; if(por(akt,dl)==1) continue; if(por(akt,dl)==-1) { wynik++; t[akt].push_back('0'); continue; } for(int i=dl;i<t[akt].size();i++) if(t[akt-1][i]!='9') { t[akt]=t[akt-1]; addOne(akt); break; } if(isBigger(akt)==false) t[akt].push_back('0'), wynik++; } lenght[akt]=t[akt].size(); while(akt<n) { akt++; wynik+=(lenght[akt-1]-lenght[akt]); lenght[akt]=lenght[akt-1]; if(t[akt-1].size()>t[akt].size() && por(akt,(int)t[akt].size())==0) t[akt]=t[akt-1]; if(isSmaller(akt) == true) wynik++, lenght[akt]++; } cout<<wynik<<endl; }
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 | #include <bits/stdc++.h> #define f first #define s second #define LL long long #define ALL(V) V.begin(),V.end() #define boost ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define endl "\n" #define debug(x) cerr<<#x<<": "<<x<<endl using namespace std; const LL N=1e6+69, base=1024*1024,mod=1e9+7; string t[N]; int lenght[N], n; long long wynik; bool isBigger(int v) { if(t[v].size()>t[v-1].size()) return true; if(t[v].size()<t[v-1].size()) return false; for(int i = 0; i < (int)t[v].size(); i++) { if(t[v][i] > t[v-1][i]) return true; if(t[v][i] < t[v-1][i]) return false; } return false; } bool isSmaller(int v) { for(int i = 0; i < min((int)t[v].size(), (int)t[v-1].size()); i++) { if(t[v][i] < t[v-1][i]) return true; if(t[v][i] > t[v-1][i]) return false; } return false; } int por(int v,int dl) { //1 = wiekszy for(int i=0;i<dl;i++) { if(t[v][i] > t[v-1][i]) return 1; if(t[v][i] < t[v-1][i]) return -1; } return 0; } void addOne(int v) { for(int i=t[v].size()-1;i>=0;i--) { if(t[v][i]!='9') { t[v][i]++; return; } t[v][i]='0'; } } int32_t main(void) { boost; cin>>n; for(int i=1;i<=n;i++) { cin>>t[i]; lenght[i]=t[i].size(); } int akt=1; while(akt<n&&t[akt].size()<18) { akt++; if(isBigger(akt)) continue; int dl=t[akt].size(); while(t[akt].size()<t[akt-1].size()) t[akt].push_back('0'), wynik++; if(por(akt,dl)==1) continue; if(por(akt,dl)==-1) { wynik++; t[akt].push_back('0'); continue; } for(int i=dl;i<t[akt].size();i++) if(t[akt-1][i]!='9') { t[akt]=t[akt-1]; addOne(akt); break; } if(isBigger(akt)==false) t[akt].push_back('0'), wynik++; } lenght[akt]=t[akt].size(); while(akt<n) { akt++; wynik+=(lenght[akt-1]-lenght[akt]); lenght[akt]=lenght[akt-1]; if(t[akt-1].size()>t[akt].size() && por(akt,(int)t[akt].size())==0) t[akt]=t[akt-1]; if(isSmaller(akt) == true) wynik++, lenght[akt]++; } cout<<wynik<<endl; } |