제출 #629964

#제출 시각아이디문제언어결과실행 시간메모리
629964handlename디지털 회로 (IOI22_circuit)C++17
18 / 100
3044 ms8228 KiB
#include <bits/stdc++.h> //#include "circuit.h" using namespace std; #define pb push_back #define mp make_pair const int MOD=1e9+2022; int n,m,par[200001],arr[200001]; vector<int> adj[200001]; long long mult[200001],ans[200001]; long long dfs(int x){ mult[x]=max((int)adj[x].size(),1); for (auto i:adj[x]){ mult[x]*=dfs(i); mult[x]%=MOD; } return mult[x]; } void dfs(int x,long long d){ ans[x]=d; long long pre[adj[x].size()],suf[adj[x].size()]; pre[0]=suf[adj[x].size()-1]=1; for (int i=1;i<(int)adj[x].size();i++){ pre[i]=pre[i-1]*mult[adj[x][i-1]]; pre[i]%=MOD; } for (int i=adj[x].size()-2;i>=0;i--){ suf[i]=suf[i+1]*mult[adj[x][i+1]]; suf[i]%=MOD; } for (int i=0;i<(int)adj[x].size();i++){ long long cur=d; cur*=pre[i]; cur%=MOD; cur*=suf[i]; cur%=MOD; dfs(adj[x][i],cur); } } void init(int N,int M,vector<int> P,vector<int> A){ n=N; m=M; for (int i=1;i<n+m;i++){ par[i]=P[i]; adj[par[i]].pb(i); } for (int i=0;i<m;i++){ arr[n+i]=A[i]; } dfs(0); dfs(0,1); } int count_ways(int l,int r){ long long res=0; for (int i=l;i<=r;i++){ arr[i]=1-arr[i]; } for (int i=n;i<n+m;i++){ res+=ans[i]*arr[i]; res%=MOD; } return res; }
#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...