fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define nn "\n"
  6. #define pb push_back
  7.  
  8. // N = 10005 để an toàn cho 1e4
  9. const int N = 10005;
  10. const int INF = 1e9; // Dùng int lớn thay cho 1e18 để tiết kiệm bộ nhớ
  11.  
  12. // Sử dụng mảng tĩnh 2 chiều.
  13. // d[u][v] lưu khoảng cách ngắn nhất về đích.
  14. // Vì chi phí đi cạnh và chéo là cố định, ta có thể rút gọn 2 trạng thái thành 1.
  15. int d[N][N];
  16.  
  17. int n, k;
  18. vector<pair<int, int>> K;
  19. int dx[] = {-1, 1, 0, 0, -1, -1, 1, 1};
  20. int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
  21.  
  22. struct node {
  23. int kc, u, v;
  24. bool operator>(const node& other) const {
  25. return kc > other.kc;
  26. }
  27. };
  28.  
  29. void dijkstra(int sx, int sy) {
  30. priority_queue<node, vector<node>, greater<node>> pq;
  31.  
  32. // Khởi tạo mảng d bằng INF
  33. for(int i = 1; i <= n; i++)
  34. for(int j = 1; j <= n; j++) d[i][j] = INF;
  35.  
  36. d[sx][sy] = 0;
  37. pq.push({0, sx, sy});
  38.  
  39. while(!pq.empty()){
  40. auto [kc, u, v] = pq.top(); pq.pop();
  41.  
  42. if(kc > d[u][v]) continue;
  43.  
  44. // Tính toán lân cận trực tiếp, không dùng danh sách kề
  45. for(int dir = 0; dir < 8; dir++){
  46. int nx = u + dx[dir];
  47. int ny = v + dy[dir];
  48. int cost = (dir < 4) ? 10 : 15;
  49.  
  50. if(nx >= 1 && nx <= n && ny >= 1 && ny <= n){
  51. if(d[nx][ny] > d[u][v] + cost){
  52. d[nx][ny] = d[u][v] + cost;
  53. pq.push({d[nx][ny], nx, ny});
  54. }
  55. }
  56. }
  57. }
  58. }
  59.  
  60. void solve(){
  61. int mid = (n + 1) / 2;
  62. dijkstra(mid, mid);
  63.  
  64. long long sum = 0;
  65. for(auto [x, y] : K){
  66. sum += d[x][y];
  67. }
  68. cout << sum << nn;
  69. }
  70.  
  71. int main(){
  72. ios_base::sync_with_stdio(0);
  73. cin.tie(0);
  74.  
  75. cin >> n >> k;
  76. for(int i = 0; i < k; i++){
  77. int x, y;
  78. cin >> x >> y;
  79. K.pb({x, y});
  80. }
  81.  
  82. solve();
  83. return 0;
  84. }
Success #stdin #stdout 0s 5324KB
stdin
5
2
1 1
2 3
stdout
40