제출 #639360

#제출 시각아이디문제언어결과실행 시간메모리
639360CSQ31디지털 회로 (IOI22_circuit)C++17
100 / 100
1122 ms38064 KiB
#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll MOD = 1000002022;
const int MAXN = 2e5+5;
vector<int>adj[MAXN];
ll c[MAXN],sub[MAXN];
int n,m;
void dfs(int v){
	if(adj[v].empty())sub[v] = 1;
	else sub[v] = adj[v].size();
	for(int x:adj[v]){
		dfs(x);
		sub[v] = sub[v]*sub[x]%MOD;
	}
	
}
void dfs(int v,ll cur){
	if(adj[v].empty()){
		c[v-n] = cur;
		return;
	}
	int s = adj[v].size();
	vector<ll>pref(s,1),suff(s,1);
	for(int i=0;i<s;i++){
		pref[i] = sub[adj[v][i]];
		suff[i] = sub[adj[v][i]];
		if(i)pref[i] = pref[i]*pref[i-1]%MOD;
	}
	for(int i=s-2;i>=0;i--)suff[i] = suff[i]*suff[i+1]%MOD;
	
	for(int i=0;i<s;i++){
		ll k = 1;
		if(i)k = pref[i-1]*k%MOD;
		if(i!=s-1)k = suff[i+1]*k%MOD;
		dfs(adj[v][i],(cur*k)%MOD);
		
	}
}
ll ans = 0;
vector<int>a;
ll t[4*MAXN],sum[4*MAXN];
bool lazy[4*MAXN];
void pushdown(int v){
	if(lazy[v]){
		t[2*v] = sum[2*v] - t[2*v] + MOD;
		t[2*v+1] = sum[2*v+1] - t[2*v+1] + MOD;
		if(t[2*v]>=MOD)t[2*v]-=MOD;
		if(t[2*v+1]>=MOD)t[2*v+1]-=MOD;	
		lazy[2*v]^=1;
		lazy[2*v+1]^=1;
		lazy[v] = 0;	
	}
	
}
void upd(int v,int l,int r,int tl,int tr){
	if(l>r)return;
	if(l==tl && r==tr){
		lazy[v]^=1;
		t[v] = sum[v]-t[v]+MOD;
		if(t[v]>=MOD)t[v]-=MOD;
		return;
	}
	int tm = (tl+tr)/2;
	pushdown(v);
	upd(2*v,l,min(r,tm),tl,tm);
	upd(2*v+1,max(tm+1,l),r,tm+1,tr);
	t[v] = t[2*v] + t[2*v+1];
	if(t[v]>=MOD)t[v]-=MOD;
}
void build(int v,int l,int r){
	if(l==r){
		sum[v] = c[l];
		if(a[l])t[v] = c[l];
		return;
	}
	int tm = (l+r)/2;
	build(2*v,l,tm);
	build(2*v+1,tm+1,r);
	t[v] = t[2*v]+t[2*v+1];
	sum[v] = sum[2*v]+sum[2*v+1];
	if(sum[v]>=MOD)sum[v]-=MOD;
	if(t[v]>=MOD)t[v]-=MOD;
	
}
void init(int N, int M, vector<int> p, vector<int> A) {
	n = N;
	m = M;
	a = A;
	for(int i=1;i<n+m;i++)adj[p[i]].push_back(i);
	dfs(0);
	dfs(0,1);
	build(1,0,m-1);
	
}

int count_ways(int L, int R) {
	L-=n;
	R-=n;
	upd(1,L,R,0,m-1);
	return t[1];
}
#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...