fork(1) download
  1. #ifndef LOCAL
  2. // #pragma GCC optimize("Ofast,unroll-loops")
  3. #endif
  4. #include <climits>
  5. #include <unordered_map>
  6. #include <random>
  7. #include <chrono>
  8. #include <numeric>
  9. #include <iostream>
  10. #include <vector>
  11. #include <algorithm>
  12. #include <map>
  13. #include <queue>
  14. #include <deque>
  15. #include <stack>
  16. #include <functional>
  17. #include <bitset>
  18. #include <string>
  19. #include <sstream>
  20. #include <fstream>
  21. #include <iomanip>
  22. #include <cmath>
  23. #include <cassert>
  24. #include <list>
  25. #include <forward_list>
  26. #include <set>
  27. #include <unordered_set>
  28. #include <cstdint>
  29. #include <ext/pb_ds/assoc_container.hpp>
  30. #ifndef LOCAL
  31. // #pragma GCC target("avx,avx2,fma")
  32. #endif
  33.  
  34. using namespace std;
  35. using namespace __gnu_pbds;
  36.  
  37. using ll = long long;
  38. using ull = unsigned long long;
  39. using ld = long double;
  40.  
  41. #define all(x) begin(x), end(x)
  42. #define isz(x) ((int)size(x))
  43. #define X first
  44. #define Y second
  45. #define mp make_pair
  46.  
  47. int count_hits(const int n, const vector<int>& p) {
  48. int ans = 0;
  49. for (int i = 0; i < n; ++i) {
  50. for (int j = 0; j < i; ++j) {
  51. if (abs(i - j) == abs(p[i] - p[j])) {
  52. ++ans;
  53. }
  54. }
  55. }
  56. return ans;
  57. }
  58.  
  59. void solve() {
  60. int n;
  61. cin >> n;
  62. vector<int> p(n);
  63. iota(all(p), 0);
  64. mt19937 rng;
  65. shuffle(all(p), rng);
  66. int ans = count_hits(n, p);
  67. int best_ans = ans;
  68. vector<int> p_ans = p;
  69. auto start = clock();
  70. ld temp = 10000;
  71. while (clock() - start < 2000) {
  72. int i = rng() % n;
  73. int j = rng() % n;
  74. if (i > j) swap(i, j);
  75. auto cur = p;
  76. reverse(cur.begin() + i, cur.begin() + j);
  77. int cur_ans = count_hits(n, cur);
  78. if (cur_ans < ans || 1.L * rng() / INT_MAX < exp(-(ans - cur_ans) / temp)) {
  79. ans = cur_ans;
  80. p = cur;
  81. if (ans < best_ans) {
  82. best_ans = ans;
  83. p_ans = p;
  84. }
  85. }
  86. temp *= 0.995;
  87. }
  88. cerr << best_ans << '\n';
  89. for (auto it : p_ans) cout << it + 1 << ' ';
  90. cout << '\n';
  91. }
  92.  
  93. signed main() {
  94. #ifdef LOCAL
  95. // freopen("in.txt", "r", stdin);
  96. // freopen("out.txt", "w", stdout);
  97. #endif
  98. cin.tie(0)->sync_with_stdio(0);
  99. int t = 1;
  100. // cin >> t;
  101. while (t --> 0) {
  102. solve();
  103. }
  104. }
Success #stdin #stdout #stderr 0.01s 5276KB
stdin
10
stdout
4 7 10 2 5 1 8 6 3 9 
stderr
1