#include <bits/stdc++.h> using namespace std; int main() { #ifdef wxh010910 freopen("input.txt", "r", stdin); #endif int n; scanf("%d", &n); vector<int> prefix, suffix; long long answer = 0; int length = 0; for (int i = 0; i < n; ++i) { int x; scanf("%d", &x); vector<int> digits; while (x) { digits.push_back(x % 10); x /= 10; } reverse(digits.begin(), digits.end()); if (length < digits.size()) { length = digits.size(); prefix = digits; suffix.clear(); } else { int type = 0; for (int i = 0; i < digits.size(); ++i) { if (i < prefix.size()) { if (prefix[i] != digits[i]) { if (prefix[i] < digits[i]) { type = 1; } else { type = -1; } break; } } else if (i >= length - suffix.size()) { if (suffix[length - i - 1] != digits[i]) { if (suffix[length - i - 1] < digits[i]) { type = 1; } else { type = -1; } break; } } else if (digits[i]) { type = 1; break; } } if (type == 1) { prefix = digits; suffix.clear(); answer += length - digits.size(); } else if (type == 0) { bool already = false; for (int i = length - 1; i >= digits.size(); --i) { if (i < prefix.size()) { if (prefix[i] == 9) { prefix[i] = 0; } else { ++prefix[i]; already = true; break; } } else if (i >= length - suffix.size()) { if (suffix[length - i - 1] == 9) { suffix[length - i - 1] = 0; } else { ++suffix[length - i - 1]; already = true; break; } } else { suffix.push_back(1); already = true; break; } } if (!already) { ++length; prefix = digits; suffix.clear(); } answer += length - digits.size(); } else { ++length; prefix = digits; suffix.clear(); answer += length - digits.size(); } } } printf("%lld\n", answer); 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 | #include <bits/stdc++.h> using namespace std; int main() { #ifdef wxh010910 freopen("input.txt", "r", stdin); #endif int n; scanf("%d", &n); vector<int> prefix, suffix; long long answer = 0; int length = 0; for (int i = 0; i < n; ++i) { int x; scanf("%d", &x); vector<int> digits; while (x) { digits.push_back(x % 10); x /= 10; } reverse(digits.begin(), digits.end()); if (length < digits.size()) { length = digits.size(); prefix = digits; suffix.clear(); } else { int type = 0; for (int i = 0; i < digits.size(); ++i) { if (i < prefix.size()) { if (prefix[i] != digits[i]) { if (prefix[i] < digits[i]) { type = 1; } else { type = -1; } break; } } else if (i >= length - suffix.size()) { if (suffix[length - i - 1] != digits[i]) { if (suffix[length - i - 1] < digits[i]) { type = 1; } else { type = -1; } break; } } else if (digits[i]) { type = 1; break; } } if (type == 1) { prefix = digits; suffix.clear(); answer += length - digits.size(); } else if (type == 0) { bool already = false; for (int i = length - 1; i >= digits.size(); --i) { if (i < prefix.size()) { if (prefix[i] == 9) { prefix[i] = 0; } else { ++prefix[i]; already = true; break; } } else if (i >= length - suffix.size()) { if (suffix[length - i - 1] == 9) { suffix[length - i - 1] = 0; } else { ++suffix[length - i - 1]; already = true; break; } } else { suffix.push_back(1); already = true; break; } } if (!already) { ++length; prefix = digits; suffix.clear(); } answer += length - digits.size(); } else { ++length; prefix = digits; suffix.clear(); answer += length - digits.size(); } } } printf("%lld\n", answer); return 0; } |