#include <iostream>
#include <cstdio>
#include <utility>
#define DEBUG 0
#define F first
#define S second
#define MP(a,b) make_pair(a, b)
#define LLI long long int
using namespace std;
int akt[20], p = 300100, k = 300099, t = 0;
LLI wynik, n = 0, l, m;
pair<int, int> pop[1000100];
int dl(int a);
int por();
void add();
void przyp();
void wypisz();
//***************************************************************************************
int main()
{
for(int i = 0; i < 1000000; i++) pop[i] = MP(-1, 1e9);
scanf("%lld", &m);
while(m--) {
scanf("%lld", &l);
n = dl(l);
if (DEBUG) cout << "L: " << l << endl;
if (p > k) { przyp(); continue; }
int pr = por();
if (DEBUG) cout << "PR: " << pr << endl;
if (DEBUG) cout << "N: " << n << endl;
if (n > k - p + 1) { k = p + n - 1, przyp(); continue; }
if (pr < 0)
wynik += abs (n - k + p - 1) + 1,
k++,
przyp();
else if (pr == 0)
wynik += abs (n - k + p - 1),
add();
else
wynik += abs (n - k + p - 1),
przyp();
if (DEBUG) cout << "WYNIK: " << wynik << endl;
if (DEBUG) wypisz();
if (wynik < 0) { cout << "EEE\n"; return 0; }
}
printf("%lld\n", wynik);
}
int dl(int a)
{
if (a == 0) return 1;
else {
int d = 0;
while(a != 0)
akt[d] = a % 10,
d++,
a /= 10;
for(int i = 0; i < (d+1) / 2; i++) swap(akt[i], akt[d - 1 - i]);
return d;
}
}
/* 0 - rowne
-1 - akt < pop
1 - akt > pop */
int por()
{
for(int i = 0; i < n; i++) {
if (pop[p+i].S != t) pop[p+i] = MP(0, t);
if (pop[p+i].F > akt[i]) return -1;
else if (pop[p+i].F < akt[i]) return 1;
}
return 0;
}
void add()
{
int z = 1, md = k;
for(int i = k; i >= p; i--) {
if (pop[i].S != t) pop[i] = MP(0, t);
pop[i].F += z;
md = i;
if (pop[i].F == 10) pop[i].F = 0, z = 1;
else break;
}
if (md - p + 1 <= n)
wynik++,
k++,
przyp();
}
void przyp()
{
t++;
k = max((LLI)k, p + n - 1);
for(int i = 0; i < n; i++) pop[p+i] = MP(akt[i], t);
}
void wypisz()
{
cout << p << " " << k << endl;
for(int i = p; i <= k; i++) cout << pop[i].F << " ";
cout << "\n";
for(int i = p; i <= k; i++) cout << pop[i].S << " ";
cout << "\n";
}
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 | #include <iostream> #include <cstdio> #include <utility> #define DEBUG 0 #define F first #define S second #define MP(a,b) make_pair(a, b) #define LLI long long int using namespace std; int akt[20], p = 300100, k = 300099, t = 0; LLI wynik, n = 0, l, m; pair<int, int> pop[1000100]; int dl(int a); int por(); void add(); void przyp(); void wypisz(); //*************************************************************************************** int main() { for(int i = 0; i < 1000000; i++) pop[i] = MP(-1, 1e9); scanf("%lld", &m); while(m--) { scanf("%lld", &l); n = dl(l); if (DEBUG) cout << "L: " << l << endl; if (p > k) { przyp(); continue; } int pr = por(); if (DEBUG) cout << "PR: " << pr << endl; if (DEBUG) cout << "N: " << n << endl; if (n > k - p + 1) { k = p + n - 1, przyp(); continue; } if (pr < 0) wynik += abs (n - k + p - 1) + 1, k++, przyp(); else if (pr == 0) wynik += abs (n - k + p - 1), add(); else wynik += abs (n - k + p - 1), przyp(); if (DEBUG) cout << "WYNIK: " << wynik << endl; if (DEBUG) wypisz(); if (wynik < 0) { cout << "EEE\n"; return 0; } } printf("%lld\n", wynik); } int dl(int a) { if (a == 0) return 1; else { int d = 0; while(a != 0) akt[d] = a % 10, d++, a /= 10; for(int i = 0; i < (d+1) / 2; i++) swap(akt[i], akt[d - 1 - i]); return d; } } /* 0 - rowne -1 - akt < pop 1 - akt > pop */ int por() { for(int i = 0; i < n; i++) { if (pop[p+i].S != t) pop[p+i] = MP(0, t); if (pop[p+i].F > akt[i]) return -1; else if (pop[p+i].F < akt[i]) return 1; } return 0; } void add() { int z = 1, md = k; for(int i = k; i >= p; i--) { if (pop[i].S != t) pop[i] = MP(0, t); pop[i].F += z; md = i; if (pop[i].F == 10) pop[i].F = 0, z = 1; else break; } if (md - p + 1 <= n) wynik++, k++, przyp(); } void przyp() { t++; k = max((LLI)k, p + n - 1); for(int i = 0; i < n; i++) pop[p+i] = MP(akt[i], t); } void wypisz() { cout << p << " " << k << endl; for(int i = p; i <= k; i++) cout << pop[i].F << " "; cout << "\n"; for(int i = p; i <= k; i++) cout << pop[i].S << " "; cout << "\n"; } |
English