Submission #812204

#TimeUsernameProblemLanguageResultExecution timeMemory
812204andrei_boacaDigital Circuit (IOI22_circuit)C++17
34 / 100
3070 ms21612 KiB
#include "circuit.h" #include <bits/stdc++.h> #include <vector> //#include "stub.cpp" using namespace std; typedef long long ll; const ll mod=1e9+2022; ll a[300005],par[300005]; ll n,m,minim[300005],maxim[300005],dp[2][300005],toprop[300005]; vector<ll> muchii[300005]; ll nr[300005],aux[300005]; void calc(int nod) { dp[1][nod]=dp[0][nod]=0; for(int j=0;j<=muchii[nod].size();j++) nr[j]=0; nr[0]=1; for(int i=0;i<muchii[nod].size();i++) { for(int j=0;j<=i+1;j++) aux[j]=0; for(int j=0;j<=i+1;j++) { ll val=(nr[j]*dp[0][muchii[nod][i]])%mod; aux[j]=(aux[j]+val)%mod; if(j>0) { val=(nr[j-1]*dp[1][muchii[nod][i]])%mod; aux[j]=(aux[j]+val)%mod; } } for(int j=0;j<=i+1;j++) nr[j]=aux[j]; } for(ll i=0;i<=muchii[nod].size();i++) { ll nr1=(nr[i]*i)%mod; dp[1][nod]=(dp[1][nod]+nr1)%mod; ll nr0=(1LL*nr[i]*(muchii[nod].size()-i))%mod; dp[0][nod]=(dp[0][nod]+nr0)%mod; } } void build(int nod) { dp[1][nod]=dp[0][nod]=0; minim[nod]=1e9; maxim[nod]=-1; if(muchii[nod].size()==0) { dp[a[nod]][nod]=1; dp[1-a[nod]][nod]=0; minim[nod]=nod; maxim[nod]=nod; return; } for(int i:muchii[nod]) { build(i); minim[nod]=min(minim[nod],minim[i]); maxim[nod]=max(maxim[nod],maxim[i]); } calc(nod); } void prop(int nod) { for(int i:muchii[nod]) { swap(dp[0][i],dp[1][i]); toprop[i]^=1; } } void update(int nod,int l,int r) { if(muchii[nod].size()>0&&toprop[nod]) { prop(nod); toprop[nod]=0; } if(l<=minim[nod]&&r>=maxim[nod]) { swap(dp[0][nod],dp[1][nod]); toprop[nod]^=1; return; } for(int i:muchii[nod]) { if(!(maxim[i]<l||minim[i]>r)) update(i,l,r); } calc(nod); } void init(int N, int M, std::vector<int> P, std::vector<int> A) { n=N; m=M; for(int i=0;i<P.size();i++) { par[i]=P[i]; if(i!=0) muchii[par[i]].push_back(i); } for(int i=0;i<A.size();i++) a[i+n]=A[i]; build(0); } int count_ways(int L, int R) { update(0,L,R); return dp[1][0]; }

Compilation message (stderr)

circuit.cpp: In function 'void calc(int)':
circuit.cpp:16:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |     for(int j=0;j<=muchii[nod].size();j++)
      |                 ~^~~~~~~~~~~~~~~~~~~~
circuit.cpp:19:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for(int i=0;i<muchii[nod].size();i++)
      |                 ~^~~~~~~~~~~~~~~~~~~
circuit.cpp:36:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     for(ll i=0;i<=muchii[nod].size();i++)
      |                ~^~~~~~~~~~~~~~~~~~~~
circuit.cpp: In function 'void init(int, int, std::vector<int>, std::vector<int>)':
circuit.cpp:96:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   96 |     for(int i=0;i<P.size();i++)
      |                 ~^~~~~~~~~
circuit.cpp:102:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |     for(int i=0;i<A.size();i++)
      |                 ~^~~~~~~~~
#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...