Submission #1238558

#TimeUsernameProblemLanguageResultExecution timeMemory
1238558Muhammad_AneeqDigital Circuit (IOI22_circuit)C++17
6 / 100
314 ms32756 KiB
#include "circuit.h" #include <vector> #include <iostream> #include <algorithm> #include <deque> using namespace std; #define ll long long struct node { ll on=0,of=0,swp=0; }; int const NPM=2e5+10,mod=1000002022; vector<int>nei[NPM]={}; long long dp[NPM]={}; vector<long long>pre[NPM]={}; vector<long long>suf[NPM]={}; int ans[NPM]={}; bool op[NPM]={}; node seg[4*NPM]={}; int n,m; long long mul(ll a,ll b) { return (a*b)%mod; } long long add(ll a,ll b) { return (a+b)%mod; } void build(int i,int st,int en) { if (st==en) { if (op[st]) seg[i].on=ans[st]; else seg[i].of=ans[st]; return; } int mid=(st+en)/2; build(i*2,st,mid); build(i*2+1,mid+1,en); seg[i].on=add(seg[i*2].on,seg[i*2+1].on); seg[i].of=add(seg[i*2].of,seg[i*2+1].of); } void push(int i) { for (int j=2*i;j<=2*i+1;j++) { seg[j].swp^=1; swap(seg[j].on,seg[j].of); } seg[i].swp=0; } void update(int i,int st,int en,int l,int r) { if (st>=l&&en<=r) { swap(seg[i].on,seg[i].of); seg[i].swp=1; return; } if (st>r||en<l) return; if (seg[i].swp) push(i); int mid=(st+en)/2; update(i*2,st,mid,l,r);update(i*2+1,mid+1,en,l,r); seg[i].on=add(seg[i*2].on,seg[i*2+1].on); seg[i].of=add(seg[i*2].of,seg[i*2+1].of); } void comp(int u,ll val=1) { if (u>=n) ans[u-n]=val; int sz=nei[u].size(); for (int i=0;i<sz;i++) comp(nei[u][i],mul(mul(val,pre[u][i]),suf[u][i+1])); } void dfs(int u) { dp[u]=1; pre[u]={1}; suf[u]={1}; if (nei[u].size()==0) return; for (auto i:nei[u]) { dfs(i); dp[u]=mul(dp[i],dp[u]); pre[u].push_back(mul(pre[u].back(),dp[i])); } dp[u]=mul(dp[u],nei[u].size()); int sz=nei[u].size(); for (int i=sz-1;i>=0;i--) suf[u].push_back(mul(suf[u].back(),dp[nei[u][i]])); reverse(begin(suf[u]),end(suf[u])); } void init(int N, int M, vector<int> P, vector<int> A) { n=N; m=M; for (int i=1;i<n+m;i++) nei[P[i]].push_back(i); dfs(0); comp(0); for (int i=0;i<m;i++) op[i]=A[i]; build(1,0,m-1); } int count_ways(int L, int R) { update(1,0,m-1,L-n,R-n); return seg[1].on; }
#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...