제출 #1024529

#제출 시각아이디문제언어결과실행 시간메모리
1024529vjudge1디지털 회로 (IOI22_circuit)C++17
18 / 100
17 ms20568 KiB
#include <bits/stdc++.h> #define ent '\n' using namespace std; typedef long long ll; const int maxn = 1e5 + 12; const int mod = 1e9 + 2022; vector<int> g[maxn]; ll dp[2005][2005]; ll ways[2005][2]; int p[maxn]; int a[maxn]; int n, m; void init(int N, int M, std::vector<int> P, std::vector<int> A){ n = N, m = M; for(int i=0;i<n+m;i++){ p[i] = P[i]; if(i >= n) a[i] = A[i-n]; if(i >= 1) g[p[i]].push_back(i); } } int count_ways(int L, int R){ for(int i=L;i<=R;i++){ a[i] ^= 1; } for(int i=n;i<n+m;i++){ ways[i][a[i]] = 1; ways[i][1-a[i]] = 0; } for(int v=n-1;v>=0;v--){ for(int i=0;i<=n+m;i++){ dp[v][i] = 0; } dp[v][0] = 1; ways[v][0] = ways[v][1] = 0; for(int to:g[v]){ for(int i=g[v].size();i>=0;i--){ dp[v][i] = (dp[v][i] * ways[to][0]) % mod; if(i > 0) dp[v][i] = (dp[v][i] + dp[v][i-1] * ways[to][1]) % mod; } } for(int i=0;i<=(int)g[v].size();i++){ ways[v][0] = (ways[v][0] + dp[v][i] * ((int)g[v].size() - i)) % mod; ways[v][1] = (ways[v][1] + dp[v][i] * i) % mod; } } return ways[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...