Dang_Quan_10_Tin

CIRCLE (THT)

Aug 30th, 2021
1,147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #define task "CIRCLE"
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <algorithm>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. using ll = long long;
  11. using ld = long double;
  12.  
  13. constexpr int N = 1e5 + 5;
  14. constexpr int Inf = 1e9 + 7;
  15.  
  16. int id[] = {0, 1, 2};
  17. int n, a[N], b[N], ans[N], tmp[N];
  18. bool ck[N];
  19. vector<int> s[3];
  20.  
  21. void Read()
  22. {
  23.     cin >> n;
  24.     for (int i = 0; i < n; ++i)
  25.         cin >> a[i];
  26. }
  27.  
  28. void Sub_1()
  29. {
  30.     int x = 0, sum(0);
  31.     do
  32.     {
  33.         sum += a[(x + 1) % n] - a[(x + 2) % n];
  34.         (x += 3) %= n;
  35.         b[x] = -sum;
  36.     } while (x != 0);
  37.  
  38.     int minn = *min_element(b, b + n);
  39.     for (int i = 0; i < n; ++i)
  40.         cout << b[i] - minn + 1 << " ";
  41. }
  42.  
  43. void Sub_2()
  44. {
  45.     for (int i = 0; i < 3; ++i)
  46.     {
  47.         int x = i, sum(0);
  48.         while (x < n)
  49.         {
  50.             s[i].emplace_back(x);
  51.             b[x] = -sum;
  52.             sum += a[(x + 1) % n] - a[(x + 2) % n];
  53.             x += 3;
  54.         }
  55.     }
  56.  
  57.     do
  58.     {
  59.         fill(tmp, tmp + n, 0);
  60.         fill(ck + 1, ck + n + 1, false);
  61.  
  62.         int mex(1);
  63.  
  64.         for (int i = 0; i < 3; ++i)
  65.         {
  66.             int minn(Inf);
  67.             for (auto j : s[id[i]])
  68.                 minn = min(minn, b[j]);
  69.  
  70.             for (auto j : s[id[i]])
  71.             {
  72.                 tmp[j] = b[j] + mex - minn;
  73.                 if (tmp[j] > n || ck[tmp[j]])
  74.                     goto done;
  75.                 ck[tmp[j]] = 1;
  76.             }
  77.  
  78.             for (int j = 1; j <= n; ++j)
  79.                 if (!ck[j])
  80.                 {
  81.                     mex = j;
  82.                     break;
  83.                 }
  84.         }
  85.  
  86.         for (int i = 0; i < n; ++i)
  87.             if (ans[i] == 0 || ans[i] > tmp[i])
  88.             {
  89.                 for (int j = 0; j < n; ++j)
  90.                     ans[j] = tmp[j];
  91.                 break;
  92.             }
  93.             else if (ans[i] < tmp[i])
  94.                 goto done;
  95.  
  96.     done:;
  97.  
  98.     } while (next_permutation(id, id + 3));
  99.  
  100.     for (int i = 0; i < n; ++i)
  101.         cout << ans[i] << " ";
  102. }
  103.  
  104. int32_t main()
  105. {
  106.     ios::sync_with_stdio(0);
  107.     cin.tie(0);
  108.     cout.tie(0);
  109.     if (fopen(task ".INP", "r"))
  110.     {
  111.         freopen(task ".INP", "r", stdin);
  112.         freopen(task ".OUT", "w", stdout);
  113.     }
  114.     Read();
  115.     if (n % 3 != 0)
  116.         Sub_1();
  117.     else
  118.         Sub_2();
  119. }
  120.  
Advertisement
Add Comment
Please, Sign In to add comment