Submission #1213313

#TimeUsernameProblemLanguageResultExecution timeMemory
1213313simona1230Digital Circuit (IOI22_circuit)C++20
100 / 100
397 ms27920 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; const long long mod=1000002022; const int maxn=100000*2+5; int n,m; vector<int> v[maxn]; long long c[maxn],all=1; long long mult(long long x,long long p) { if(p==1)return x; long long h=mult(x,p/2); if(p%2==0)return h*h%mod; return h*h%mod*x%mod; } int a[maxn]; void dfs(int i) { c[i]=v[i].size(); if(v[i].size()==0)c[i]=1; for(int j=0;j<v[i].size();j++) { int nb=v[i][j]; dfs(nb); c[i]*=c[nb]; c[i]%=mod; } all*=c[i]; all%=mod; //cout<<i<<" "<<c[i]<<endl; } long long b[200001]; long long c1[200001],c2[200001]; void dfs0(int i,int h) { if(v[i].size()==0) { //cout<<i<<" "<<h<<endl; b[i]=h; } for(int j=0;j<v[i].size();j++) { int nb=v[i][j]; c1[nb]=c[nb]; if(j!=0)c1[nb]*=c1[v[i][j-1]]; c1[nb]%=mod; } for(int j=v[i].size()-1;j>=0;j--) { int nb=v[i][j]; c2[nb]=c[nb]; if(j!=v[i].size()-1)c2[nb]*=c2[v[i][j+1]]; c2[nb]%=mod; } for(int j=0;j<v[i].size();j++) { int nb=v[i][j]; long long curr=h; if(j!=0)curr*=c1[v[i][j-1]]; curr%=mod; if(j!=v[i].size()-1)curr*=c2[v[i][j+1]]; curr%=mod; dfs0(nb,curr); } } int sum[4*maxn],sw[4*maxn],add[4*maxn]; void build(int i,int l,int r) { if(l==r) { sum[i]=b[l]; if(a[l])add[i]=b[l]; sw[i]=0; return; } int md=(l+r)/2; build(i*2,l,md); build(i*2+1,md+1,r); sum[i]=sum[i*2]+sum[i*2+1]; sw[i]=0; add[i]=add[i*2]+add[i*2+1]; sum[i]%=mod; add[i]%=mod; } void pushsw(int i,int l,int r) { if(sw[i]==0)return; add[i]=sum[i]-add[i]; if(add[i]<0)add[i]+=mod; sw[i]=0; if(l!=r) { sw[i*2]^=1; sw[i*2+1]^=1; } } void update(int i,int l,int r,int ql,int qr) { //cout<<i<<" "<<l<<" "<<r<<" "<<ql<<" "<<qr<<endl; pushsw(i,l,r); if(ql>qr)return; if(ql<=l&&r<=qr) { sw[i]^=1; pushsw(i,l,r); return; } int md=(l+r)/2; update(i*2,l,md,ql,min(qr,md)); update(i*2+1,md+1,r,max(ql,md+1),qr); add[i]=add[i*2]+add[i*2+1]; add[i]%=mod; } void init(int N, int M, std::vector<int> P, std::vector<int> A) { n=N; m=M; for(int i=1;i<P.size();i++) v[P[i]].push_back(i); for(int i=0;i<A.size();i++) a[n+i]=A[i]; dfs(0); dfs0(0,1); build(1,n,n+m-1); return; } int count_ways(int L, int R) { /*for(int i=L;i<=R;i++) { a[i]^=1; } long long ans=0; for(int i=n;i<=n+m-1;i++) if(a[i])ans=(ans+b[i])%mod;*/ update(1,n,n+m-1,L,R); return add[1]; }
#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...