Submission #70832875


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

vector<int> sq(vector<int> a) {
  int n = a.size();
  vector<int> res(n);
  for (int i = 0; i < n; i++) {
    res[i] = a[a[i]];
  }
  return res;
}

vector<int> brute(vector<int> a) {
  int n = a.size();
  vector<int> ans(n, n-1);
  auto dfs = [&] (this auto dfs, int i) {
    if (i == n) {
      ans = min(ans, sq(a));
      return;
    }
    if (a[i] != -1) dfs(i+1);
    else {
      for (int x = 0; x < n; x++) {
        a[i] = x;
        dfs(i+1);
      }
      a[i] = -1;
    }
  };
  dfs(0);
  return ans;
}

vector<int> solve(vector<int> a) {
  vector<int> oa = a;
  int n = a.size();
  if (a[0] <= 0) {
    for (auto& x: a) {
      if (x == -1) x = 0;
    }
    return sq(a);
  }

  int idx = n;
  set<int> pos;
  for (int i = 0; i < n; i++) {
    if (a[i] == 0) idx = min(idx, i);
    if (a[i] == -1) {
      pos.emplace(i);
    }
  }
  if (pos.empty()) return sq(a);

  auto finalize = [&] (vector<int> p, int f) -> vector<int> {
    // cout << "Finalizing with ";
    // for (int x: p) cout << x << ' ';
    // cout << "and " << f << "\n";
    if (p.empty()) {
      // for (auto& x: a) cout << x << ' ';
      // cout << "\n";
      // cout << f << '\n';
      pair<int, int> best = {n-1, n-1};
      for (int i = 0; i < n; i++) {
        if (i != f) {
          best = min(best, make_pair(a[i], i));
        }
      }
      best = min(best, make_pair(f, f));
      // cout << "Best is " << best.second << "\n";
      a[f] = best.second;
      vector<int> res = sq(a);
      a[f] = 0;
      res = min(res, sq(a));
      return res;
    }

    vector<int> b = a;
    for (int x: p) b[x] = f;
    b[f] = 0;
    vector<int> res = sq(b);
    if (idx < n) {
      for (int x: p) b[x] = idx;
      b[f] = idx;
      res = min(res, sq(b));
      b[f] = 0;
      res = min(res, sq(b));
    }
    return res;
  };

  vector<int> queued;
  vector<int> in_queue(n);
  for (int i = 0; i < n; i++) {
    // cout << "i = " << i << ' ' << a[i] << "\n";
    // for (auto x: a) cout << x << ' ';
    // cout << "\n";
    // for (int x: queued) cout << x << ' ';
    // cout << "\n";
    // cout << "pos size = " << pos.size() << "\n";
    if (a[i] != -1 && a[a[i]] == -1) {
      if (!in_queue[a[i]]) {
        if (pos.size() == 1) return finalize(queued, a[i]);
        a[a[i]] = 0;
        idx = min(idx, a[i]);
        pos.erase(a[i]);
        continue;
      }
      int v = *pos.lower_bound(i);
      if (v == *pos.rbegin()) {
        return finalize(queued, v);
      }
      v = min(v, idx);
      a[v] = 0;
      pos.erase(v);
      idx = min(idx, v);
      for (int x: queued) {
        a[x] = v;
        in_queue[x] = 0;
        pos.erase(x);
      }
      queued.clear();
    }
    else if (a[i] == -1) {
      // cout << "Visiting " << i << "\n";
      if (i == *pos.rbegin()) {
        return finalize(queued, i);
      }
      else {
        pos.erase(i);
        queued.push_back(i);
        in_queue[i] = 1;
      }
    }
  }
  if (count(a.begin(), a.end(), -1) != 0) {
    cout << "Error\n";
    for (auto x: oa) cout << x << ' ';
    cout << '\n';
    exit(0);
  }
  return sq(a);
}

