// while (clock()<=69*CLOCKS_PER_SEC)
// #pragma comment(linker, "/stack:200000000")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// #pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define pb push_back
#define SZ(x) ((int)(x).size())
#define ALL(x) x.begin(),x.end()
#define all(x) x.begin(),x.end()
#define fi first
#define se second
#define _upgrade ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define erase_duplicates(x) sort(all(x)); (x).resize(distance((x).begin(), unique(all(x))));
using namespace std;
using namespace __gnu_pbds;
template<typename T>
using ordered_set = tree<
T,
null_type,
less<T>,
rb_tree_tag,
tree_order_statistics_node_update>;
//X.find_by_order(k); - zwraca iterator na k-ty element (numeracja od zerowego)
//X.order_of_key(k); - zwraca liczbę elementów ostro mniejszych niż k
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;
typedef vector<PII> VPII;
typedef vector<PLL> VPLL;
typedef vector<LL> VLL;
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<char> VC;
typedef long double LD;
typedef pair<LD,LD> PLD;
typedef vector<LD> VLD;
typedef vector<PLD> VPLD;
template<class TH> void _dbg(const char *sdbg, TH h){ cerr<<sdbg<<" = "<<h<<endl; }
template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) {
while(*sdbg!=',')cerr<<*sdbg++;
cerr<<" = "<<h<<", "; _dbg(sdbg+1, a...);
}
#ifdef LOCAL
#define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
#else
#define dbg(...)
#define cerr if(0)cout
#endif
const int maxn = (2e3)+7;
const int maxk = 20;
const int inf = (1e9)+7;
const LL LLinf = ((LL)1e18)+7LL;
const LD eps = 1e-9;
const LL mod = 1e9+7;
// ***************************** CODE ***************************** //
int tab[maxn][maxn];
int dp[maxn][maxn];
VPII freeMoves = {{0, 1}, {1, 0}};
VPII paidMoves = {{-1, 0}, {0, -1}};
int n, m, k;
bool pole(int a, int b) {
return 1 <= a and a <= n and 1 <= b and b <= m and tab[a][b] == 0;
}
int main()
{
_upgrade
cin>>n>>m>>k;
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= m;j++) {
char a;
cin>>a;
if(a == '.') {
tab[i][j] = 0;
} else {
tab[i][j] = 1;
}
dp[i][j] = inf;
}
}
dp[1][1] = 0;
queue<PII> q;
q.push({1, 1});
while(SZ(q)) {
auto cur = q.front();
q.pop();
auto fun = [&](PII mov, int weight) {
PII pos = {cur.fi + mov.fi, cur.se + mov.se};
if(pole(pos.fi, pos.se)) {
if(dp[pos.fi][pos.se] == inf) {
dp[pos.fi][pos.se] = dp[cur.fi][cur.se] + weight;
q.push(pos);
}
}
};
for(auto mov : freeMoves) {
fun(mov, 0);
}
for(auto mov : paidMoves) {
fun(mov, 1);
}
}
PII res = {n + m - 2 + dp[n][m], dp[n][m]};
dbg(res.fi, res.se);
map<LL, int> mapa;
for(int i = 0;i < k;i++) {
LL a, b;
cin>>a>>b;
mapa[a * res.fi + b * res.se]++;
}
cout<<mapa.begin()->fi<<" "<<mapa.begin()->se;
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 123 124 125 126 127 128 129 | // while (clock()<=69*CLOCKS_PER_SEC) // #pragma comment(linker, "/stack:200000000") // #pragma GCC optimize("O3") // #pragma GCC optimize("Ofast") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") // #pragma GCC optimize("unroll-loops") #include<bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define pb push_back #define SZ(x) ((int)(x).size()) #define ALL(x) x.begin(),x.end() #define all(x) x.begin(),x.end() #define fi first #define se second #define _upgrade ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define erase_duplicates(x) sort(all(x)); (x).resize(distance((x).begin(), unique(all(x)))); using namespace std; using namespace __gnu_pbds; template<typename T> using ordered_set = tree< T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; //X.find_by_order(k); - zwraca iterator na k-ty element (numeracja od zerowego) //X.order_of_key(k); - zwraca liczbę elementów ostro mniejszych niż k typedef long long LL; typedef pair<int,int> PII; typedef pair<LL,LL> PLL; typedef vector<PII> VPII; typedef vector<PLL> VPLL; typedef vector<LL> VLL; typedef vector<int> VI; typedef vector<string> VS; typedef vector<char> VC; typedef long double LD; typedef pair<LD,LD> PLD; typedef vector<LD> VLD; typedef vector<PLD> VPLD; template<class TH> void _dbg(const char *sdbg, TH h){ cerr<<sdbg<<" = "<<h<<endl; } template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) { while(*sdbg!=',')cerr<<*sdbg++; cerr<<" = "<<h<<", "; _dbg(sdbg+1, a...); } #ifdef LOCAL #define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__) #else #define dbg(...) #define cerr if(0)cout #endif const int maxn = (2e3)+7; const int maxk = 20; const int inf = (1e9)+7; const LL LLinf = ((LL)1e18)+7LL; const LD eps = 1e-9; const LL mod = 1e9+7; // ***************************** CODE ***************************** // int tab[maxn][maxn]; int dp[maxn][maxn]; VPII freeMoves = {{0, 1}, {1, 0}}; VPII paidMoves = {{-1, 0}, {0, -1}}; int n, m, k; bool pole(int a, int b) { return 1 <= a and a <= n and 1 <= b and b <= m and tab[a][b] == 0; } int main() { _upgrade cin>>n>>m>>k; for(int i = 1;i <= n;i++) { for(int j = 1;j <= m;j++) { char a; cin>>a; if(a == '.') { tab[i][j] = 0; } else { tab[i][j] = 1; } dp[i][j] = inf; } } dp[1][1] = 0; queue<PII> q; q.push({1, 1}); while(SZ(q)) { auto cur = q.front(); q.pop(); auto fun = [&](PII mov, int weight) { PII pos = {cur.fi + mov.fi, cur.se + mov.se}; if(pole(pos.fi, pos.se)) { if(dp[pos.fi][pos.se] == inf) { dp[pos.fi][pos.se] = dp[cur.fi][cur.se] + weight; q.push(pos); } } }; for(auto mov : freeMoves) { fun(mov, 0); } for(auto mov : paidMoves) { fun(mov, 1); } } PII res = {n + m - 2 + dp[n][m], dp[n][m]}; dbg(res.fi, res.se); map<LL, int> mapa; for(int i = 0;i < k;i++) { LL a, b; cin>>a>>b; mapa[a * res.fi + b * res.se]++; } cout<<mapa.begin()->fi<<" "<<mapa.begin()->se; return 0; } |
English