Advertisement
ivnikkk

Untitled

Apr 3rd, 2022
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. using namespace std;
  4. #define all(a) a.begin(), a.end()
  5. typedef long long ll;
  6. typedef pair<ll, ll> pll;
  7. typedef long double ld;
  8. mt19937 rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count());
  9. signed main() {
  10. #ifdef _DEBUG
  11.     freopen("input.txt", "r", stdin);
  12.     freopen("output.txt", "w", stdout);
  13. #endif
  14.     ios_base::sync_with_stdio(false);
  15.     cin.tie(nullptr);
  16.     ll t;
  17.     cin >> t;
  18.     while (t--) {
  19.         ll n;
  20.         cin >> n;
  21.         vector<ll>a(n);
  22.         for (ll i = 0; i < n; i++) {
  23.             cin >> a[i];
  24.         }
  25.         vector<ll> b = a;
  26.         reverse(all(b));
  27.         ll sum = 0;
  28.         for (ll i = 0; i < n; i++) {
  29.             b[i] = b[i] - sum;
  30.             sum += b[i];
  31.         }
  32.         reverse(all(b));
  33.         deque<ll> last_level;
  34.         cout << sum << '\n';
  35.         for (ll i = 0; i < b.back(); i++) {
  36.             last_level.push_back(i);
  37.         }
  38.         map<ll, ll> check;//проверка ответа
  39.         deque<pair<ll, ll>> need_free;
  40.         for (ll i = n - 1; i > 0; i--) {
  41.             ll now = last_level.back() + 1;
  42.             ll x = b[i - 1];
  43.             ll cnt = 0;
  44.             deque<ll> sub;
  45.             bool is_free = false;
  46.             while (x > 0) {
  47.                 if (cnt == i) {
  48.                     if (last_level.size() > 1) {
  49.                         cnt = 0;
  50.                         last_level.pop_front();
  51.                     }
  52.                     else {
  53.                         is_free = true;
  54.                     }
  55.                 }
  56.                 if (is_free) {
  57.                     if (!need_free.empty()) {
  58.                         need_free.back().second--;
  59.                         cout << need_free.back().first << ' ' << now << '\n';
  60.                         check[need_free.back().first]++;
  61.                         sub.push_back(now++);
  62.                         cnt++;
  63.                         x--;
  64.                         if (need_free.back().second == 0 && need_free.size() > 1) {
  65.                             need_free.pop_back();
  66.                         }
  67.                     }
  68.                 }
  69.                 else {
  70.                     cout << last_level.front() << ' ' << now << '\n';
  71.                     check[last_level.front()]++;
  72.                     cnt++;
  73.                     sub.push_back(now++);
  74.                     x--;
  75.                 }
  76.             }
  77.             if (cnt < i) {
  78.                 need_free.push_back({ last_level.front(), i - cnt });
  79.                 last_level.pop_front();
  80.                 while (!last_level.empty()) {
  81.                     need_free.push_back({ last_level.front(),i });
  82.                     last_level.pop_front();
  83.                 }
  84.                
  85.             }
  86.             last_level = sub;
  87.         }
  88.         //dec это массив востонавливается по исходящим степеням вершин дерева
  89.         vector<ll> dec(n);
  90.         for (ll i = 0; i < n; i++) {
  91.             for (ll j = 0; j < sum; j++) {
  92.                 if (i <= check[j]) {
  93.                     dec[i]++;
  94.                 }
  95.             }
  96.         }
  97.         for (ll i = 0; i < dec.size(); i++) {
  98.             cout << dec[i] << ' ';
  99.         }
  100.         cout << '\n';
  101.     }
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement