#include <iostream>
#define LL long long
#define MAX_LENGTH 200100
using namespace std;
int main()
{
LL N, a, count = 0, num_len = 0, value_len, num_pos;
LL i, j, inc, last_incomplete_pos = 0, local_last_incomplete_pos = 0;
LL empty_start = -1, empty_stop = -1;
int num[MAX_LENGTH], value[20], pv, v;
short comp_status;
cin >> N;
for (i = 0; i < N; ++i) {
cin >> a;
value_len = 0;
while (a > 0) {
value[value_len++] = a % 10;
a /= 10;
}
if (value_len > num_len) {
num_len = 0;
while (value_len-- > 0) {
v = value[value_len];
if (v < 9)
last_incomplete_pos = num_len;
num[num_len++] = v;
}
inc = 0;
} else {
num_pos = 0;
comp_status = 0;
local_last_incomplete_pos = 0;
while (value_len-- > 0) {
if (num_pos >= empty_start && num_pos <= empty_stop) {
pv = 0;
} else {
pv = num[num_pos];
}
v = value[value_len];
if (comp_status == 0 && pv != v) {
if (pv > v) {
comp_status = -1;
} else {
comp_status = 1;
}
}
if (v < 9)
local_last_incomplete_pos = num_pos;
num[num_pos++] = v;
}
if (comp_status == 0 && last_incomplete_pos < num_pos) {
comp_status = -1;
}
if (comp_status == 0) {
if (empty_stop > -1) {
if (num_pos > empty_stop) {
empty_start = -1;
empty_stop = -1;
} else if (num_pos > empty_start) {
empty_start = num_pos;
}
}
++num[last_incomplete_pos];
if (last_incomplete_pos == num_len - 1) {
if (num[last_incomplete_pos] == 9) {
while (last_incomplete_pos-- > 0){
if (last_incomplete_pos >= empty_start && last_incomplete_pos <= empty_stop) {
num[last_incomplete_pos] = 0;
if (--empty_stop < empty_start) {
empty_start = -1;
empty_stop = -1;
}
break;
} else if (num[last_incomplete_pos] < 9)
break;
}
}
} else {
for (j = last_incomplete_pos + 1; j < num_len; j++)
num[j] = 0;
last_incomplete_pos = num_len - 1;
}
} else {
if (comp_status == -1)
num_len++;
if (num_pos < num_len) {
last_incomplete_pos = num_len - 1;
num[last_incomplete_pos] = 0;
if (num_pos + 1 < num_len) {
empty_start = num_pos;
empty_stop = last_incomplete_pos - 1;
} else {
empty_start = -1;
empty_stop = -1;
}
} else {
last_incomplete_pos = local_last_incomplete_pos;
empty_start = -1;
empty_stop = -1;
}
}
inc = num_len - num_pos;
}
count += inc;
}
cout << count << 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 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 | #include <iostream> #define LL long long #define MAX_LENGTH 200100 using namespace std; int main() { LL N, a, count = 0, num_len = 0, value_len, num_pos; LL i, j, inc, last_incomplete_pos = 0, local_last_incomplete_pos = 0; LL empty_start = -1, empty_stop = -1; int num[MAX_LENGTH], value[20], pv, v; short comp_status; cin >> N; for (i = 0; i < N; ++i) { cin >> a; value_len = 0; while (a > 0) { value[value_len++] = a % 10; a /= 10; } if (value_len > num_len) { num_len = 0; while (value_len-- > 0) { v = value[value_len]; if (v < 9) last_incomplete_pos = num_len; num[num_len++] = v; } inc = 0; } else { num_pos = 0; comp_status = 0; local_last_incomplete_pos = 0; while (value_len-- > 0) { if (num_pos >= empty_start && num_pos <= empty_stop) { pv = 0; } else { pv = num[num_pos]; } v = value[value_len]; if (comp_status == 0 && pv != v) { if (pv > v) { comp_status = -1; } else { comp_status = 1; } } if (v < 9) local_last_incomplete_pos = num_pos; num[num_pos++] = v; } if (comp_status == 0 && last_incomplete_pos < num_pos) { comp_status = -1; } if (comp_status == 0) { if (empty_stop > -1) { if (num_pos > empty_stop) { empty_start = -1; empty_stop = -1; } else if (num_pos > empty_start) { empty_start = num_pos; } } ++num[last_incomplete_pos]; if (last_incomplete_pos == num_len - 1) { if (num[last_incomplete_pos] == 9) { while (last_incomplete_pos-- > 0){ if (last_incomplete_pos >= empty_start && last_incomplete_pos <= empty_stop) { num[last_incomplete_pos] = 0; if (--empty_stop < empty_start) { empty_start = -1; empty_stop = -1; } break; } else if (num[last_incomplete_pos] < 9) break; } } } else { for (j = last_incomplete_pos + 1; j < num_len; j++) num[j] = 0; last_incomplete_pos = num_len - 1; } } else { if (comp_status == -1) num_len++; if (num_pos < num_len) { last_incomplete_pos = num_len - 1; num[last_incomplete_pos] = 0; if (num_pos + 1 < num_len) { empty_start = num_pos; empty_stop = last_incomplete_pos - 1; } else { empty_start = -1; empty_stop = -1; } } else { last_incomplete_pos = local_last_incomplete_pos; empty_start = -1; empty_stop = -1; } } inc = num_len - num_pos; } count += inc; } cout << count << endl; return 0; } |
English