Korotkodul

СПБГУ_А_OK

Dec 25th, 2021 (edited)
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. using namespace std;
  12. /*
  13. решение:
  14. 1)сделать граф
  15. 2)найти мин гамильтонов путь
  16. 3) ответ = мин гамильтонов путь + расстояние, чтобы дойти до стартовой вершины этого пути
  17.  
  18.  
  19. ЕСЛИ ТАКОЕ НЕ ЗАЙДЁТ хотя бы на 90 баллов:
  20. )посчитать за О(n^2), из какой вершины выгоднее стартовать = вершина start
  21. )посчитать минимальные гамильтоновы пути из каждой вершины
  22. )перебрать все сочетания за O(n) : (x, y), где x - длина пути до стартовой вершины, y - длина мин гамильтонова пути
  23.  
  24. */
  25. using ll = long long;
  26. using ld = long double;
  27. void cv(vector <int> &v){
  28.     for (auto x: v) cout<<x<<' ';
  29.     cout<<"\n\n";
  30. }
  31. int N;
  32. int inf = 1e9;
  33. vector <int> a, b;
  34. vector <vector <int>> G;
  35. void cG(){
  36.     for (int i = 0; i < N; ++i){
  37.         for (int j = 0; j < N; ++j){
  38.             cout<<"("<<i+1<<","<<j+1<<") = "<<G[i][j]<<"\n";
  39.         }cout<<"\n";
  40.     }cout<<"\n";
  41. }
  42. int mk(int x, int y){
  43.     int idx, idy, r = 0;
  44.     for (int i=0;i<N;++i){
  45.         if (a[i] == x){
  46.             idx = i;
  47.         }
  48.         else if (a[i] == y){
  49.             idy = i;
  50.         }
  51.     }
  52.     r += abs(idx - idy);
  53.  
  54.     for (int i=0;i<N;++i){
  55.         if (b[i] == x){
  56.             idx = i;
  57.         }
  58.         else if (b[i] == y){
  59.             idy = i;
  60.         }
  61.     }
  62.     r += abs(idx - idy);
  63.     return r;
  64. }
  65. vector <vector <int> > dp;
  66. string two(int x){
  67.     string r="";
  68.     while (x > 0){
  69.         r += ((x % 2) + 48);
  70.         x /= 2;
  71.     }
  72.  
  73.     while (r.size() != N){
  74.         r += '0';
  75.     }reverse(r.begin(), r.end());
  76.     return r;
  77. }
  78.  
  79. void wrk(){
  80.     for (int msk = 1; msk < (1 << N); ++msk){
  81.         //cout<<"mask = "<<two(msk)<<"\n";
  82.         for (int i = 0; i < N; ++i){
  83.                // cout<<"1<<i = "<< (1<<i)<<"\n";
  84.             //cout<<"i = "<<two(1<<i);
  85.             //cout<<"msk & (1 << i) = "<<msk & (1 << i)<<"\n";
  86.             if (!(msk & (1 << i))) {
  87.                     continue;
  88.             }
  89.  
  90.             for (int j = 0; j < N; ++j){
  91.                 if (msk & (1 << j)) continue;
  92.                 //cout<<"j = "<<two(1<<j)<<"\n";
  93.                 dp[msk | (1 << j)][j] = min(dp[msk | (1 << j)][j], dp[msk][i] + G[i][j]);
  94.             }
  95.             //cout<<"\n";
  96.         }//cout<<"\n";
  97.     }
  98. }
  99.  
  100. void cdp(){
  101.     for (auto x: dp){
  102.         for (auto y: x) cout<<y<<' ';
  103.         cout<<"\n";
  104.     }cout<<"\n";
  105. }
  106.  
  107. vector <int> srt_dst;
  108.  
  109. int v=0;
  110. int opt(){
  111.     int idx,dst;
  112.     for (int i = 0; i < N; ++i){
  113.         idx = 0;
  114.         dst = 0;
  115.         while (a[idx] != i){
  116.             idx++;
  117.         }
  118.         dst += idx;
  119.         idx = 0;
  120.         while (b[idx] != i){
  121.             idx++;
  122.         }
  123.         dst += idx;
  124.         srt_dst[i] = dst;
  125.     }
  126.     //cout<<"srt_dst\n";
  127.     //cv(srt_dst);
  128.     int mn = inf, mn_v = 1;
  129.     for (int i = 0; i < N; ++i){
  130.         /*cout<<"i = "<<i<<'\n';
  131.         cout<<"dp[1<<N - 1][i] = "<<dp[(1<<N) - 1][i]<<'\n';
  132.         cout<<"srt_dst[i] = "<<srt_dst[i]<<'\n';*/
  133.         if (dp[(1<<N) - 1][i] + srt_dst[i] < mn){
  134.             mn = dp[(1<<N) - 1][i] + srt_dst[i];
  135.             mn_v = i;
  136.  
  137.         }
  138.         //cout<<"mn = "<<mn<<'\n';
  139.     }
  140.     return mn_v;
  141. }
  142.  
  143. vector <int> gml; //gamilton way minimum
  144. void way(){
  145.     int msk = (1<<N) - 1, j = v;
  146.     gml.push_back(v);
  147.     while (gml.size() < N){
  148.             //cout<<"msk = "<<two(msk)<<'\n';
  149.         for (int i = 0; i < N; ++i){//xor ^ - ?
  150.             if (dp[msk][j] == dp[msk ^ (1<<j)][i] + G[i][j]){
  151.                 gml.push_back(i);
  152.                 msk = msk ^ (1 << j);
  153.                 j = i;
  154.                 break;
  155.             }
  156.         }
  157.         //cout<<"way\n";
  158.         //cv(gml);
  159.     }
  160.    //cout<<"way\n";
  161.     //cv(gml);
  162. }
  163.  
  164. string ans = "";
  165. void draw(){
  166.     vector <int> aid(N), bid(N);
  167.     for (int i = 0; i < N;++i){
  168.          //   cout<<"i a[i] b[i] = "<<i<<' '<<a[i]<<' '<<b[i]<<'\n';
  169.         aid[a[i]] = i;
  170.         bid[b[i]] = i;
  171.     }
  172.     /*cout<<"aid\n";
  173.     cv(aid);
  174.     cout<<"bid\n";
  175.     cv(bid);*/
  176.     //vector <int> gone;
  177.     int ax=0, bx=0, now=0;//indexes
  178.     while (now < N){
  179.             //cout<<"gml[now] = "<<gml[now]<<'\n';
  180.         while (a[ax] != gml[now]){
  181.             if (aid[gml[now]] < aid[a[ax]]){
  182.                 ax--;
  183.                 ans += 'L';
  184.             }
  185.             else {
  186.                 ax++;
  187.                 ans += 'R';
  188.             }
  189.         }
  190.         while (b[bx] != gml[now]){
  191.             if (bid[gml[now]] < bid[b[bx]]){
  192.                 bx--;
  193.                 ans += 'l';
  194.             }
  195.             else{
  196.                 bx++;
  197.                 ans += 'r';
  198.             }
  199.         }
  200.         now++;
  201.         //cout<<"ans = "<<ans<<'\n';
  202.     }
  203.     //cout<<"ans\n";
  204.     //cout<<ans<<"\n\n";
  205. }
  206.  
  207.  
  208. int main()
  209. {
  210.     /*ios::sync_with_stdio(0);
  211.     cin.tie(0);
  212.     cout.tie(0);*/
  213.     cin>>N;
  214.     G.resize(N, vector <int> (N, inf));
  215.     a.resize(N, inf); b.resize(N, inf);
  216.     for (int i = 0; i < N; ++i){
  217.         int inb; cin>>inb; inb--;
  218.         //cout<<"inb = "<<inb<<"\n";
  219.         a[i] = i;
  220.         b[inb] = i;
  221.     }
  222.     //cv(a);
  223.     //cv(b);
  224.     for (int i = 0; i < N; ++i){
  225.         for (int j = 0; j != i && j < N; ++j){
  226.             G[i][j] = G[j][i] = mk(i, j);
  227.         }
  228.     }
  229.     //cG();
  230.     //мин гамильтонов путь
  231.     dp.assign(1<<N, vector <int> (N, inf));
  232.     for (int i = 0; i < N; ++i){
  233.         dp[1<<i][i] = 0;
  234.     }
  235.     wrk();
  236.     //cdp();
  237.     srt_dst.assign(N, -1);
  238.     v = opt(); // most effective ending vertex
  239.     //cout<<"v = "<<v<<'\n';
  240.     way();
  241.     draw();
  242.     //reverse(ans.begin(),ans.end());
  243.     cout<<ans<<'\n';
  244. }
  245. /*
  246. 5
  247. 1 3 5 2 4
  248.  
  249. 6
  250. 3 6 4 1 5 2
  251.  
  252. lLLlllRrRRllRrrrRrr
  253. */
  254.  
  255.  
  256.  
Add Comment
Please, Sign In to add comment