Advertisement
Kambarych

BinCoin

Dec 8th, 2022 (edited)
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.23 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define For(i, n)           for(int i = 0; i < n; ++i)
  6. #define all(x)              (x).begin(),(x).end()
  7. #define rall(x)             (x).rbegin(),(x).rend()
  8.  
  9. #define ld                  long double
  10. #define pii                 pair<int, int>
  11. #define vt                  vector
  12. #define ll                  long long
  13. // #define endl                '\n'
  14.  
  15. const int MAX = 1e9;
  16. const int MOD = 1e9 + 7;
  17. const ll  INF = 1e18;
  18. const ld  PI  = 3.14159265358979323846;
  19.  
  20. template<typename T>
  21. void read(vt<T> & a) {
  22.     For(i, a.size()) cin >> a[i];
  23. }
  24. template<typename T>
  25. void print(vt<T> & a) {
  26.     For(i, a.size()) cout << a[i] << " ";
  27.     cout << endl;
  28. }
  29. template<typename T>
  30. void print2(vt<vt<T> > & a) {
  31.     For(i, a.size()) {
  32.         For(j, a[i].size()) cout << a[i][j] << " ";
  33.         cout << endl;
  34.     }
  35. }
  36. template<typename T>
  37. void read2(vt<vt<T> > & a) {
  38.     For(i, a.size()) For(j, a[i].size()) cin >> a[i][j];
  39. }
  40.  
  41. const int N = 2000;
  42. vt<int> PAR(N);
  43.  
  44. int rec(int p, int cond, vt<vt<int> > & a) {
  45.     if (a[0].size() == 1) {
  46.         PAR[a[0][0]] = p;
  47.         return 1;
  48.     }
  49.     if (a[0].size() % 2 != 1) {
  50.         return 0;
  51.     }
  52.     int k = a.size();
  53.     int n = a[0].size();
  54.     map<int, set<int> > mp;
  55.     for (int i = 0; i < k; i++) {
  56.         for (int j = 0; j < n; j++) {
  57.             int x = a[i][j];
  58.             mp[x].insert(j);
  59.             mp[x].insert(n - 1 - j);
  60.         }
  61.     }
  62.     int mn = MAX;
  63.     for (auto x : mp) {
  64.         int pos = x.second.size();
  65.         if (pos < mn) {
  66.             mn = pos;
  67.         }
  68.     }
  69.     int cnt_mns = 0;
  70.     for (auto x : mp) {
  71.         int pos = x.second.size();
  72.         if (pos == mn) {
  73.             cnt_mns++;
  74.         }
  75.     }
  76.     int mid = -1;
  77.     if (cnt_mns % 2 == 1) {
  78.         int cur_mn = 0;
  79.         for (int j = 0; j < n; j++) {
  80.             int x = a[0][j];
  81.             int sz = mp[x].size();
  82.             if (sz == mn) {
  83.                 if (cur_mn == cnt_mns / 2) {
  84.                     mid = x;
  85.                     break;
  86.                 }
  87.                 cur_mn++;
  88.             }
  89.         }
  90.     } else {
  91.         int mx_diff = MAX;
  92.         int cnt = 0;
  93.         for (auto x : mp) {
  94.             int pos = x.second.size();
  95.             if (pos == mn) {
  96.                 if (cnt == cond) {
  97.                     mid = x.first;
  98.                     break;
  99.                 }
  100.                 cnt++;
  101.             }
  102.         }
  103.     }
  104.     int first_half_contains = a[0][0];
  105.     vt<vt<vt<int> > > halfs(2, vt<vt<int> > (k));
  106.     for (int i = 0; i < k; i++) {
  107.         bool swp = false;
  108.         for (int j = 0; j < n; j++) {
  109.             int x = a[i][j];
  110.             if (x == first_half_contains) {
  111.                 swp = true;  
  112.                 break;
  113.             }
  114.             if (x == mid) {
  115.                 break;
  116.             }
  117.         }
  118.         int cur = 0;
  119.         for (int j = 0; j < n; j++) {
  120.             int x = a[i][j];
  121.             if (x == mid) {
  122.                 cur++;
  123.                 continue;
  124.             }
  125.             halfs[cur][i].push_back(x);
  126.         }
  127.         if (swp) {
  128.             swap(halfs[0][i], halfs[1][i]);
  129.         }
  130.     }
  131.  
  132.     for (int cur = 0; cur < 2; cur++) {
  133.         int sz = halfs[cur][0].size();
  134.         for (int i = 0; i < k; i++) {
  135.             if (halfs[cur][i].size() != sz) {
  136.                 return 0;
  137.             }
  138.         }
  139.     }
  140.  
  141.     PAR[mid] = p;
  142.     int res = 1;
  143.     if (rec(mid, 0, halfs[0]) != 1) {
  144.         res &= rec(mid, 1, halfs[0]);
  145.     }
  146.     if (rec(mid, 0, halfs[1]) != 1) {
  147.         res &= rec(mid, 1, halfs[1]);
  148.     }
  149.     return res;
  150. }
  151.  
  152. void solve()
  153. {
  154.     int n, k; cin >> n >> k;
  155.     vt<vt<int> > a(k, vt<int> (n));
  156.     read2(a);
  157.     int res = rec(-1, 0, a);
  158.     if (res == 0) {
  159.         res = rec(-1, 1, a);
  160.     }
  161.     assert(res == 1);
  162.     for (int i = 1; i <= n; i++) {
  163.         cout << PAR[i] << " ";
  164.     }
  165.     cout << endl;
  166. }
  167.  
  168. int main()
  169. {
  170.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  171. // #define FILE
  172. #ifdef FILE
  173.     freopen("output.txt", "r", stdin);
  174.     // freopen("input.txt", "r", stdin);
  175. #endif
  176.     cout << setprecision(20) << fixed;
  177.     int T = 1;
  178.     For(t, T) {
  179.         solve();
  180.     }
  181.     return 0;
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement