Submission #632431

#TimeUsernameProblemLanguageResultExecution timeMemory
632431cjoaDigital Circuit (IOI22_circuit)C++17
2 / 100
3089 ms4816 KiB
#include "circuit.h" #include <vector> #include <iostream> using namespace std; const int MAXN = 100000; const int MAXM = 100000; int N, M; //int P[MAXN+MAXM]; int A[MAXN+MAXM]; vector<int> adj[MAXN]; const int MOD = 1000002022; int DP[MAXN + MAXM][2]; 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]; int p = P[i]; adj[p].push_back(i); } for (int i = 0; i < M; ++i) ::A[i] = A[i]; for (int i = N; i < N+M; ++i) DP[i][ A[i-N] ] = 1; // cerr << "init finished" << endl; } int count_ways(int L, int R) { // cerr << "L: " << L << " R:" << R << endl; for (int i = L; i <= R; ++i) { A[i-N] ^= 1; if (A[i-N]) { DP[i][0] = 0; DP[i][1] = 1; } else { DP[i][0] = 1; DP[i][1] = 0; } } /* for (int i = 0; i < M; ++i) cerr << A[i] << ' '; cerr << endl; */ for (int u = N-1; u >= 0; --u) { const int NC = adj[u].size(); vector<int> DPt(NC+1, 0); DPt[0] = 1; for (int j = 0; j < (int) adj[u].size(); ++j) { int v = adj[u][j]; for (int ones = j+1; ones > 0; --ones) { DPt[ones] = (DPt[ones ] * 1LL * DP[v][0] + DPt[ones-1] * 1LL * DP[v][1]) % MOD; } DPt[0] = (DPt[0] * DP[v][0]) % MOD; } DP[u][0] = DP[u][1] = 0; for (int ones = 0; ones <= NC; ++ones) { DP[u][0] = (DP[u][0] + DPt[ones] * 1LL * (NC - ones)) % MOD; DP[u][1] = (DP[u][1] + DPt[ones] * 1LL * ones) % MOD; } } // for (int i = 0; i < N+M; ++i) // cerr << i << ": " << DP[i][0] << ' ' << DP[i][1] << endl; 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...