Advertisement
MinhNGUYEN2k4

Untitled

Dec 26th, 2021
863
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. //Nguyen Huu Hoang Minh
  2. #include <bits/stdc++.h>
  3. #define sz(x) int(x.size())
  4. #define all(x) x.begin(),x.end()
  5. #define reset(x) memset(x, 0,sizeof(x))
  6. #define pb push_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define N 5005
  11. #define remain(x) if (x > MOD) x -= MOD
  12. #define ii pair<int, int>
  13. #define iii pair<int, ii>
  14. #define iiii pair< ii , ii >
  15. #define viiii vector< iiii >
  16. #define vi vector<int>
  17. #define vii vector< ii >
  18. #define bit(x, i) (((x) >> (i)) & 1)
  19. #define Task "path"
  20. #define int long long
  21.  
  22. using namespace std;
  23.  
  24. typedef long double ld;
  25. const int inf = 1e10;
  26. const int minf = -1e10;
  27.  
  28. int m, n;
  29. int a[8][5005];
  30. int dp[3][5005];
  31. int q;
  32. int d[8][505][8][505];
  33. int dx[4] = {1,-1,0,0};
  34. int dy[4] = {0,0,1,-1};
  35.  
  36. bool ok(int x, int y){
  37.     return 1 <= x && x <= m && 1 <= y && y <= n;
  38. }
  39.  
  40. void readfile()
  41. {
  42.     ios_base::sync_with_stdio(false);
  43.     cin.tie(0);cout.tie(0);
  44.     if (fopen(Task".inp","r"))
  45.     {
  46.         freopen(Task".inp","r",stdin);
  47.         freopen(Task".out","w",stdout);
  48.     }
  49.     cin >> m >> n;
  50.     for(int i=1; i<=m; i++){
  51.         for(int j=1; j<=n; j++){
  52.             cin >> a[i][j];
  53.         }
  54.     }
  55. }
  56.  
  57. void solve1(){
  58.     memset(d, 0x3f3f3f3f3f3f3f3f, sizeof d);
  59.     cin >> q;
  60.     while (q--){
  61.         int x, y, u, v; cin >> x >> y >> u >> v;
  62.         if (d[x][y][u][v] < 0x3f3f3f3f3f3f3f3f) cout << d[x][y][u][v] << '\n';
  63.         else if (d[u][v][x][y] < 0x3f3f3f3f3f3f3f3f) cout << d[u][v][x][y] << '\n';
  64.         else{
  65.             priority_queue<iii, vector<iii>, greater<iii>> q;
  66.             q.push(iii(a[x][y],ii(x,y)));
  67.             d[x][y][x][y] = a[x][y];
  68.             while (q.size()){
  69.                 int uu = q.top().se.fi;
  70.                 int vv = q.top().se.se;
  71.                 int du = q.top().fi;
  72.                 q.pop();
  73.                 if (du != d[x][y][uu][vv]) continue;
  74.                 for(int k=0; k<4; k++){
  75.                     int xx = uu + dx[k];
  76.                     int yy = vv + dy[k];
  77.                     if (!ok(xx,yy)) continue;
  78.                     if (d[x][y][xx][yy] > d[x][y][uu][vv] + a[xx][yy]){
  79.                         d[x][y][xx][yy] = d[x][y][uu][vv] + a[xx][yy];
  80.                         q.push(iii(d[x][y][xx][yy],ii(xx,yy)));
  81.                     }
  82.                 }
  83.             }
  84.             cout << d[x][y][u][v] << '\n';
  85.         }
  86.     }
  87. }
  88.  
  89. void solve2(){
  90.     memset(dp, 0x3f3f3f3f3f3f3f, sizeof dp);
  91.     cin >> q;
  92.     while (q--){
  93.         int u, v, x, y; cin >> u >> v >> x >> y;
  94.         if (v > y){
  95.             swap(u,x); swap(v,y);
  96.         }
  97.         //cout << u << ' ' << v << ' ' << x << ' ' << y << endl;
  98.         dp[u][v] = a[u][v];
  99.         if (u==1) dp[2][v] = dp[u][v]+a[2][v];
  100.         else dp[1][v] = dp[u][v] + a[1][v];
  101.         for(int i=v+1; i<=y; i++){
  102.             dp[1][i] = dp[1][i-1] + a[1][i]; int t1 = dp[1][i];
  103.             dp[2][i] = dp[2][i-1] + a[2][i]; int t2 = dp[2][i];
  104.             dp[1][i] = min(dp[1][i], t2 + a[1][i]);
  105.             dp[2][i] = min(dp[2][i], t1 + a[2][i]);
  106.             //cout << dp[1][i] << ' ' << dp[2][i] << '\n';
  107.         }
  108.         cout << dp[x][y] << '\n';
  109.     }
  110. }
  111.  
  112. void proc()
  113. {
  114.     if (n<=500){
  115.         solve1();
  116.     }//40%
  117.     else if (m==2){
  118.         solve2();
  119.     }
  120. }
  121.  
  122. signed main()
  123. {
  124.     readfile();
  125.     proc();
  126.     return 0;
  127. }
  128.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement