Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include "bits/stdc++.h"
- using namespace std;
- #define all(a) a.begin(), a.end()
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef long double ld;
- mt19937 rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count());
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- ll t;
- cin >> t;
- while (t--) {
- ll n;
- cin >> n;
- vector<ll>a(n);
- for (ll i = 0; i < n; i++) {
- cin >> a[i];
- }
- vector<ll> b = a;
- reverse(all(b));
- ll sum = 0;
- for (ll i = 0; i < n; i++) {
- b[i] = b[i] - sum;
- sum += b[i];
- }
- reverse(all(b));
- deque<ll> last_level;
- cout << sum << '\n';
- for (ll i = 0; i < b.back(); i++) {
- last_level.push_back(i);
- }
- map<ll, ll> check;//проверка ответа
- deque<pair<ll, ll>> need_free;
- for (ll i = n - 1; i > 0; i--) {
- ll now = last_level.back() + 1;
- ll x = b[i - 1];
- ll cnt = 0;
- deque<ll> sub;
- bool is_free = false;
- while (x > 0) {
- if (cnt == i) {
- if (last_level.size() > 1) {
- cnt = 0;
- last_level.pop_front();
- }
- else {
- is_free = true;
- }
- }
- if (is_free) {
- if (!need_free.empty()) {
- need_free.back().second--;
- cout << need_free.back().first << ' ' << now << '\n';
- check[need_free.back().first]++;
- sub.push_back(now++);
- cnt++;
- x--;
- if (need_free.back().second == 0 && need_free.size() > 1) {
- need_free.pop_back();
- }
- }
- }
- else {
- cout << last_level.front() << ' ' << now << '\n';
- check[last_level.front()]++;
- cnt++;
- sub.push_back(now++);
- x--;
- }
- }
- if (cnt < i) {
- need_free.push_back({ last_level.front(), i - cnt });
- last_level.pop_front();
- while (!last_level.empty()) {
- need_free.push_back({ last_level.front(),i });
- last_level.pop_front();
- }
- }
- last_level = sub;
- }
- //dec это массив востонавливается по исходящим степеням вершин дерева
- vector<ll> dec(n);
- for (ll i = 0; i < n; i++) {
- for (ll j = 0; j < sum; j++) {
- if (i <= check[j]) {
- dec[i]++;
- }
- }
- }
- for (ll i = 0; i < dec.size(); i++) {
- cout << dec[i] << ' ';
- }
- cout << '\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement