Submission #627581

#TimeUsernameProblemLanguageResultExecution timeMemory
627581ash7728Digital Circuit (IOI22_circuit)C++17
18 / 100
3021 ms4952 KiB
#include "circuit.h"
#include <bits/stdc++.h>
#define N 100020
#define f first
#define s second
#define pb push_back
#define mp make_pair
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
using namespace std;
const int mod = 1000002022;

int yes[N], no[N], state[N],pai[N], n,m;
vector<int> grafo[N];

void multiply(vector<int>& poly, int x){
	if(poly.empty()){
		poly = {no[x], yes[x]};
		return;
	}
	vector<int> ans;
	for(int i = 0; i < sz(poly); i++){
		int A = (1LL*poly[i]*no[x])%mod;
		int B = 0;
		if(i >= 1) B = (1LL*poly[i-1]*yes[x])%mod;
		ans.pb((A+B)%mod);
	}
	ans.pb( (1LL*poly.back()*yes[x])%mod);


	poly = ans;
}

void solve(int x){
	yes[x] = no[x] = 0;
	if(x >= n){
		yes[x] = state[x];
		no[x] = (1-state[x]);
		return;
	}
	vector<int> poly;
	for(auto v: grafo[x]){
		solve(v);
		multiply(poly, v);
	}

	vector<int> pref;
	for(int i = 0; i < sz(poly); i++){
		pref.pb( (pref.empty()?0:pref.back()) + poly[i]);
		pref.back() %= mod;
	}
	for(int p = 1; p <= sz(grafo[x]); p++){
		yes[x] += (pref.back() - pref[p-1] + mod)%mod;
		no[x] += (pref[p-1] + mod)%mod;
		no[x] %= mod;
		yes[x] %= mod;
	}
}

void init(int n_, int m_, vector<int> P, vector<int> A) {
	n = n_, m = m_;
	for(int i = 1; i < n+m; i++){
		grafo[P[i]].pb(i);
		pai[i] = P[i];
	}
	for(int i = 0;i<m;i++) state[i+n] = A[i];
}

int count_ways(int L, int R) {
	for(int i = L; i <= R; i++) state[i] ^= 1;
  	solve(0);
  	return yes[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...