fork download
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <queue>
  5. #include <numeric>
  6. using namespace std;
  7.  
  8. int main() {
  9. cin.tie(0)->sync_with_stdio(0);
  10. int t; cin >> t;
  11. while (t--) {
  12. int n; cin >> n;
  13. vector<int> a(n);
  14. for (int &x : a) cin >> x;
  15.  
  16. vector<vector<int>> adj(n);
  17. vector<int> indegree(n, 0), ans(n);
  18. int step = 1;
  19. vector<int> b(n);
  20. iota(b.begin(), b.end(), 0);
  21. while (b.size() > 1) {
  22. vector<int> c;
  23. int i2 = 0;
  24. for (;i2 < b.size(); i2++) {
  25. int u = b[i2];
  26. if (a[u] != step) break;
  27. if (i2 < b.size() - 1) {
  28. int r = b[i2 + 1];
  29. if (a[r] == step) {
  30. if (step & 1) {
  31. adj[u].push_back(r);
  32. indegree[r]++;
  33. } else {
  34. adj[r].push_back(u);
  35. indegree[u]++;
  36. }
  37. }
  38. }
  39. }
  40. int j = b.size() - 1;
  41. for (; j >= 0; j--) {
  42. int u = b[j];
  43. if (a[u] != step) break;
  44. if (j > 0) {
  45. int l = b[j - 1];
  46. if (a[l] == step) {
  47. if (step & 1) {
  48. adj[u].push_back(l);
  49. indegree[l]++;
  50. } else {
  51. adj[l].push_back(u);
  52. indegree[u]++;
  53. }
  54. }
  55. }
  56. }
  57. for (int i = i2; i < j + 1; i++) {
  58. int u = b[i];
  59. if (a[u] != step) {
  60. c.push_back(u);
  61. if (i > 0) {
  62. int l = b[i - 1];
  63. if (step & 1) { // local minima
  64. adj[l].push_back(u);
  65. indegree[u]++;
  66. } else {
  67. adj[u].push_back(l);
  68. indegree[l]++;
  69. }
  70. }
  71. if (i < b.size() - 1) {
  72. int r = b[i + 1];
  73. if (step & 1) {
  74. adj[r].push_back(u);
  75. indegree[u]++;
  76. } else {
  77. adj[u].push_back(r);
  78. indegree[r]++;
  79. }
  80. }
  81. } else { // a[u] == step
  82. if (i == b.size() - 1) continue;
  83. int r = b[i + 1];
  84. // not sure if this even matters
  85. if (a[r] == step) {
  86. if (step & 1) {
  87. adj[r].push_back(u);
  88. indegree[u]++;
  89. } else {
  90. adj[u].push_back(r);
  91. indegree[r]++;
  92. }
  93. }
  94. }
  95. }
  96. // cout << "size of c: " << c.size() << endl;
  97. b = c;
  98. step++;
  99. }
  100.  
  101. // for (int u = 0; u < n; u++) {
  102. // for (int v : adj[u]) {
  103. // cout << '(' << u << ", " << v << ')' << endl;
  104. // }
  105. // }
  106.  
  107. queue<int> q;
  108. for (int i = 0; i < n; i++) if (indegree[i] == 0) q.push(i);
  109.  
  110. cout << q.size() << '\n';
  111.  
  112. int val = n;
  113. while (!q.empty()) {
  114. int u = q.front(); q.pop();
  115. ans[u] = val--;
  116. for (int v : adj[u]) {
  117. indegree[v]--;
  118. if (indegree[v] == 0) q.push(v);
  119. }
  120. }
  121.  
  122. for (int x : ans) cout << x << ' ';
  123. cout << '\n';
  124. }
  125. }
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
Success #stdin #stdout 0s 5324KB
stdin
1
8
3 1 2 1 -1 1 1 2
stdout
3
5 8 2 7 3 4 6 1