Submission #1154127

#TimeUsernameProblemLanguageResultExecution timeMemory
1154127zhasynDigital Circuit (IOI22_circuit)C++20
18 / 100
3047 ms7044 KiB
#include "circuit.h" #include <bits/stdc++.h> #define pb push_back #define pf push_front using namespace std; #define F first #define S second typedef long long ll; #define pii pair <int, int> #define pll pair <ll, ll> typedef long double ld; const ll N = 2 * 1e5 + 100, M = 4096 + 10, len = 21, inf = 1e18; const ll mod = 1000002022; ll um(ll a, ll b){ return (1LL * a * b) % mod; } ll subr(ll a, ll b){ return ((1LL * a - b) % mod + mod) % mod; } vector <int> q[N]; int in[N], n, m; void init(int nx, int mx, vector<int> p, vector<int> a) { n = nx; m = mx; for(int i = 1; i < n + m; i++){ q[p[i]].pb(i); } for(int i = n; i < n + m; i++){ in[i] = a[i - n]; } } ll dp[N], nw[N]; pll dfs(int v){ vector <pll> vec; for(auto u : q[v]){ if(u < n) vec.pb(dfs(u)); else{ if(in[u]) vec.pb({1, 0}); else vec.pb({0, 1}); } } //cout << v << " Start\n"; int local = (int)vec.size(); for(int i = 0; i <= local; i++){ dp[i] = 0; //cout << vec[i].F << " "<< vec[i].S << " given\n"; } dp[0] = 1; for(int i = 0; i < local; i++){ for(int j = 0; j <= local; j++){ nw[j] = um(dp[j], vec[i].S); if(j > 0) nw[j] += um(dp[j - 1], vec[i].F); } for(int j = 0; j <= local; j++){ dp[j] = nw[j]; nw[j] = 0; //cout << dp[j] << " "; } //cout << endl; } ll s1 = 0, s2 = 0, sm = 0; for(int i = local; i >= 1; i--){ sm += dp[i]; sm %= mod; s1 += sm; s1 %= mod; } sm = 0; for(int i = 0; i < local; i++){ sm += dp[i]; sm %= mod; s2 += sm; s2 %= mod; } //cout << s1 << " "<< s2 << " RES" << endl; return {s1, s2}; } int count_ways(int l, int r) { for(int i = l; i <= r; i++){ in[i] = 1 - in[i]; } // for(int i = n; i < n + m; i++){ // cout << in[i] << " "; // } // cout << endl; pll rs = dfs(0); return (int)rs.F; } // int main(){ // ios::sync_with_stdio(false); // cin.tie(NULL); // int nx, mx; // cin >> nx >> mx; // vector <int> p, a; // for(int i = 0, x; i < nx + mx; i++){ // cin >> x; // p.pb(x); // } // for(int i = n, x; i < nx + mx; i++){ // cin >> x; // a.pb(x); // } // init(nx, mx, p, a); // cout << count_ways(3, 4) << endl; // cout << count_ways(4, 5) << endl; // cout << count_ways(3, 6) << endl; // return 0; // }
#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...