제출 #830943

#제출 시각아이디문제언어결과실행 시간메모리
830943beaconmcDigital Circuit (IOI22_circuit)C++17
46 / 100
3049 ms6316 KiB
#include "circuit.h" #include <bits/stdc++.h> typedef long long ll; using namespace std; #define FOR(i, x, y) for(ll i=x; i<y; i++) #define FORNEG(i, x, y) for(ll i=x; i>y; i--) #define fast() ios_base::sync_with_stdio(false);cin.tie(NULL) vector<ll> edges[100001]; ll possible[100001]; ll contrib[100001]; ll dps[100001]; vector<int> p; bool state[100001]; int initdfs(ll a){ if (edges[a].size() == 0) return possible[a] = 1; ll temp = 1; for (auto&i : edges[a]){ temp *= initdfs(i); temp %= 1000002022; } temp *= edges[a].size(); temp %= 1000002022; return possible[a] = temp; } int dp(ll a){ if (a==0) return 1; if (dps[a] != -1) return dps[a]; ll temp = 1; for (auto&i : edges[p[a]]){ if (i != a) temp *= possible[i]; temp %= 1000002022; } dps[a] = temp * dp(p[a]) % 1000002022; return dps[a]; } ll n,m; void init(int N, int M, std::vector<int> P, std::vector<int> A) { FOR(i,0,100001) dps[i] = -1; p = P; n = N; m = M; FOR(i,1,N+M){ edges[P[i]].push_back(i); } FOR(i,N,N+M){ state[i] = A[i-N]; } initdfs(0); FOR(i,N,N+M){ ll temp = possible[i]; temp *= dp(i); contrib[i] = temp%1000002022; } } int count_ways(int L, int R) { FOR(i,L,R+1){ state[i] = (state[i]+1)%2; } ll ans = 0; FOR(i,n,n+m){ if (state[i]) ans += contrib[i]; } return ans%1000002022; }
#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...