#include <bits/stdc++.h> using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define REPD(i,a,b) for (int i = (a); i >= (b); --i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define fi first #define se second int len(int x) { if (x==0) return 1; int res = 0; while (x) { res++; x /= 10; } return res; } struct number { int val, mul, add; number(int a) { val = a; mul = add = 0; } long long pref() { long long res = val; int rmul = 0; while (rmul < mul && res < 1e17) { res *= 10; rmul++; } int radd = add; for (int i=rmul; i<mul && radd; i++) radd /= 10; res += radd; //printf("%d * 10^%d + %d -> %lld (%d %d)\n", val, mul, add, res, rmul, radd); return res; } }; bool isgreater(number a, number b) { int la = len(a.val) + a.mul, lb = len(b.val) + b.mul; if (la!=lb) return la>lb; ll pa = a.pref(), pb = b.pref(); if (pa!=pb) return pa>pb; return a.add>b.add; } bool isprefi(int x, long long y) { while (y > x) y/=10; return y==x; } bool ispref(int x, number y) { return isprefi(x, y.pref()); } string get_number(int prv, int le, int add, int pad=0) { string ret = to_string(prv); if (le>0) { ret += string(le-len(add), '0'); ret += to_string(add); } while (SZ(ret) < pad) ret = " " + ret; return ret; } int cmp_pref(int prv, int le, int add, int snd) { string sprv = to_string(prv), ssnd = to_string(snd); if (SZ(sprv) + le < SZ(ssnd)) return -1; int l2 = max(0, le - len(add)); if (SZ(sprv) + l2 < SZ(ssnd)) { sprv += string(l2, '0'); if (le>0) sprv += to_string(add); } else if (SZ(sprv) < SZ(ssnd)) { sprv += string(SZ(ssnd)-SZ(sprv), '0'); } FOR(i,SZ(ssnd)) if (sprv[i] != ssnd[i]) { if (sprv[i] < ssnd[i]) return -1; return 1; } return 0; } int n; int a[200200]; int main() { scanf("%d", &n); FOR(i,n) scanf("%d", &a[i]); //int prv_pref = a[0], prv_len = 0, prv_add = 0; number prv(a[0]); long long res = 0; for (int i = 1; i < n; i++) { number cur(a[i]); cur.mul = max(0, len(prv.val) + prv.mul - len(a[i])); if (!isgreater(cur, prv)) { number tcur(cur); tcur.val++; number tprv(prv); tprv.add++;//printf("b\n"); if (ispref(a[i], tprv) && isgreater(tcur, tprv)) { cur = prv; cur.add++; //printf("add\n"); } else { cur.mul++; } } //printf("current number is %d * 10^%d + %d\n", cur.val, cur.mul, cur.add); //printf("current number is %s (%s)\n", get_number(cur.val, cur.mul, cur.add, 30).c_str(), get_number(a[i], 0, 0, 10).c_str()); res += len(cur.val) + cur.mul - len(a[i]); prv = cur; } printf("%lld\n", res); 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 | #include <bits/stdc++.h> using namespace std; #define REP(i,a,b) for (int i = (a); i <= (b); ++i) #define REPD(i,a,b) for (int i = (a); i >= (b); --i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define fi first #define se second int len(int x) { if (x==0) return 1; int res = 0; while (x) { res++; x /= 10; } return res; } struct number { int val, mul, add; number(int a) { val = a; mul = add = 0; } long long pref() { long long res = val; int rmul = 0; while (rmul < mul && res < 1e17) { res *= 10; rmul++; } int radd = add; for (int i=rmul; i<mul && radd; i++) radd /= 10; res += radd; //printf("%d * 10^%d + %d -> %lld (%d %d)\n", val, mul, add, res, rmul, radd); return res; } }; bool isgreater(number a, number b) { int la = len(a.val) + a.mul, lb = len(b.val) + b.mul; if (la!=lb) return la>lb; ll pa = a.pref(), pb = b.pref(); if (pa!=pb) return pa>pb; return a.add>b.add; } bool isprefi(int x, long long y) { while (y > x) y/=10; return y==x; } bool ispref(int x, number y) { return isprefi(x, y.pref()); } string get_number(int prv, int le, int add, int pad=0) { string ret = to_string(prv); if (le>0) { ret += string(le-len(add), '0'); ret += to_string(add); } while (SZ(ret) < pad) ret = " " + ret; return ret; } int cmp_pref(int prv, int le, int add, int snd) { string sprv = to_string(prv), ssnd = to_string(snd); if (SZ(sprv) + le < SZ(ssnd)) return -1; int l2 = max(0, le - len(add)); if (SZ(sprv) + l2 < SZ(ssnd)) { sprv += string(l2, '0'); if (le>0) sprv += to_string(add); } else if (SZ(sprv) < SZ(ssnd)) { sprv += string(SZ(ssnd)-SZ(sprv), '0'); } FOR(i,SZ(ssnd)) if (sprv[i] != ssnd[i]) { if (sprv[i] < ssnd[i]) return -1; return 1; } return 0; } int n; int a[200200]; int main() { scanf("%d", &n); FOR(i,n) scanf("%d", &a[i]); //int prv_pref = a[0], prv_len = 0, prv_add = 0; number prv(a[0]); long long res = 0; for (int i = 1; i < n; i++) { number cur(a[i]); cur.mul = max(0, len(prv.val) + prv.mul - len(a[i])); if (!isgreater(cur, prv)) { number tcur(cur); tcur.val++; number tprv(prv); tprv.add++;//printf("b\n"); if (ispref(a[i], tprv) && isgreater(tcur, tprv)) { cur = prv; cur.add++; //printf("add\n"); } else { cur.mul++; } } //printf("current number is %d * 10^%d + %d\n", cur.val, cur.mul, cur.add); //printf("current number is %s (%s)\n", get_number(cur.val, cur.mul, cur.add, 30).c_str(), get_number(a[i], 0, 0, 10).c_str()); res += len(cur.val) + cur.mul - len(a[i]); prv = cur; } printf("%lld\n", res); return 0; } |