結果
問題 | No.2540 同値性判定 |
ユーザー |
![]() |
提出日時 | 2023-11-10 23:53:21 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 49 ms / 2,500 ms |
コード長 | 3,780 bytes |
コンパイル時間 | 3,731 ms |
コンパイル使用メモリ | 281,668 KB |
実行使用メモリ | 51,724 KB |
最終ジャッジ日時 | 2024-09-26 02:27:52 |
合計ジャッジ時間 | 7,610 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 37 |
ソースコード
#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>;template <class F, F (*composition)(F, F), F (*id)()> struct dual_segtree {public:dual_segtree() : dual_segtree(0) {}explicit dual_segtree(int n) : dual_segtree(std::vector<F>(n, id())) {}explicit dual_segtree(const std::vector<F>& v) : _n(int(v.size())) {auto ceil_log2 = [](int n) {int x = 0;while ((1U << x) < (unsigned int)(n)) x++;return x;};log = ceil_log2(_n);size = 1 << log;lz = std::vector<F>(2 * size, id());for (int i = 0; i < _n; i++) lz[size + i] = v[i];}void set(int p, F x) {assert(0 <= p && p < _n);p += size;for (int i = log; i >= 1; i--) push(p >> i);lz[p] = x;}F get(int p) {assert(0 <= p && p < _n);p += size;for (int i = log; i >= 1; i--) push(p >> i);return lz[p];}void apply(int p, F f) {assert(0 <= p && p < _n);p += size;for (int i = log; i >= 1; i--) push(p >> i);lz[p] = composition(f, lz[p]);}void apply(int l, int r, F f) {assert(0 <= l && l <= r && r <= _n);if (l == r) return;l += size;r += size;for (int i = log; i >= 1; i--) {if (((l >> i) << i) != l) push(l >> i);if (((r >> i) << i) != r) push((r - 1) >> i);}while (l < r) {if (l & 1) all_apply(l++, f);if (r & 1) all_apply(--r, f);l >>= 1;r >>= 1;}}void push_all() {for (int i = 1; i < size; i++) push(i);}F get_raw(int p) {assert(0 <= p && p < _n);return lz[size + p];}private:int _n, size, log;std::vector<F> lz;void all_apply(int k, F f) {lz[k] = composition(f, lz[k]);}void push(int k) {all_apply(2 * k, lz[k]);all_apply(2 * k + 1, lz[k]);lz[k] = id();}};using ull = unsigned long long;struct F {ull a, b;};F composition(F f, F g) {// fa(gax+gb)+fbreturn F{f.a & g.a, (f.a & g.b) ^ f.b};}F id() { return {~0ULL, 0}; }} int main() {ios::sync_with_stdio(false);cin.tie(0);int n, q;cin >> n >> q;ull p[6]{};rep(s, 1 << 6) {rep(k, 6) p[k] |= ull(s >> k & 1) << s;}vector<F> init(n);rep(i, n) init[i] = F{0ULL, p[i % 6]};dual_segtree<F, composition, id> seg(init);rep(_, q) {int h, l1, r1, l2, r2;string o;cin >> h >> o >> l1 >> r1 >> l2 >> r2;r1++, r2++;ull y = seg.get(h).b;F f;if (o == "land") {f = F{y, 0};} else if (o == "lor") {f = F{y ^ ~0ULL, y};} else {assert(o == "Rightarrow");f = F{y ^ ~0ULL, ~0ULL};}seg.apply(l1, r1, f);set<ull> seen;bool ok = false;for (int i = l2; i < r2; i++) {ull x = seg.get(i).b;if (seen.contains(x)) {ok = true;break;}seen.insert(x);}cout << (ok ? "Yes\n" : "No\n");}}