Advertisement
K_Y_M_bl_C

Untitled

Feb 22nd, 2018
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | None | 0 0
  1. #ifdef _DEBUG
  2. #define _GLIBCXX_DEBUG
  3. #endif
  4. #define _CRT_SECURE_NO_WARNINGS
  5. #include <ext/pb_ds/assoc_container.hpp>
  6. #include <bits/stdc++.h>
  7.    
  8. using namespace __gnu_pbds;
  9. using namespace std;
  10.      
  11. typedef long long ll;
  12. typedef vector<ll> vll;
  13. typedef pair<int, int> pii;
  14. typedef vector<int> vi;
  15. typedef long double ld;
  16. typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
  17.      
  18. #define mk make_pair
  19. #define inb push_back
  20. #define enb emplace_back
  21. #define X first
  22. #define Y second
  23. #define all(v) v.begin(), v.end()
  24. #define sqr(x) (x) * (x)
  25. #define TIME 1.0 * clock() / CLOCKS_PER_SEC
  26. #define y1 AYDARBOG
  27. //continue break pop_back return
  28.      
  29. int solve();
  30.      
  31. int main()
  32. {
  33.     //ios_base::sync_with_stdio(0);
  34.     //cin.tie(0);
  35. #define TASK "intercity"
  36. #ifndef _DEBUG
  37.     //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  38. #endif
  39.     solve();
  40. #ifdef _DEBUG
  41.     fprintf(stderr, "\nTIME: %.3f\n", TIME);
  42. #endif     
  43. }
  44.      
  45. const int INF = 2e9 + 7;
  46. const ll LINF = 1e18;
  47.    
  48. const int BUFSZ = (int)1e6 + 7;
  49. char buf[BUFSZ];
  50. string get_str()
  51. {
  52.     scanf(" %s", buf);
  53.     return string(buf);
  54. }
  55.  
  56. int solve()
  57. {
  58.     int n;
  59.     int root;
  60.     scanf("%d %d", &n, &root);
  61.     --root;
  62.     vector<vi> g(n);
  63.     vector<vi> ans(n);
  64.     for (int i = 0; i < n; ++i)
  65.     {
  66.         int sz;
  67.         scanf("%d", &sz);
  68.         g[i].resize(sz);
  69.         ans[i].resize(sz);
  70.         for (int j = 0; j < sz; ++j)
  71.         {
  72.             scanf("%d", &g[i][j]);
  73.             --g[i][j];
  74.         }
  75.     }
  76.     vector<ll> cnt(n);
  77.     auto cntinv = [&](ordered_set &tx, ordered_set &ty)
  78.     {
  79.         ll ans = 0;
  80.         if (tx.size() < ty.size())
  81.         {
  82.             for (int xx : tx)
  83.             {
  84.                 ans += ty.order_of_key(xx);
  85.             }
  86.         }
  87.         else
  88.         {
  89.             for (int yy : ty)
  90.             {
  91.                 ans += tx.size() - tx.order_of_key(yy);
  92.             }
  93.         }
  94.         return ans;
  95.     };
  96.     vector<ll> dp;
  97.     vi p;
  98.     function<void(int, ordered_set&)> dfs = [&](int u, ordered_set& cur)
  99.     {
  100.         int sz = g[u].size();
  101.         if (!sz)
  102.         {
  103.             cur.insert(u);
  104.             return;
  105.         }
  106.         vector<ordered_set> t(sz);
  107.         int it = 0;
  108.         for (int to : g[u])
  109.         {
  110.             dfs(to, t[it]);
  111.             ++it;
  112.             cnt[u] += cnt[to];
  113.         }
  114.         puts("IN");
  115.         vector<vector<ll>> lcnt(sz, vector<ll>(sz));
  116.         p.assign(1 << sz, -1);
  117.         dp.assign(1 << sz, LINF);
  118.         dp[0] = 0;
  119.         for (int i = 0; i < sz; ++i)
  120.         {
  121.             for (int j = i + 1; j < sz; ++j)
  122.             {
  123.                 lcnt[i][j] = cntinv(t[i], t[j]);
  124.                 lcnt[j][i] = (ll)t[i].size() * (ll)t[j].size() - lcnt[i][j];
  125.             }
  126.         }
  127.         puts("POSCHITALI INVERSII PAR");
  128.         for (int i = 0; i < sz; ++i)
  129.         {
  130.             if (cur.size() < t[i].size())
  131.                 cur.swap(t[i]);
  132.             for (auto &x : t[i])
  133.                 cur.insert(x);
  134.         }
  135.         puts("SLILI PARASHU");
  136.         for (int msk = 0; msk < (1 << sz); ++msk)
  137.         {
  138.             vi cur;
  139.             for (int i = 0; i < sz; ++i)
  140.             {  
  141.                 if ((msk >> i) & 1)
  142.                     cur.inb(i);
  143.             }
  144.             for (int i = 0; i < sz; ++i)
  145.             {
  146.                 if ((msk >> i) & 1)
  147.                     continue;
  148.                 ll w = 0;
  149.                 for (int x : cur)
  150.                 {
  151.                     w += lcnt[x][i];
  152.                 }
  153.                 if (dp[msk | (1 << i)] > dp[msk] + w)
  154.                 {
  155.                     dp[msk | (1 << i)] = dp[msk] + w;
  156.                     p[msk | (1 << i)] = i;
  157.                 }
  158.             }
  159.         }
  160.         puts("POSCHITALI DP");
  161.         vi res;
  162.         int cmsk = (1 << sz) - 1;
  163.         while (cmsk)
  164.         {
  165.             res.inb(p[cmsk]);
  166.             cmsk ^= (1 << p[cmsk]);
  167.         }
  168.         reverse(all(res));
  169.         for (int i = 0; i < sz; ++i)
  170.         {
  171.             ans[u][i] = g[u][res[i]] + 1;
  172.         }
  173.         cnt[u] += dp[(1 << sz) - 1] + (cur.size() - cur.order_of_key(u));
  174.         cur.insert(u);
  175.     };
  176.     ordered_set tupaset;
  177.     dfs(root, tupaset);
  178.     printf("%lld\n", cnt[root]);
  179.     for (int i = 0; i < n; ++i)
  180.     {
  181.         printf("%d ", (int)ans[i].size());
  182.         for (int x : ans[i])
  183.             printf("%d ", x);
  184.         puts("");
  185.     }
  186.     return 0;
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement