結果
| 問題 |
No.3207 Digital Font
|
| コンテスト | |
| ユーザー |
Kude
|
| 提出日時 | 2025-07-18 22:39:01 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,624 bytes |
| コンパイル時間 | 3,719 ms |
| コンパイル使用メモリ | 318,060 KB |
| 実行使用メモリ | 35,512 KB |
| 最終ジャッジ日時 | 2025-07-18 22:39:14 |
| 合計ジャッジ時間 | 11,902 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 11 WA * 14 TLE * 1 -- * 12 |
ソースコード
#include<bits/stdc++.h>
namespace {
#pragma GCC diagnostic ignored "-Wunused-function"
#include<atcoder/all>
#pragma GCC diagnostic warning "-Wunused-function"
using namespace std;
using namespace atcoder;
#define rep(i,n) for(int i = 0; i < (int)(n); i++)
#define rrep(i,n) for(int i = (int)(n) - 1; i >= 0; i--)
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
template<class T> bool chmax(T& a, const T& b) { if (a < b) { a = b; return true; } else return false; }
template<class T> bool chmin(T& a, const T& b) { if (b < a) { a = b; return true; } else return false; }
using ll = long long;
using P = pair<int,int>;
using VI = vector<int>;
using VVI = vector<VI>;
using VL = vector<ll>;
using VVL = vector<VL>;
class mint61 {
using ull = unsigned long long;
using ui128 = __uint128_t;
public:
static constexpr unsigned long long mod = (1ULL << 61) - 1;
ull v = 0;
constexpr mint61() {}
explicit constexpr mint61(ull x) {
v = (x >> 61) + (x & mod);
if (v >= mod) v -= mod;
}
static constexpr mint61 raw(ull x) {
mint61 res;
res.v = x;
return res;
}
friend constexpr mint61 operator+(mint61 lhs, mint61 rhs) {
auto res = lhs.v + rhs.v;
return raw(res < mod ? res : res - mod);
}
friend constexpr mint61 operator-(mint61 lhs, mint61 rhs) {
return raw(lhs.v >= rhs.v ? lhs.v - rhs.v : mod + lhs.v - rhs.v);
}
static constexpr ull multiply_loose_mod(mint61 lhs, mint61 rhs) {
// ab = q(m+1)+r = qm+q+r
// q+r = ab-qm = ab-floor(ab/(m+1))m < ab-(ab/(m+1)-1)m = ab/(m+1)+m <=
// (m-1)^2/(m+1)+m = 2m-3+4/(m+1)
auto mul = ui128(lhs.v) * rhs.v;
return ull(mul >> 61) + ull(mul & mod);
}
friend constexpr mint61 operator*(mint61 lhs, mint61 rhs) {
auto res = multiply_loose_mod(lhs, rhs);
return raw(res < mod ? res : res - mod);
}
mint61& operator+=(mint61 rhs) { return *this = *this + rhs; }
mint61& operator-=(mint61 rhs) { return *this = *this - rhs; }
mint61& operator*=(mint61 rhs) { return *this = *this * rhs; }
friend constexpr bool operator==(const mint61& lhs, const mint61& rhs) {
return lhs.v == rhs.v;
}
friend ostream& operator<<(ostream& os, mint61 x) { return os << x.v; }
};
std::mt19937 RNG(std::chrono::system_clock::now().time_since_epoch().count());
unsigned long long RULL(unsigned long long L, unsigned long long R) {
assert(L < R);
return std::uniform_int_distribution<unsigned long long>(L, R - 1)(RNG);
}
const mint61 B = mint61::raw(RULL(1, mint61::mod));
constexpr int MXSIZE = 100010;
mint61 powB[2 * MXSIZE + 10];
auto init_Bs = [] {
powB[0] = mint61::raw(1);
for (int i = 0; i < 2 * MXSIZE + 9; i++) powB[i + 1] = powB[i] * B;
return false;
}();
using mint = mint61;
} int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int h, w;
cin >> h >> w;
bool flip = h > w;
if (flip) swap(h, w);
int n;
cin >> n;
auto f = [](int x) {
if (x == 6) return 9;
if (x == 9) return 6;
return x;
};
vector<vector<P>> data(h);
rep(_, n) {
int i, j, x;
cin >> i >> j >> x;
i--, j--;
if (flip) swap(i, j);
data[i].emplace_back(j, x);
}
vector<vector<mint>> rh1(h), rh2(h);
VVI idx1(h), idx2(h);
rep(i, h) {
auto& d = data[i];
int sz = d.size();
rh1[i].resize(sz + 1);
rh2[i].resize(sz + 1);
idx1[i].resize(sz);
idx2[i].resize(sz);
sort(all(d));
rep(j, sz) {
idx1[i][j] = d[j].first;
rh1[i][j+1] = rh1[i][j] + mint::raw(d[j].second) * powB[d[j].first];
}
reverse(all(d));
rep(j, sz) {
idx2[i][j] = w - 1 - d[j].first;
rh2[i][j+1] = rh2[i][j] + mint::raw(f(d[j].second)) * powB[w - 1 - d[j].first];
}
}
int q;
cin >> q;
rep(_, q) {
int il, jl, ir, jr;
cin >> il >> jl >> ir >> jr;
il--, jl--, ir--, jr--;
if (flip) swap(il, jl), swap(ir, jr);
bool ans = [&]() {
int jl1 = jl, jr1 = jr, jl2 = w - 1 - jr1, jr2 = w - 1 - jl1;
for (; il <= ir; il++, ir--) {
int pl1 = ranges::lower_bound(idx1[il], jl1) - idx1[il].begin();
int pr1 = ranges::lower_bound(idx1[il], jr1+1) - idx1[il].begin();
int pl2 = ranges::lower_bound(idx2[ir], jl2) - idx2[ir].begin();
int pr2 = pl2 + (pr1 - pl1);
if (pr2 > ssize(idx2[ir])) return false;
// int pr2 = ranges::lower_bound(idx2[ir], jr2+1) - idx2[ir].begin();
mint v1 = (rh1[il][pr1] - rh1[il][pl1]) * powB[MXSIZE - jl1];
mint v2 = (rh2[ir][pr2] - rh2[ir][pl2]) * powB[MXSIZE - jl2];
if (v1 != v2) return false;
}
return true;
}();
cout << (ans ? "Yes\n" : "No\n");
}
}
Kude