Submission #1247161

#TimeUsernameProblemLanguageResultExecution timeMemory
1247161DeathIsAweDigital Circuit (IOI22_circuit)C++20
18 / 100
3098 ms8668 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; #define mp make_pair #define ff first #define ss second #define pb push_back #define ll long long #define ld long double #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") int n, m; vector<int> p, a; vector<vector<int>> children; const int modnum = 1000002022; pair<ll, ll> calc(int x) { int k = children[x].size(); vector<pair<ll, ll>> nums(k); for (int i=0;i<k;i++) { if (children[x][i] >= n) { nums[i].ff = a[children[x][i] - n]; nums[i].ss = (a[children[x][i] - n] + 1) % 2; } else { nums[i] = calc(children[x][i]); } } vector<ll> dum(k + 1); vector<vector<ll>> one; for (int i=0;i<k+1;i++) one.pb(dum); for (int i=0;i<k+1;i++) { one[i][0] = 0; } one[0][0] = 1; one[0][1] = nums[0].ss; for (int i=2;i<k+1;i++) { one[0][i] = (one[0][i - 1] * nums[i - 1].ss) % modnum; } for (int i=1;i<k+1;i++) { for (int j=1;j<k+1;j++) { one[i][j] = (one[i][j - 1] * nums[j - 1].ss + one[i - 1][j - 1] * nums[j - 1].ff) % modnum; } } /* cout << x << " : " << endl; for (int i=0;i<k;i++) { cout << nums[i].ff << ' ' << nums[i].ss << endl; } cout << endl; for (int i=0;i<k+1;i++) { for (int j=0;j<k+1;j++) { cout << one[i][j] << ' '; } cout << endl; } cout << endl; */ ll zeronum = 0, onenum = 0; for (int i=1;i<k+1;i++) { for (int j=i;j<k+1;j++) { onenum += one[j][k]; onenum %= modnum; } for (int j=0;j<i;j++) { zeronum += one[j][k]; zeronum %= modnum; } } //cout << "FINALS " << onenum << ' ' << zeronum << endl; return mp(onenum, zeronum); } void init(int N, int M, vector<int> P, vector<int> A) { n = N; m = M; p = P; a = A; vector<int> dum; for (int i=0;i<n+m;i++) { children.pb(dum); } for (int i=1;i<n+m;i++) { children[p[i]].pb(i); } /* for (int i=0;i<n+m;i++) { cout << i << " children "; for (int j: children[i]) { cout << j << ' '; } cout << endl; } */ } int count_ways(int L, int R) { int l = L, r = R; for (int i=l;i<r+1;i++) { a[i - n] = (a[i - n] + 1) % 2; } return calc(0).ff; }
#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...