#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 2003, MAXK = 1e6 + 6; char tab[MAXN][MAXN]; int dist[MAXN][MAXN]; ll ans[MAXK]; ll n, m, k; typedef pair<pair<ll,int>,int> P; #define f first.first #define s first.second #define t second priority_queue <P> Q; const int dx[4] = {0,1,0,-1}, dy[4] = {1,0,-1,0}; ll dijkstra(int x, int y) { dist[x][y] = 0; Q.push({{0,x},y}); while(!Q.empty()) { x = Q.top().s, y = Q.top().t; ll v = -Q.top().f; Q.pop(); for(int i = 0; i < 4; i++) { int X = x + dx[i], Y = y + dy[i], d = (X < x || Y < y) ? 1 : 0; if(tab[X][Y] == '.' && v + d < dist[X][Y]) { dist[X][Y] = v + d; Q.push({{-dist[X][Y],X},Y}); } } } return dist[n][m]; } int main() { ios_base::sync_with_stdio(false); cin >> n >> m >> k; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) cin >> tab[i][j], dist[i][j] = INT_MAX; ll x = dijkstra(1,1); ll mx = LLONG_MAX; for(int i = 1; i <= k; i++) { ll a, b; cin >> a >> b; ans[i] = (n+m-2)*a + x*(a+b); mx = min(mx,ans[i]); } int r = 0; for(int i = 1; i <= k; i++) if(ans[i] == mx) r++; cout << mx << " " << r; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 2003, MAXK = 1e6 + 6; char tab[MAXN][MAXN]; int dist[MAXN][MAXN]; ll ans[MAXK]; ll n, m, k; typedef pair<pair<ll,int>,int> P; #define f first.first #define s first.second #define t second priority_queue <P> Q; const int dx[4] = {0,1,0,-1}, dy[4] = {1,0,-1,0}; ll dijkstra(int x, int y) { dist[x][y] = 0; Q.push({{0,x},y}); while(!Q.empty()) { x = Q.top().s, y = Q.top().t; ll v = -Q.top().f; Q.pop(); for(int i = 0; i < 4; i++) { int X = x + dx[i], Y = y + dy[i], d = (X < x || Y < y) ? 1 : 0; if(tab[X][Y] == '.' && v + d < dist[X][Y]) { dist[X][Y] = v + d; Q.push({{-dist[X][Y],X},Y}); } } } return dist[n][m]; } int main() { ios_base::sync_with_stdio(false); cin >> n >> m >> k; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) cin >> tab[i][j], dist[i][j] = INT_MAX; ll x = dijkstra(1,1); ll mx = LLONG_MAX; for(int i = 1; i <= k; i++) { ll a, b; cin >> a >> b; ans[i] = (n+m-2)*a + x*(a+b); mx = min(mx,ans[i]); } int r = 0; for(int i = 1; i <= k; i++) if(ans[i] == mx) r++; cout << mx << " " << r; return 0; } |