#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |