#include <iostream> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <set> #include <string> #include <map> #include <bitset> using namespace std; #define int long long typedef long long ll; const ll mod = 1e9 + 7; pair<double, double> need[500][500]; signed main() { int n, m, l, r; while (scanf("%lld%lld%lld%lld", &n, &m, &l, &r) != EOF) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int tmp; scanf("%lld", &tmp); need[i][j] = make_pair(1.0 * l / tmp, 1.0 * r / tmp); } } bool flag = true; for (int i = 0; i < n - 1; ++i) { pair<double, double> k, tmpk; k = make_pair(need[i + 1][0].first / need[i][0].second, need[i + 1][0].second / need[i][0].first); for (int j = 1; j < m; ++j) { tmpk = make_pair(need[i + 1][j].first / need[i][j].second, need[i + 1][j].second / need[i][j].first); k = make_pair(max(k.first, tmpk.first), min(k.second, tmpk.second)); if (k.first > k.second) { flag = false; break; } } if (!flag) break; } if (!flag) { cout << "NO" << endl; return 0; } for (int i = 0; i < m - 1; ++i) { pair<double, double> k, tmpk; k = make_pair(need[0][i + 1].first / need[0][i].second, need[0][i + 1].second / need[0][i].first); for (int j = 1; j < n; ++j) { tmpk = make_pair(need[j][i + 1].first / need[j][i].second, need[j][i + 1].second / need[j][i].first); k = make_pair(max(k.first, tmpk.first), min(k.second, tmpk.second)); if (k.first > k.second) { flag = false; break; } } if (!flag) break; } if (!flag) { cout << "NO" << endl; return 0; } cout << "YES" << endl; } return 0; } |
Double click to view unformatted code.