int main () {
  ios_base::sync_with_stdio(0); cin.tie(0);
  // vector<int> res = solve({2, -1, 1, -1, -1, 6, -1});
  // for (auto x: res) cout << x << ' ';
  // cout << '\n';
  // return 0;

  // for (int n = 1; n <= 8; n++) {
  //   vector<int> cur;
  //   auto dfs = [&] (this auto dfs) {
  //     if ((int)cur.size() == n) {
  //       auto res1 = brute(cur);
  //       auto res2 = solve(cur);
  //       if (res1 != res2) {
  //         cout << "Mismatch on ";
  //         for (auto x: cur) cout << x << ' ';
  //         cout << "\n";
  //         cout << "Brute: ";
  //         for (auto x: res1) cout << x << ' ';
  //         cout << "\n";
  //         cout << "Solve: ";
  //         for (auto x: res2) cout << x << ' ';
  //         cout << "\n";
  //         exit(0);
  //       }
  //       return;
  //     }
  //     for (int x = -1; x < n; x++) {
  //       if (x == -1 && count(cur.begin(), cur.end(), -1) >= 3) continue;
  //       cur.push_back(x);
  //       dfs();
  //       cur.pop_back();
  //     }
  //   };
  //   dfs();
  // }

  int T;
  cin >> T;
  while (T--) {
    int n;
    cin >> n;
    vector<int> a(n);
    for (auto& x: a) {
      cin >> x;
      if (x != -1) x--;
    }
    vector<int> res = solve(a);
    for (int i = 0; i < n; i++) {
      cout << res[i]+1 << " \n"[i==n-1];
    }
  }
}

Submission Info

