제출 #1187804

#제출 시각아이디문제언어결과실행 시간메모리
1187804ByeWorldDigital Circuit (IOI22_circuit)C++20
100 / 100
361 ms39588 KiB
#include "circuit.h" #include <bits/stdc++.h> #define ll long long #define pb push_back #define fi first #define se second #define lf ((id<<1)) #define rg ((id<<1)|1) #define md ((l+r)>>1) using namespace std; const int MAXN = 3e5+10; const ll MOD = 1e9+2022; ll sum(ll a, ll b){ return (a+b)%MOD;} ll sub(ll a, ll b){ return (a+MOD-b)%MOD;} void chsum(ll &a, ll b){ a = (a+b)%MOD;} ll mul(ll a, ll b){ return (a*b)%MOD; } void chmul(ll &a, ll b){ a = (a*b)%MOD;} void chmn(auto &a, auto b){ a = min(a, b); } void chmx(auto &a, auto b){ a = max(a, b); } int n, m, par[MAXN], a[MAXN]; ll dp[MAXN][3], on[MAXN], val[MAXN]; vector<int> adj[MAXN]; ll run = 1; void dfs(int nw){ for(auto nx : adj[nw]) dfs(nx); val[nw] = run; if(adj[nw].size()) run = mul(run, adj[nw].size()); } void dfs2(int nw){ for(int i=adj[nw].size()-1; i>=0; i--) dfs2(adj[nw][i]); chmul(val[nw], run); if(adj[nw].size()) run = mul(run, adj[nw].size()); } struct node { ll zer = 0, one = 0; } NOL; struct seg { node st[4*MAXN]; int laz[4*MAXN]; node mrg(node a, node b){ node ret; ret.one = sum(a.one, b.one); ret.zer = sum(a.zer, b.zer); return ret; } void push(int id, int v){ swap(st[id].one, st[id].zer); laz[id] ^= v; } void bnc(int id){ if(laz[id]==0) return; push(lf,laz[id]); push(rg,laz[id]); laz[id] = 0; } void bd(int id, int l, int r){ if(l==r){ if(a[l+n] == 1){ st[id].one = val[l+n]; } else { st[id].zer = val[l+n]; } return; } bd(lf,l,md); bd(rg,md+1,r); st[id] = mrg(st[lf], st[rg]); } node upd(int id, int l, int r, int x, int y){ if(x<=l && r<=y){ push(id, 1); return st[id]; } if(r<x || y<l) return st[id]; bnc(id); return st[id] = mrg(upd(lf,l,md,x,y), upd(rg,md+1,r,x,y)); } } A; void init(int N, int M, std::vector<int> P, std::vector<int> AA) { n = N; m = M; for(int i=1; i<=n+m; i++){ par[i] = P[i-1]+1; adj[par[i]].pb(i); } dfs(1); run = 1; dfs2(1); // for(int i=1; i<=m; i++){ // a[i+n] = 1; // dfs(1); // val[i+n] = dp[1][1]; // cout << i << ' ' << val[i+n] << " pp\n"; // a[i+n] = 0; // } for(int i=1; i<=m; i++){ a[i+n] = AA[i-1]; } A.bd(1,1,m); } int count_ways(int L, int R) { int l = L+1, r = R+1; // for(int i=l; i<=r; i++) a[i] = 1-a[i]; A.upd(1,1,m,l-n,r-n); // for(int i=1; i<=13; i++){ // cout << i << ' ' <<dp[i][0] << ' ' << dp[i][1] << " xx\n"; // } return (int)A.st[1].one; }
#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...