#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
constexpr int M=2e3+7;
constexpr int oo=1e9+7;
constexpr long long ooll=1e18+7;
bool blocked[M][M];
bool o[M][M];
int dist[M][M];
pair<int,int>r[4]={{1,0}, {-1,0}, {0,1}, {0,-1}};
queue<pair<int,int> >Q;
int n, m;
void bfs(int x, int y){
int x2, x3, y2, y3;
Q.push({x,y});
while(Q.size()){
x2 = Q.front().first;
y2 = Q.front().second;
Q.pop();
if(o[x2][y2]) continue;
o[x2][y2]=1;
for(int i=0; i<4; i++){
x3 = x2 + r[i].first;
y3 = y2 + r[i].second;
if(x3<0 || x3>=n || y2<0 || y3>=m || blocked[x3][y3]) continue;
if(dist[x2][y2]+1 < dist[x3][y3]){
dist[x3][y3] = dist[x2][y2]+1;
Q.push({x3,y3});
}
}
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string s;
int k, howmany=0;
long long a, b, x, best=ooll, cur;
cin >> n >> m >> k;
for(int i=0; i<n; i++){
cin >> s;
for(int j=0; j<m; j++) blocked[i][j] = (s[j]=='X');
}
for(int i=0; i<n; i++) for(int j=0; j<m; j++) dist[i][j] = oo * (i || j);
bfs(0,0);
x = dist[n-1][m-1] - (n+m-2);
x>>=1;
while(k--){
cin >> a >> b;
cur = a*(n+m-2 + x) + b*x;
if(cur < best){
best = cur;
howmany=1;
}
else if(cur==best) howmany++;
}
cout << best << ' ' << howmany;
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; constexpr int M=2e3+7; constexpr int oo=1e9+7; constexpr long long ooll=1e18+7; bool blocked[M][M]; bool o[M][M]; int dist[M][M]; pair<int,int>r[4]={{1,0}, {-1,0}, {0,1}, {0,-1}}; queue<pair<int,int> >Q; int n, m; void bfs(int x, int y){ int x2, x3, y2, y3; Q.push({x,y}); while(Q.size()){ x2 = Q.front().first; y2 = Q.front().second; Q.pop(); if(o[x2][y2]) continue; o[x2][y2]=1; for(int i=0; i<4; i++){ x3 = x2 + r[i].first; y3 = y2 + r[i].second; if(x3<0 || x3>=n || y2<0 || y3>=m || blocked[x3][y3]) continue; if(dist[x2][y2]+1 < dist[x3][y3]){ dist[x3][y3] = dist[x2][y2]+1; Q.push({x3,y3}); } } } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); string s; int k, howmany=0; long long a, b, x, best=ooll, cur; cin >> n >> m >> k; for(int i=0; i<n; i++){ cin >> s; for(int j=0; j<m; j++) blocked[i][j] = (s[j]=='X'); } for(int i=0; i<n; i++) for(int j=0; j<m; j++) dist[i][j] = oo * (i || j); bfs(0,0); x = dist[n-1][m-1] - (n+m-2); x>>=1; while(k--){ cin >> a >> b; cur = a*(n+m-2 + x) + b*x; if(cur < best){ best = cur; howmany=1; } else if(cur==best) howmany++; } cout << best << ' ' << howmany; return 0; } |
English