#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;
const int C=200001;
typedef long long ll;
int n, i, x, nz[C], val[C], rwr[C][11], k, cw[11], len[C];
ll tab[C], wynn=0;
int lenn(int a){
int s=0;
if (a==0) return 1;
for (;a>0;a/=10) s++;
return s;
}
void rewrite(int p){
int i=0, j, a=tab[p], k, l;
for (;a>0;a/=10) cw[i]=a%10, i++;
if (i==0) i=1;
for (j=0;j<i;j++) rwr[p][j]=cw[i-j-1];
k=lenn(val[p]);
l=j;
for (;j-l<nz[p]-k&&j<11;j++) rwr[p][j]=0;
l=j, a=val[p], i=0;
for (;a>0;a/=10) cw[i]=a%10, i++;
for (;j<11&&j-l<i;j++){
rwr[p][j]=cw[i-j+l-1];
}
}
int comp(int p1, int a){
int i=0, j;
for (;a>0;a/=10) cw[i]=a%10, i++;
for (j=0;j<i;j++){
if (cw[i-j-1]>rwr[p1][j]) return 2;
if (cw[i-j-1]<rwr[p1][j]) return 0;
}
return 1;
}
void add(int p, ll x){
ll gg, lk;
int j, i, z=len[p]-nz[p], c1;
if (lenn(tab[p])>len[p]-nz[p]){
if (nz[p]-lenn(tab[p])>0){
if (lenn(val[p]+1)<nz[p]-lenn(tab[p])){
val[p]++;
return;
}
}
gg=tab[p], lk=tab[p]+1;
if (lenn(lk)!=lenn(gg)) {
nz[p]++, val[p]=0, len[p]++, tab[p]=x;
return;
}
c1=lenn(gg);
for (;gg>0,lk>10;gg/=10,lk/=10) {
if (gg%10!=lk%10&&c1<=z){
nz[p]++, val[p]=0, len[p]++, tab[p]=x;
break;
}
c1--;
}
tab[p]++;
}
else {
val[p]++;
if (lenn(val[p])>nz[p]) val[p]=0, nz[p]++;
}
}
int main(){
int j;
ll pure;
cin>>n;
for (i=0;i<n;i++){
cin>>tab[i];
if (i==0) {
nz[i]=0, len[i]=lenn(tab[i]), val[i]=0;
rewrite(i);
continue;
}
k=lenn(tab[i]);
x=comp(i-1, tab[i]);
if (x==0) val[i]=0, nz[i]=max(len[i-1]-k+1, 0), len[i]=k+nz[i];
else if (x==1) {
pure=tab[i], nz[i]=max(len[i-1]-lenn(tab[i]), 0), tab[i]=tab[i-1], val[i]=val[i-1], len[i]=len[i-1];
add(i, pure);
}
else val[i]=0, nz[i]=max(len[i-1]-k, 0), len[i]=k+nz[i];
//printf ("%d %d %d\n", nz[i], len[i], val[i]);
rewrite(i);
//for (j=0;j<11;j++) printf ("%d", rwr[i][j]);
//printf ("\n");
wynn+=nz[i];
}
cout<<wynn;
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 | #include <stdio.h> #include <vector> #include <iostream> using namespace std; const int C=200001; typedef long long ll; int n, i, x, nz[C], val[C], rwr[C][11], k, cw[11], len[C]; ll tab[C], wynn=0; int lenn(int a){ int s=0; if (a==0) return 1; for (;a>0;a/=10) s++; return s; } void rewrite(int p){ int i=0, j, a=tab[p], k, l; for (;a>0;a/=10) cw[i]=a%10, i++; if (i==0) i=1; for (j=0;j<i;j++) rwr[p][j]=cw[i-j-1]; k=lenn(val[p]); l=j; for (;j-l<nz[p]-k&&j<11;j++) rwr[p][j]=0; l=j, a=val[p], i=0; for (;a>0;a/=10) cw[i]=a%10, i++; for (;j<11&&j-l<i;j++){ rwr[p][j]=cw[i-j+l-1]; } } int comp(int p1, int a){ int i=0, j; for (;a>0;a/=10) cw[i]=a%10, i++; for (j=0;j<i;j++){ if (cw[i-j-1]>rwr[p1][j]) return 2; if (cw[i-j-1]<rwr[p1][j]) return 0; } return 1; } void add(int p, ll x){ ll gg, lk; int j, i, z=len[p]-nz[p], c1; if (lenn(tab[p])>len[p]-nz[p]){ if (nz[p]-lenn(tab[p])>0){ if (lenn(val[p]+1)<nz[p]-lenn(tab[p])){ val[p]++; return; } } gg=tab[p], lk=tab[p]+1; if (lenn(lk)!=lenn(gg)) { nz[p]++, val[p]=0, len[p]++, tab[p]=x; return; } c1=lenn(gg); for (;gg>0,lk>10;gg/=10,lk/=10) { if (gg%10!=lk%10&&c1<=z){ nz[p]++, val[p]=0, len[p]++, tab[p]=x; break; } c1--; } tab[p]++; } else { val[p]++; if (lenn(val[p])>nz[p]) val[p]=0, nz[p]++; } } int main(){ int j; ll pure; cin>>n; for (i=0;i<n;i++){ cin>>tab[i]; if (i==0) { nz[i]=0, len[i]=lenn(tab[i]), val[i]=0; rewrite(i); continue; } k=lenn(tab[i]); x=comp(i-1, tab[i]); if (x==0) val[i]=0, nz[i]=max(len[i-1]-k+1, 0), len[i]=k+nz[i]; else if (x==1) { pure=tab[i], nz[i]=max(len[i-1]-lenn(tab[i]), 0), tab[i]=tab[i-1], val[i]=val[i-1], len[i]=len[i-1]; add(i, pure); } else val[i]=0, nz[i]=max(len[i-1]-k, 0), len[i]=k+nz[i]; //printf ("%d %d %d\n", nz[i], len[i], val[i]); rewrite(i); //for (j=0;j<11;j++) printf ("%d", rwr[i][j]); //printf ("\n"); wynn+=nz[i]; } cout<<wynn; return 0;} |
English