Submission Time
Task D - A_A_i
User AndrewG
Language C++23 (GCC 15.2.0)
Score 900
Code Size 4671 Byte
Status AC
Exec Time 174 ms
Memory 28220 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 900 / 900
Status
AC × 1
AC × 98
Set Name Test Cases
Sample 00_sample_00.txt
All 00_sample_00.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt, 01_test_31.txt, 01_test_32.txt, 01_test_33.txt, 01_test_34.txt, 01_test_35.txt, 01_test_36.txt, 01_test_37.txt, 01_test_38.txt, 01_test_39.txt, 01_test_40.txt, 01_test_41.txt, 01_test_42.txt, 01_test_43.txt, 01_test_44.txt, 01_test_45.txt, 01_test_46.txt, 01_test_47.txt, 01_test_48.txt, 01_test_49.txt, 01_test_50.txt, 01_test_51.txt, 01_test_52.txt, 01_test_53.txt, 01_test_54.txt, 01_test_55.txt, 01_test_56.txt, 01_test_57.txt, 01_test_58.txt, 01_test_59.txt, 01_test_60.txt, 01_test_61.txt, 01_test_62.txt, 01_test_63.txt, 01_test_64.txt, 01_test_65.txt, 01_test_66.txt, 01_test_67.txt, 01_test_68.txt, 01_test_69.txt, 01_test_70.txt, 01_test_71.txt, 01_test_72.txt, 01_test_73.txt, 01_test_74.txt, 01_test_75.txt, 01_test_76.txt, 01_test_77.txt, 01_test_78.txt, 01_test_79.txt, 01_test_80.txt, 01_test_81.txt, 01_test_82.txt, 01_test_83.txt, 01_test_84.txt, 01_test_85.txt, 01_test_86.txt, 01_test_87.txt, 01_test_88.txt, 01_test_89.txt, 01_test_90.txt, 01_test_91.txt, 01_test_92.txt, 01_test_93.txt, 01_test_94.txt, 01_test_95.txt, 01_test_96.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3456 KiB
01_test_00.txt AC 42 ms 3604 KiB
01_test_01.txt AC 21 ms 3512 KiB
01_test_02.txt AC 5 ms 4160 KiB
01_test_03.txt AC 131 ms 21440 KiB
01_test_04.txt AC 120 ms 19900 KiB
01_test_05.txt AC 34 ms 11324 KiB
01_test_06.txt AC 12 ms 6092 KiB
01_test_07.txt AC 63 ms 12864 KiB
01_test_08.txt AC 53 ms 11464 KiB
01_test_09.txt AC 13 ms 6916 KiB
01_test_10.txt AC 19 ms 8448 KiB
01_test_11.txt AC 9 ms 5712 KiB
01_test_12.txt AC 28 ms 11372 KiB
01_test_13.txt AC 39 ms 14916 KiB
01_test_14.txt AC 40 ms 16376 KiB
01_test_15.txt AC 20 ms 8476 KiB
01_test_16.txt AC 43 ms 3572 KiB
01_test_17.txt AC 42 ms 3420 KiB
01_test_18.txt AC 42 ms 3548 KiB
01_test_19.txt AC 43 ms 3640 KiB
01_test_20.txt AC 43 ms 3600 KiB
01_test_21.txt AC 42 ms 3420 KiB
01_test_22.txt AC 43 ms 3600 KiB
01_test_23.txt AC 42 ms 3596 KiB
01_test_24.txt AC 43 ms 3572 KiB
01_test_25.txt AC 43 ms 3636 KiB
01_test_26.txt AC 42 ms 3552 KiB
01_test_27.txt AC 43 ms 3572 KiB
01_test_28.txt AC 42 ms 3512 KiB
01_test_29.txt AC 42 ms 3600 KiB
01_test_30.txt AC 42 ms 3508 KiB
01_test_31.txt AC 42 ms 3548 KiB
01_test_32.txt AC 42 ms 3572 KiB
01_test_33.txt AC 42 ms 3572 KiB
01_test_34.txt AC 43 ms 3428 KiB
01_test_35.txt AC 43 ms 3572 KiB
01_test_36.txt AC 35 ms 3760 KiB
01_test_37.txt AC 35 ms 3896 KiB
01_test_38.txt AC 36 ms 3728 KiB
01_test_39.txt AC 35 ms 3896 KiB
01_test_40.txt AC 35 ms 3768 KiB
01_test_41.txt AC 35 ms 3828 KiB
01_test_42.txt AC 35 ms 3896 KiB
01_test_43.txt AC 35 ms 3828 KiB
01_test_44.txt AC 35 ms 3676 KiB
01_test_45.txt AC 36 ms 3656 KiB
01_test_46.txt AC 35 ms 3684 KiB
01_test_47.txt AC 36 ms 3828 KiB
01_test_48.txt AC 35 ms 3884 KiB
01_test_49.txt AC 35 ms 3860 KiB
01_test_50.txt AC 35 ms 3828 KiB
01_test_51.txt AC 36 ms 3684 KiB
01_test_52.txt AC 35 ms 3684 KiB
01_test_53.txt AC 36 ms 3676 KiB
01_test_54.txt AC 35 ms 3888 KiB
01_test_55.txt AC 35 ms 3676 KiB
01_test_56.txt AC 36 ms 4308 KiB
01_test_57.txt AC 35 ms 4348 KiB
01_test_58.txt AC 43 ms 4644 KiB
01_test_59.txt AC 38 ms 4332 KiB
01_test_60.txt AC 41 ms 4444 KiB
01_test_61.txt AC 34 ms 4288 KiB
01_test_62.txt AC 38 ms 4588 KiB
01_test_63.txt AC 38 ms 4492 KiB
01_test_64.txt AC 40 ms 4316 KiB
01_test_65.txt AC 36 ms 4400 KiB
01_test_66.txt AC 39 ms 4328 KiB
01_test_67.txt AC 35 ms 4056 KiB
01_test_68.txt AC 37 ms 4528 KiB
01_test_69.txt AC 35 ms 4532 KiB
01_test_70.txt AC 38 ms 4328 KiB
01_test_71.txt AC 41 ms 4532 KiB
01_test_72.txt AC 34 ms 4460 KiB
01_test_73.txt AC 37 ms 4412 KiB
01_test_74.txt AC 38 ms 4240 KiB
01_test_75.txt AC 39 ms 4380 KiB
01_test_76.txt AC 34 ms 13072 KiB
01_test_77.txt AC 34 ms 13116 KiB
01_test_78.txt AC 66 ms 20680 KiB
01_test_79.txt AC 40 ms 17012 KiB
01_test_80.txt AC 41 ms 13024 KiB
01_test_81.txt AC 109 ms 23648 KiB
01_test_82.txt AC 34 ms 13120 KiB
01_test_83.txt AC 39 ms 16868 KiB
01_test_84.txt AC 34 ms 13072 KiB
01_test_85.txt AC 42 ms 16880 KiB
01_test_86.txt AC 38 ms 13008 KiB
01_test_87.txt AC 40 ms 16996 KiB
01_test_88.txt AC 39 ms 17016 KiB
01_test_89.txt AC 40 ms 17012 KiB
01_test_90.txt AC 34 ms 13120 KiB
01_test_91.txt AC 174 ms 28220 KiB
01_test_92.txt AC 34 ms 13120 KiB
01_test_93.txt AC 34 ms 12952 KiB
01_test_94.txt AC 142 ms 22608 KiB
01_test_95.txt AC 41 ms 13052 KiB
01_test_96.txt AC 14 ms 4300 KiB