Advertisement
sadov_a

Untitled

Mar 19th, 2019
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <string>
  5. #include <cmath>
  6. #include <cstdio>
  7. #include <queue>
  8. #include <deque>
  9. #include <bitset>
  10. #include <set>
  11. #include <unordered_set>
  12. #include <map>
  13. #include <unordered_map>
  14. #include <random>
  15. #include <ctime>
  16. #include <utility>
  17. #include <fstream>
  18.  
  19. #pragma GCC optimize("Ofast")
  20. #pragma GCC optimize("no-stack-protector")
  21. #pragma GCC optimize("unroll-loops")
  22. #pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native")
  23. #pragma GCC optimize("fast-math")
  24. #pragma comment(linker, "/STACK:256000000")
  25. #pragma warning(disable:4996)
  26.  
  27. using namespace std;
  28.  
  29. typedef long long ll;
  30. typedef long double ld;
  31.  
  32. const char el = '\n';
  33. const int inf = 1e9;
  34. const ll llinf = 1e18, mod = 1000'000'007ll;
  35. const ld pi = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825;
  36.  
  37. #define forn(i, n) for (int i = 0; i < (int)n; ++i)
  38. #define firn(i, n) for (int i = 1; i < (int)n; ++i)
  39. #define all(v) v.begin(), v.end()
  40. #define x first
  41. #define y second
  42.  
  43. template<typename T> bool uin(T &a, T b) { if (b < a) { a = b; return 1; } return 0; }
  44. template<typename T> bool uax(T &a, T b) { if (b > a) { a = b; return 1; } return 0; }
  45. template<class iterator> void output(iterator begin, iterator end, char p = ' ', ostream & out = cout) { while (begin != end) { out << (*begin) << p; begin++; } out << '\n'; }
  46. template<class T> void output(T x, char p = ' ', ostream & out = cout) { output(all(x), p, out); }
  47.  
  48. mt19937 rnd(time(NULL));
  49.  
  50. string to_str(ll a) {
  51. string ans;
  52. while (a > 0) {
  53. ans += char(a % 10 + '0');
  54. a /= 10;
  55. }
  56. while ((int)ans.size() < 20) ans += '0';
  57. reverse(all(ans));
  58. return ans;
  59. }
  60.  
  61. int g[10][10];
  62. vector<int> comp;
  63. vector<bool> used;
  64. void dfs(int i) {
  65. used[i] = 1;
  66. comp.push_back(i);
  67. for (int to = 1; to < 10; ++to)
  68. if (g[i][to] && !used[to])
  69. dfs(to);
  70. }
  71. int main() {
  72. ios_base::sync_with_stdio(false);
  73. cin.tie(NULL);
  74. int n;
  75. cin >> n;
  76. vector<pair<ll, ll>> a(n);
  77. forn(i, n)
  78. cin >> a[i].x >> a[i].y;
  79. vector<pair<string, string>> b(n);
  80. forn(i, n)
  81. b[i].x = to_str(a[i].x), b[i].y = to_str(a[i].y);
  82. vector<ll> st(19, 1);
  83. firn(i, 19) st[i] = st[i - 1] * 10ll;
  84. firn(i, 10)
  85. for (int j = i + 1; j < 10; ++j) {
  86. bool good = 1;
  87. for (int k = 0; k < n && good; ++k) {
  88. forn(l, 20) {
  89. if (b[k].x[l] != b[k].y[l]) break;
  90. if (b[k].x[l] == '0' + i) {
  91. ll tmp1 = a[k].x + (j - i) * 1ll * st[19 - l];
  92. ll tmp2 = a[k].y + (j - i) * 1ll * st[19 - l];
  93. int in = lower_bound(all(a), pair<ll, ll>{ tmp1 + 1, 0 }) - a.begin() - 1;
  94. if (in < 0 || a[in].y < tmp2) {
  95. good = 0;
  96. break;
  97. }
  98. continue;
  99. }
  100. if (b[k].x[l] == '0' + j) {
  101. ll tmp1 = a[k].x + (i - j) * 1ll * st[19 - l];
  102. ll tmp2 = a[k].y + (i - j) * 1ll * st[19 - l];
  103. int in = lower_bound(all(a), pair<ll, ll>{ tmp1 + 1, 0 }) - a.begin() - 1;
  104. if (in < 0 || a[in].y < tmp2) {
  105. good = 0;
  106. break;
  107. }
  108. }
  109. }
  110. if (!good) break;
  111. int mn = 0;
  112. for (; mn < 20 && b[k].x[mn] == b[k].y[mn]; ++mn);
  113. for (int l = mn; l < 20; ++l) {
  114. if (b[k].x[l] > '0' + j || l == mn && b[k].y[l] < j + '0') continue;
  115. ll tmp1 = a[k].x + (i - (b[k].x[l] - '0')) * 1ll * st[19 - l];
  116. if (b[k].x[l] < '0' + j) tmp1 = (tmp1 / st[19 - l]) * st[19 - l];
  117. ll tmp2 = (tmp1 / st[19 - l]) * st[19 - l] + (st[19 - l] - 1);
  118. if (l == mn && b[k].y[l] == j + '0') tmp2 = a[k].y + (i - j) * 1ll * st[19 - l];
  119. int in = lower_bound(all(a), pair<ll, ll>{ tmp1 + 1, 0 }) - a.begin() - 1;
  120. if (in < 0 || a[in].y < tmp2) {
  121. good = 0;
  122. break;
  123. }
  124. }
  125. if (!good) break;
  126. for (int l = mn; l < 20; ++l) {
  127. if (b[k].y[l] < '0' + i || l == mn && b[k].x[l] > i + '0') continue;
  128. ll tmp2 = a[k].y + (j - (b[k].y[l] - '0')) * 1ll * st[19 - l];
  129. if (b[k].y[l] > '0' + i) tmp2 = (tmp2 / st[19 - l]) * st[19 - l] + st[19 - l] - 1;
  130. ll tmp1 = (tmp2 / st[19 - l]) * st[19 - l];
  131. if (l == mn && b[k].x[l] == i + '0') tmp1 = a[k].x + (j - i) * 1ll * st[19 - l];
  132. int in = lower_bound(all(a), pair<ll, ll>{ tmp1 + 1, 0 }) - a.begin() - 1;
  133. if (in < 0 || a[in].y < tmp2) {
  134. good = 0;
  135. break;
  136. }
  137. }
  138. }
  139. if (good) g[i][j] = g[j][i] = 1;
  140. }
  141. used.assign(10, 0);
  142. firn(i, 10) {
  143. if (used[i]) continue;
  144. dfs(i);
  145. sort(all(comp));
  146. forn(j, comp.size())
  147. cout << comp[j];
  148. comp.clear();
  149. cout << el;
  150. }
  151. #ifdef _DEBUG
  152. system("pause");
  153. #endif
  154. return 0;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement