Submission #892562

#TimeUsernameProblemLanguageResultExecution timeMemory
892562winter0101디지털 회로 (IOI22_circuit)C++17
100 / 100
738 ms26860 KiB
#include <bits/stdc++.h> #include "circuit.h" using namespace std; #define all(fl) fl.begin(),fl.end() #define pb push_back #define fi first #define se second #define for1(i,j,k) for(int i=j;i<=k;i++) #define for2(i,j,k) for(int i=j;i>=k;i--) #define for3(i,j,k,l) for(int i=j;i<=k;i+=l) #define lb lower_bound #define ub upper_bound #define sz(a) (int)a.size() #define pii pair<int,int> #define pli pair<long long,int> #define gcd __gcd #define lcm(x,y) x*y/__gcd(x,y) #define pil pair<int,long long> const long long du = 1000002022; const int maxn = 2e5 + 9; vector<int>a[maxn]; long long sub[maxn]; void dfs(int u) { sub[u] = 1; if (!a[u].empty()) { sub[u] = (sub[u] * sz(a[u])); for (auto v : a[u]) { dfs(v); sub[u] = (sub[u] * sub[v]) % du; } } } long long up[maxn]; void redfs(int u) { long long dd = 1; for (auto v : a[u]) { up[v] = (up[v] * up[u]) % du; up[v] = (up[v] * dd) % du; dd = (dd * sub[v]) % du; } reverse(all(a[u])); dd = 1; for (auto v : a[u]) { up[v] = (up[v] * dd) % du; dd = (dd * sub[v]) % du; } for (auto v : a[u]) { redfs(v); } } struct node { long long val, sum; int lazy; } st[maxn * 4]; int n, m; void build(int id, int l, int r) { st[id].lazy = 0; if (l == r) { st[id].val = st[id].sum = up[l + n]; return; } int mid = (l + r) / 2; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); st[id].sum = (st[id * 2].sum + st[id * 2 + 1].sum) % du; st[id].val = st[id].sum; } void push(int id) { if (st[id].lazy % 2 == 1) { st[id * 2].lazy += st[id].lazy; st[id * 2 + 1].lazy += st[id].lazy; st[id * 2].val = (st[id * 2].sum - st[id * 2].val + 2 * du) % du; st[id * 2 + 1].val = (st[id * 2 + 1].sum - st[id * 2 + 1].val + 2 * du) % du; st[id].lazy = 0; } else { st[id * 2].lazy += st[id].lazy; st[id * 2 + 1].lazy += st[id].lazy; st[id].lazy = 0; } } void update(int id, int l, int r, int u, int v) { if (l > v || r < u || u > v) return; if (u <= l && r <= v) { st[id].lazy++; st[id].val = (st[id].sum - st[id].val + 2 * du) % du; return; } int mid = (l + r) / 2; push(id); update(id * 2, l, mid, u, v); update(id * 2 + 1, mid + 1, r, u, v); st[id].val = (st[id * 2].val + st[id * 2 + 1].val) % du; } int count_ways(int l, int r) { l -= n - 1, r -= n - 1; update(1, 1, m, l, r); return st[1].val; } void init(int N, int M, vector<int>P, vector<int>A) { n = N, m = M; for1(i, 0, n + m - 1) { if (P[i] != -1) a[P[i] + 1].pb(i + 1); } dfs(1); for1(i, 1, n + m)up[i] = 1; redfs(1); build(1, 1, m); for1(i, 1, m)if (!A[i - 1]) update(1, 1, m, i, i); }
#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...