Submission #1110137

#TimeUsernameProblemLanguageResultExecution timeMemory
1110137ASN49KDigital Circuit (IOI22_circuit)C++17
100 / 100
2089 ms39412 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; const int N=100'000,mod=1e9+2022; #define int long long int add(int x,int y) { assert(y>=0 && y<mod); assert(x>=0 && x<mod); return (x+y)%mod; } void add_self(int& x,int y) { assert(y>=0 && y<mod); assert(x>=0 && x<mod); x+=y; if(x>=mod) { x-=mod; } if(x<0) { x+=mod; } } int prod(int x,int y) { assert(y>=0 && y<mod); assert(x>=0 && x<mod); return (1LL*x*y)%mod; } int n,m; vector<signed>g[2*N],a; bool lazy[5*N]; int aint[5*N][2],dp[2*N],produs[2*N]; void push_down(int nod) { if(lazy[nod]) { swap(aint[2*nod+1][0] , aint[2*nod+1][1]); swap(aint[2*nod+2][0] , aint[2*nod+2][1]); lazy[2*nod+1]^=true; lazy[2*nod+2]^=true; lazy[nod]=false; } } void recalc(int nod) { int l=2*nod+1,r=2*nod+2; aint[nod][0]=add(aint[l][0],aint[r][0]); aint[nod][1]=add(aint[l][1],aint[r][1]); } void build(int nod,int st,int dr) { if(st==dr) { aint[nod][a[st]^1]=dp[st+n]; return; } int m=(st+dr)/2; build(2*nod+1,st,m); build(2*nod+2,m+1,dr); recalc(nod); } void update(int nod,int st,int dr,int l,int r) { if(st>r || dr<l) { return; } if(l<=st && dr<=r) { lazy[nod]^=true; swap(aint[nod][0] , aint[nod][1]); return; } int m=(st+dr)/2; push_down(nod); update(2*nod+1,st,m,l,r); update(2*nod+2,m+1,dr,l,r); recalc(nod); } void dfs1(int nod) { produs[nod]=max(1LL,(int)g[nod].size()); for(auto &c:g[nod]) { dfs1(c); produs[nod]=prod(produs[nod] , produs[c]); } } void dfs2(int nod) { int sz=(int)g[nod].size(); if(g[nod].empty()) { return; } vector<int>suf(sz,1),pref(sz,1); for(int i=1;i<sz;i++) { suf[i]=prod(suf[i-1],produs[g[nod][i-1]]); } for(int i=sz-2;i>=0;i--) { pref[i]=prod(pref[i+1],produs[g[nod][i+1]]); } for(int i=0;i<sz;i++) { int c=g[nod][i]; dp[c]=prod(dp[nod] , prod(suf[i] , pref[i])); dfs2(c); } } void init(signed nn, signed mm, std::vector<signed> pp, std::vector<signed> init_a) { n=nn; m=mm; for(int i=1;i<n+m;i++) { g[pp[i]].push_back(i); } a=init_a; dp[0]=1; dfs1(0); dfs2(0); build(0,0,m-1); } signed count_ways(signed l, signed r) { l-=n; r-=n; update(0,0,m-1,l,r); return aint[0][0]; }
#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...