제출 #1059474

#제출 시각아이디문제언어결과실행 시간메모리
1059474shiomusubi496디지털 회로 (IOI22_circuit)C++17
100 / 100
643 ms38064 KiB
#include "circuit.h" #include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (int)(n); ++i) #define rep2(i, a, b) for (int i = (int)(a); i < (int)(b); ++i) #define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i) #define rrep2(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); --i) #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) using namespace std; using ll = long long; template<class T, class U> bool chmin(T& a, const U& b) { return a > b ? a = b, true : false; } template<class T, class U> bool chmax(T& a, const U& b) { return a < b ? a = b, true : false; } constexpr ll MOD = 1000002022; template<class A> class LazySegmentTree { using M = typename A::M; using E = typename A::E; using T = typename M::T; using U = typename E::T; int n, h; vector<T> dat; vector<U> laz; void all_apply(int k, U x) { dat[k] = A::op(x, dat[k]); if (k < n) laz[k] = E::op(laz[k], x); } void eval(int k) { if (laz[k] == E::id()) return; all_apply(k * 2, laz[k]); all_apply(k * 2 + 1, laz[k]); laz[k] = E::id(); } void calc(int k) { dat[k] = M::op(dat[k * 2], dat[k * 2 + 1]); } public: LazySegmentTree() = default; LazySegmentTree(int n_) { n = 1, h = 0; while (n < n_) n *= 2, ++h; dat.assign(2 * n, M::id()); laz.assign(n, E::id()); } LazySegmentTree(vector<T> v) { n = 1, h = 0; while (n < v.size()) n *= 2, ++h; dat.assign(2 * n, M::id()); laz.assign(n, E::id()); rep (i, v.size()) dat[n + i] = v[i]; rrep2 (i, 1, n) calc(i); } void apply(int l, int r, U x) { l += n; r += n; rrep2 (i, 1, h + 1) { if (((l >> i) << i) != l) eval(l >> i); if (((r >> i) << i) != r) eval((r - 1) >> i); } for (int l2 = l, r2 = r; l2 < r2; l2 >>= 1, r2 >>= 1) { if (l2 & 1) all_apply(l2++, x); if (r2 & 1) all_apply(--r2, x); } rep2 (i, 1, h + 1) { if (((l >> i) << i) != l) calc(l >> i); if (((r >> i) << i) != r) calc((r - 1) >> i); } } T all_prod() const { return dat[1]; } }; struct Act { struct M { using T = pair<ll, ll>; static T op(T a, T b) { return {(a.first + b.first) % MOD, (a.second + b.second) % MOD}; } static T id() { return {0, 0}; } }; struct E { using T = bool; static T op(T a, T b) { return a ? !b : b; } static T id() { return false; } }; static pair<ll, ll> op(bool f, pair<ll, ll> a) { if (!f) return a; return {a.second, a.first}; } }; int N, M; vector<vector<int>> G; vector<int> A; vector<ll> coef; LazySegmentTree<Act> seg; void init(int N_, int M_, std::vector<int> P, std::vector<int> A_) { N = N_; M = M_; A = A_; G.assign(N + M, vector<int>()); rep2 (i, 1, N + M) G[P[i]].push_back(i); vector<ll> B(N + M, 1); { auto dfs = [&](auto&& self, int v) -> void { if (v >= N) return; for (int c : G[v]) self(self, c); B[v] = G[v].size(); for (int c : G[v]) (B[v] *= B[c]) %= MOD; }; dfs(dfs, 0); } coef.assign(M, 0); auto dfs = [&](auto&& self, int v, ll p) -> void { if (v >= N) { coef[v - N] = p; return; } int n = G[v].size(); vector<ll> cum1(n + 1, 1), cum2(n + 1, 1); rep (i, n) cum1[i + 1] = cum1[i] * B[G[v][i]] % MOD; rrep (i, n) cum2[i] = cum2[i + 1] * B[G[v][i]] % MOD; rep (i, n) self(self, G[v][i], p * (cum1[i] * cum2[i + 1] % MOD) % MOD); }; dfs(dfs, 0, 1); vector<pair<ll, ll>> X(M); rep (i, M) { if (A[i] == 0) X[i] = {0, coef[i]}; else X[i] = {coef[i], 0}; } seg = LazySegmentTree<Act>(X); } int count_ways(int L, int R) { L = L - N; R = R + 1 - N; seg.apply(L, R, true); return seg.all_prod().first; }

컴파일 시 표준 에러 (stderr) 메시지

circuit.cpp: In instantiation of 'LazySegmentTree<A>::LazySegmentTree(std::vector<typename A::M::T>) [with A = Act; typename A::M::T = std::pair<long long int, long long int>]':
circuit.cpp:141:33:   required from here
circuit.cpp:58:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int>, std::allocator<std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |         while (n < v.size()) n *= 2, ++h;
      |                ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...