Advertisement
PikMike

Untitled

Apr 8th, 2017
563
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.27 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <iomanip>
  5. #include <string>
  6. #include <algorithm>
  7. #include <functional>
  8. #include <vector>
  9. #include <set>
  10. #include <unordered_set>
  11. #include <map>
  12. #include <unordered_map>
  13. #include <numeric>
  14. #include <queue>
  15. #include <cassert>
  16. #include <math.h>
  17. #include <stdio.h>
  18. #include <string.h>
  19.  
  20. #define pb push_back
  21. #define mp make_pair
  22. #define sz(x) (int)(x).size()
  23. #define li long long
  24. #define ld long double
  25. #define x first
  26. #define y second
  27. #define pt pair<int, int>
  28. #define pll pair<li, li>
  29. #define forn(i, t) for(int i = 0; i < (t); i++)
  30. #define fore(i, f, t) for(int i = (f); i < (t); i++)
  31. #define forr(i, f, t) for(int i = (f) - 1; i >= (t); i--)
  32. #define all(x) (x).begin(), (x).end()
  33. #define ins insert
  34.  
  35. using namespace std;
  36.  
  37. mt19937 myrand(time(NULL));
  38.  
  39.  
  40. const int INF = 1e9;
  41. const int MOD = 1000000007;
  42. const li INF64 = 2e18;
  43. const ld EPS = 1e-7;
  44.  
  45. const int N = 200 + 7;
  46.  
  47. int n;
  48. pt pos[N];
  49.  
  50.  
  51. bool read(){
  52.     if(scanf("%d", &n) != 1)
  53.         return 0;
  54.     memset(pos, 255, sizeof(pos));
  55.     int t;
  56.     forn(i, n * 2){
  57.         scanf("%d", &t);
  58.         --t;
  59.         if (pos[t].x == -1)
  60.             pos[t].x = i;
  61.         else
  62.             pos[t].y = i;
  63.     }
  64.     return 1;
  65. }
  66.  
  67.  
  68. struct ed{
  69.     int x, y, w, d, f;
  70.     ed(int x, int y, int w, int d, int f) : x(x), y(y), w(w), d(d), f(f) {};
  71.     ed(){};
  72. };
  73.  
  74.  
  75. bool operator <(const ed &a, const ed &b){
  76.     if (a.x != b.x)
  77.         return a.x < b.x;
  78.     return a.y < b.y;
  79. }
  80.  
  81.  
  82. bool operator ==(const ed &a, const ed &b){
  83.     return (a.x == b.x) && (a.y == b.y);
  84. }
  85.  
  86.  
  87. vector<ed> edges;
  88. int p[N];
  89.  
  90.  
  91. int blm(int v){
  92.     vector<int> d(2 * n + 2, INF);
  93.     d[v] = 0;
  94.     while (1){
  95.         bool fl = 0;
  96.         for (auto it = edges.begin(); it != edges.end(); it++){
  97.             auto e = *it;
  98.             if (e.f < e.d && d[e.x] < INF && d[e.y] > d[e.x] + e.w){
  99.                 d[e.y] = d[e.x] + e.w;
  100.                 p[e.y] = e.x;
  101.                 fl = 1;
  102.             }
  103.         }
  104.         if (!fl)
  105.             break;
  106.     }
  107.    
  108.     if (d[2 * n + 1] == INF)
  109.         return 0;
  110.    
  111.     int cur = 2 * n + 1, dt = INF;
  112.     while (cur != v){
  113.         auto it = lower_bound(all(edges), ed(p[cur], cur, 0, 0, 0));
  114.         dt = min(dt, it->d - it->f);
  115.  
  116.         cur = p[cur];
  117.     }
  118.    
  119.     cur = 2 * n + 1;
  120.     while (cur != v){
  121.         int tmp = lower_bound(all(edges), ed(p[cur], cur, 0, 0, 0)) - edges.begin();
  122.         int rtmp = lower_bound(all(edges), ed(cur, p[cur], 0, 0, 0)) - edges.begin();
  123.            
  124.         edges[tmp].f += dt;
  125.         edges[rtmp].f -= dt;
  126.        
  127.         cur = p[cur];
  128.     }
  129.    
  130.     return dt;
  131. }
  132.  
  133.  
  134. void solve(){
  135.     edges = vector<ed>();
  136.     forn(i, n){
  137.         forn(j, n){
  138.             edges.pb(ed(j + n, i, abs(pos[i].x - j) + abs(pos[i].y - j - n), 0, 0));
  139.             edges.pb(ed(i, j + n, abs(pos[i].x - j) + abs(pos[i].y - j - n), 1, 0));
  140.         }
  141.        
  142.         edges.pb(ed(2 * n + 1, i + n, 10000, 0, 0));
  143.         edges.pb(ed(i + n, 2 * n + 1, 10000, 1, 0));
  144.        
  145.         edges.pb(ed(i, 2 * n, 10000, 0, 0));
  146.         edges.pb(ed(2 * n, i, 10000, 1, 0));
  147.     }
  148.  
  149.     sort(all(edges));
  150.    
  151.     int res = blm(2 * n);
  152.     while (res)
  153.         res = blm(2 * n);
  154.  
  155.     int ans[N];
  156.     forn(i, n)
  157.         forn(j, n)
  158.             if (lower_bound(all(edges), ed(i, j + n, 0, 0, 0))->f != 0)
  159.                 ans[j] = i + 1;
  160.     forn(j, 2)
  161.         forn(i, n)
  162.             printf("%d ", ans[i]);
  163.     printf("\n");
  164. }
  165.  
  166.  
  167. int main(){
  168.     #ifdef _DEBUG
  169.         freopen("input.txt", "r", stdin);
  170.     #else
  171.         freopen("teams.in", "r", stdin);
  172.         freopen("teams.out", "w", stdout);
  173.     #endif
  174.    
  175.     while(read())
  176.         solve();
  177.     return 0;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement