Submission #627653

#TimeUsernameProblemLanguageResultExecution timeMemory
627653ash7728Digital Circuit (IOI22_circuit)C++17
18 / 100
3093 ms4920 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;
	int sum_cost = -1, C = sz(grafo[x]);
	for(auto v: grafo[x]){
		solve(v);
		if(sum_cost == -1){
			sum_cost = (no[v] + yes[v])%mod;
			yes[x] = yes[v];
			no[x] = no[v];
			continue;
		}
		int old_yes = yes[x];

		yes[x] = (1LL*(old_yes)*no[v])%mod;
		yes[x] += (1LL*(old_yes + sum_cost)*yes[v])%mod;
		yes[x] %= mod;

		sum_cost = (1LL*sum_cost*(yes[v] + no[v]))%mod; 
	}

	no[x] = (1LL*C*sum_cost%mod - yes[x])%mod;
	no[x] = (no[x] + mod)%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...