Advertisement
K_Y_M_bl_C

wa 5 dij

Dec 10th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef unsigned long long ull;
  7. typedef unsigned int ui;
  8. typedef vector<int> vi;
  9. typedef vector<ll> vll;
  10. typedef pair<int, int> pii;
  11.  
  12. #define all(v) v.begin(), v.end()
  13. #define mk make_pair
  14. #define forn(i, n) for(int i = 0; i < (int)n; ++i)
  15. #define X first
  16. #define Y second
  17. #define inb push_back
  18.  
  19. const int INF = (int)1e9 + 7;
  20.  
  21. int c, r, n;
  22. int ans = 0;
  23. vector <string> a;
  24. vector <int> slposl[2001], slposr[2001];
  25. vector <int> d[2001];
  26.  
  27. int dx[4] = { 0, -1, 1, 0 };
  28. int dy[4] = { -1, 0, 0, 1 };
  29.  
  30. void init()
  31. {
  32.     forn(i, n)
  33.     {
  34.         d[i].resize(a[i].size());
  35.         forn(j, a[i].size())
  36.         {
  37.             d[i][j] = INF;
  38.         }
  39.     }
  40. }
  41.  
  42. void dij()
  43. {
  44.     set< pair<int, pii> > q;
  45.     d[c][r] = 0;
  46.     q.insert(mk(0, mk(c, r)));
  47.     while (!q.empty())
  48.     {
  49.         int dst = (*q.begin()).X;
  50.         ans = max(ans, dst);
  51.         int s = (*q.begin()).Y.X;
  52.         int p = (*q.begin()).Y.Y;
  53.         q.erase((*q.begin()));
  54.         forn(i, 4)
  55.         {
  56.             int ns = s + dx[i];
  57.             int np = p + dy[i];
  58.             ns = max(0, ns);
  59.             ns = min(n - 1, ns);
  60.             np = max(0, np);
  61.             np = min((int)a[ns].size() - 1, np);
  62.             if (dst + 1 < d[ns][np])
  63.             {
  64.                 q.erase(mk(d[ns][np], mk(ns, np)));
  65.                 d[ns][np] = dst + 1;
  66.                 q.insert(mk(d[ns][np], mk(ns, np)));
  67.             }
  68.         }
  69.         if (dst + 1 < d[s][0])
  70.         {
  71.             q.erase(mk(d[s][0], mk(s, 0)));
  72.             d[s][0] = dst + 1;
  73.             q.insert(mk(d[s][0], mk(s, 0)));
  74.         }
  75.         if (dst + 1 < d[s][a[s].size() - 1])
  76.         {
  77.             q.erase(mk(d[s][a[s].size() - 1], mk(s, a[s].size() - 1)));
  78.             d[s][a[s].size() - 1] = dst + 1;
  79.             q.insert(mk(d[s][a[s].size() - 1], mk(s, a[s].size() - 1)));
  80.         }
  81.         //WORD L
  82.         {
  83.             int np = slposl[s][p];
  84.             if (dst + 2 < d[s][np])
  85.             {
  86.                 q.erase(mk(d[s][np], mk(s, np)));
  87.                 d[s][np] = dst + 2;
  88.                 q.insert(mk(d[s][np], mk(s, np)));
  89.             }
  90.         }
  91.         //WORD R
  92.         {
  93.             int np = slposr[s][p];
  94.             if (dst + 2 < d[s][np])
  95.             {
  96.                 q.erase(mk(d[s][np], mk(s, np)));
  97.                 d[s][np] = dst + 2;
  98.                 q.insert(mk(d[s][np], mk(s, np)));
  99.             }
  100.         }
  101.     }
  102. }
  103.  
  104. int solve()
  105. {
  106.     cin >> c >> r;
  107.     --c, --r;
  108.     string s;
  109.     getline(cin, s);
  110.     int i = 0;
  111.     while (getline(cin, s))
  112.     {
  113.         slposl[i].resize(s.size());
  114.         slposr[i].resize(s.size());
  115.         int cur = 0;
  116.         for (int j = 0; j < s.size(); ++j)
  117.         {
  118.             slposl[i][j] = cur;
  119.             if (s[j] == ' ')
  120.                 cur = j + 1;
  121.         }
  122.         cur = s.size() - 1;
  123.         for (int j = s.size() - 1; j >= 0; --j)
  124.         {
  125.             slposr[i][j] = cur;
  126.             if (s[j] == ' ')
  127.                 cur = j + 1;
  128.         }
  129.         a.inb(s);
  130.         ++i;
  131.     }
  132.     n = a.size();
  133.     init();
  134.     dij();
  135.     printf("%d", ans);
  136.     return 0;
  137. }
  138.  
  139. int main()
  140. {
  141.     #ifdef _DEBUG
  142.         freopen("input.txt", "r", stdin);
  143.         freopen("output.txt", "w", stdout);
  144.     #endif
  145.     solve();
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement