///MEMENTO MEMO, MEMENTO LONG LONG
#include <bits/stdc++.h>
#define DEBUG if(0)
#define COUT cout << "\e[36m"
#define ENDL "\e[39m" << endl
#define VAR(v) " [\e[32m" << #v << "\e[36m=\e[91m" << v << "\e[36m] "
using namespace std;
typedef long long LL;
int n, m;
struct Box
{
bool evil;
int ad = -1, bd = -1;
};
vector<vector<Box>> carte;
struct XY
{
int x, y;
};
bool inRange(XY xy)
{
return (xy.x >= 0 && xy.y >= 0 && xy.x < n && xy.y < m);
}
bool inRange(int x, int y)
{
return inRange({x,y});
}
void bfs(/*from 0,0*/)
{
int x4[4] = {1,0,-1,0};
int y4[4] = {0,1,0,-1};
int a4[4] = {1,1,0,0};
int b4[4] = {0,0,1,1};
queue<XY> que;
que.push({0,0});
carte[0][0].ad = 0;
carte[0][0].bd = 0;
while(!que.empty())
{
XY xy = que.front();
que.pop();
//DEBUG COUT << VAR(xy.x) << VAR(xy.y) << ENDL;
for (int i = 0; i < 4; ++i)
{
if(inRange(xy.x+x4[i], xy.y+y4[i]) &&
-1 == carte[xy.x+x4[i]][xy.y+y4[i]].ad && !(carte[xy.x+x4[i]][xy.y+y4[i]].evil) )
{
carte[xy.x+x4[i]][xy.y+y4[i]].ad = carte[xy.x][xy.y].ad+a4[i];
carte[xy.x+x4[i]][xy.y+y4[i]].bd = carte[xy.x][xy.y].bd+b4[i];
que.push({xy.x+x4[i], xy.y+y4[i]});
}
}
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int k;
cin >> n >> m >> k;
carte.resize(n, vector<Box>(m));
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j) {
char ch;
cin >> ch;
carte[i][j].evil = (ch == 'X');
}
}
bfs();
DEBUG COUT << "a:" << carte[n-1][m-1].ad << " b:" << carte[n-1][m-1].bd << ENDL;
LL ad = carte[n-1][m-1].ad;
LL bd = carte[n-1][m-1].bd;
DEBUG
{
for(auto el : carte)
{
for(auto box : el)
COUT << setw(2)<< box.ad << "|" << box.bd << " ";
COUT << ENDL;
}
};
LL mintime = 1e18;
int mincnt =0;
for (int i = 0; i < k; ++i)
{
LL a, b;
cin >> a >> b;
if(mintime > ad*a+bd*b)
{
mintime = ad*a+bd*b;
mincnt = 0;
}
if(mintime == ad*a+bd*b)
{
mincnt++;
}
}
cout << mintime << " " << mincnt << "\n";
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | ///MEMENTO MEMO, MEMENTO LONG LONG #include <bits/stdc++.h> #define DEBUG if(0) #define COUT cout << "\e[36m" #define ENDL "\e[39m" << endl #define VAR(v) " [\e[32m" << #v << "\e[36m=\e[91m" << v << "\e[36m] " using namespace std; typedef long long LL; int n, m; struct Box { bool evil; int ad = -1, bd = -1; }; vector<vector<Box>> carte; struct XY { int x, y; }; bool inRange(XY xy) { return (xy.x >= 0 && xy.y >= 0 && xy.x < n && xy.y < m); } bool inRange(int x, int y) { return inRange({x,y}); } void bfs(/*from 0,0*/) { int x4[4] = {1,0,-1,0}; int y4[4] = {0,1,0,-1}; int a4[4] = {1,1,0,0}; int b4[4] = {0,0,1,1}; queue<XY> que; que.push({0,0}); carte[0][0].ad = 0; carte[0][0].bd = 0; while(!que.empty()) { XY xy = que.front(); que.pop(); //DEBUG COUT << VAR(xy.x) << VAR(xy.y) << ENDL; for (int i = 0; i < 4; ++i) { if(inRange(xy.x+x4[i], xy.y+y4[i]) && -1 == carte[xy.x+x4[i]][xy.y+y4[i]].ad && !(carte[xy.x+x4[i]][xy.y+y4[i]].evil) ) { carte[xy.x+x4[i]][xy.y+y4[i]].ad = carte[xy.x][xy.y].ad+a4[i]; carte[xy.x+x4[i]][xy.y+y4[i]].bd = carte[xy.x][xy.y].bd+b4[i]; que.push({xy.x+x4[i], xy.y+y4[i]}); } } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int k; cin >> n >> m >> k; carte.resize(n, vector<Box>(m)); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { char ch; cin >> ch; carte[i][j].evil = (ch == 'X'); } } bfs(); DEBUG COUT << "a:" << carte[n-1][m-1].ad << " b:" << carte[n-1][m-1].bd << ENDL; LL ad = carte[n-1][m-1].ad; LL bd = carte[n-1][m-1].bd; DEBUG { for(auto el : carte) { for(auto box : el) COUT << setw(2)<< box.ad << "|" << box.bd << " "; COUT << ENDL; } }; LL mintime = 1e18; int mincnt =0; for (int i = 0; i < k; ++i) { LL a, b; cin >> a >> b; if(mintime > ad*a+bd*b) { mintime = ad*a+bd*b; mincnt = 0; } if(mintime == ad*a+bd*b) { mincnt++; } } cout << mintime << " " << mincnt << "\n"; return 0; } |
English