Submission #1333545

#TimeUsernameProblemLanguageResultExecution timeMemory
1333545boclobanchatDigital Circuit (IOI22_circuit)C++20
Running #5-12
333 ms10956 KiB
#include"circuit.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
const long long mod=1e9+2022;
vector<int> ds[MAXN];
pair<long long,long long> seg[MAXN*4],F[MAXN];
int lazy[MAXN*4],child[MAXN],L[MAXN],R[MAXN],tdfs=0,N,M;
long long pref[MAXN],suff[MAXN];
void dfs(int i)
{
	int sz=ds[i].size();
	if(!sz) L[i]=R[i]=++tdfs,child[tdfs]=i;
	else
	{
		L[i]=1e9,R[i]=0;
		for(auto v:ds[i])
		{
			dfs(v);
			L[i]=min(L[i],L[v]),R[i]=max(R[i],R[v]);
		}
		suff[L[i]-1]=suff[L[i]-1]*sz%mod;
		pref[R[i]+1]=pref[R[i]+1]*sz%mod;
	}
}
pair<long long,long long> operator+(const pair<long long,long long>& a,const pair<long long,long long>& b)
{
	return {(a.first+b.first)%mod,(a.second+b.second)%mod};
}
void down(int pos)
{
	int val=lazy[pos];
	if(val)
	{
		swap(seg[pos*2].first,seg[pos*2].second);
		swap(seg[pos*2+1].first,seg[pos*2+1].second);
		lazy[pos*2]^=1,lazy[pos*2+1]^=1,lazy[pos]=0;
	}
}
void build(int l,int r,int pos)
{
	if(l==r)
	{
		seg[pos]=F[l];
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,pos*2);
	build(mid+1,r,pos*2+1);
	seg[pos]=seg[pos*2]+seg[pos*2+1];
}
void update(int l,int r,int u,int v,int pos)
{
	if(v<l||r<u) return ;
	if(u<=l&&r<=v)
	{
		swap(seg[pos].first,seg[pos].second);
		lazy[pos]^=1;
		return ;
	}
	int mid=(l+r)/2;
	down(pos);
	update(l,mid,u,v,pos*2);
	update(mid+1,r,u,v,pos*2+1);
	seg[pos]=seg[pos*2]+seg[pos*2+1];
}
void init(int n,int m,vector<int> P,vector<int> A)
{
	N=n,M=m;
	for(int i=1;i<n+m;i++) ds[P[i]].push_back(i);
	for(int i=0;i<=m+1;i++) pref[i]=suff[i]=1;
	dfs(0);
	for(int i=1;i<=tdfs;i++) pref[i]=pref[i]*pref[i-1]%mod;
	for(int i=tdfs;i;i--) suff[i]=suff[i]*suff[i+1]%mod;
	for(int i=0;i<m;i++) if(A[i]==0) F[child[i+1]-n]={0,pref[i+1]*suff[i+1]%mod};
	else F[child[i+1]-n]={pref[i+1]*suff[i+1]%mod,0};
	build(0,m-1,1);
}
int count_ways(int L,int R)
{
	update(0,M-1,L-N,R-N,1);
	return seg[1].first;
}
#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...