Submission #1110065

#TimeUsernameProblemLanguageResultExecution timeMemory
1110065ASN49KDigital Circuit (IOI22_circuit)C++17
16 / 100
2098 ms8284 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; const int N=100'000,mod=1e9+2022; int add(int x,int y) { return (x+y)%mod; } void add_self(int& x,int y) { x+=y; if(x>=mod) { x-=mod; } if(x<0) { x+=mod; } } int prod(int x,int y) { return (1LL*x*y)%mod; } int n,m; vector<int>g[2*N],a; bool lazy[2*N]; int dp[2*N][2]; bool test_mare; void push_down(int nod) { if(lazy[nod]) { swap(dp[2*nod+1][0] , dp[2*nod+1][1]); swap(dp[2*nod+2][0] , dp[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; //dp[nod][0]=dp[nod][1]=0; dp[nod][1]=add(add(prod(dp[l][0],dp[r][1]) , prod(dp[l][1],dp[r][0])) , prod(2,prod(dp[l][1],dp[r][1]))); dp[nod][0]=add(add(prod(dp[l][0],dp[r][1]) , prod(dp[l][1],dp[r][0])) , prod(2,prod(dp[l][0],dp[r][0]))); } 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(dp[nod][0] , dp[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 init(int nn, int mm, std::vector<int> pp, std::vector<int> init_a) { n=nn; m=mm; //schimbat n mare if(n) { test_mare=true; for(int i=0;i<m;i++) { dp[n+i][0]=(init_a[i]==0); dp[n+i][1]=(init_a[i]==1); } for(int i=n-1;i>=0;i--) { recalc(i); } //cerr<<"da"; return; } for(int i=1;i<n+m;i++) { g[pp[i]].push_back(i); } a=init_a; } void dfs(int nod) { for(auto &c:g[nod]) { dfs(c); } int sz=(int)g[nod].size(); if(g[nod].empty()) { dp[nod][0]=(a[nod-n]==0); dp[nod][1]=(a[nod-n]==1); return; } vector<int>choose(sz+1,0); choose[0]=1; for(auto &c:g[nod]) { for(int i=sz;i>=0;i--) { choose[i]=prod(choose[i] , dp[c][0]); if(i>0) { add_self(choose[i] , prod(choose[i-1] , dp[c][1])); } } } dp[nod][0]=dp[nod][1]=0; for(int i=1;i<=sz;i++) { add_self(dp[nod][0] , prod(choose[i],sz-i)); add_self(dp[nod][1] , prod(choose[i],i)); } add_self(dp[nod][0],prod(choose[0],sz)); } int count_ways(int l, int r) { l-=n; r-=n; if(l<=r) { update(0,0,m-1,l,r); } return dp[0][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...