Submission #693759

#TimeUsernameProblemLanguageResultExecution timeMemory
693759PyqeDigital Circuit (IOI22_circuit)C++17
100 / 100
1268 ms48732 KiB
#include <bits/stdc++.h>
#include "circuit.h"

using namespace std;

const long long dv=1e9+2022;
long long n,m,pr[200069],a[100069],dp[200069],wg[100069];
vector<long long> al[200069];

struct segtree
{
	long long l,r,sm[2];
	bool iv;
	segtree *p[2];
	
	void bd(long long lh,long long rh)
	{
		l=lh;
		r=rh;
		iv=0;
		if(l==r)
		{
			sm[a[l]]=wg[l];
			sm[!a[l]]=0;
		}
		else
		{
			long long ii,md=(l+r)/2;
			
			for(ii=0;ii<2;ii++)
			{
				p[ii]=new segtree;
				p[ii]->bd(!ii?l:md+1,!ii?md:r);
			}
			for(ii=0;ii<2;ii++)
			{
				sm[ii]=(p[0]->sm[ii]+p[1]->sm[ii])%dv;
			}
		}
	}
	inline void blc()
	{
		if(iv)
		{
			long long ii;
			
			for(ii=0;ii<2;ii++)
			{
				swap(p[ii]->sm[0],p[ii]->sm[1]);
				p[ii]->iv^=1;
			}
			iv=0;
		}
	}
	void ud(long long lh,long long rh)
	{
		if(l>rh||r<lh);
		else if(l>=lh&&r<=rh)
		{
			swap(sm[0],sm[1]);
			iv^=1;
		}
		else
		{
			long long ii;
			
			blc();
			for(ii=0;ii<2;ii++)
			{
				p[ii]->ud(lh,rh);
			}
			for(ii=0;ii<2;ii++)
			{
				sm[ii]=(p[0]->sm[ii]+p[1]->sm[ii])%dv;
			}
		}
	}
}
sg;

void dfs(long long x)
{
	long long i,sz=al[x].size(),l;
	
	dp[x]=max(sz,1ll);
	for(i=0;i<sz;i++)
	{
		l=al[x][i];
		dfs(l);
		dp[x]=dp[x]*dp[l]%dv;
	}
}

void dfs2(long long x,long long cw)
{
	if(x<=n)
	{
		long long i,sz=al[x].size(),l;
		vector<long long> mla,mla2;
		
		mla.push_back(1);
		for(i=0;i<sz;i++)
		{
			l=al[x][i];
			mla.push_back(mla[i]*dp[l]%dv);
		}
		mla2.push_back(1);
		for(i=sz-1;i>=0;i--)
		{
			l=al[x][i];
			mla2.push_back(mla2[sz-1-i]*dp[l]%dv);
		}
		for(i=0;i<sz;i++)
		{
			l=al[x][i];
			dfs2(l,cw*mla[i]%dv*mla2[sz-1-i]%dv);
		}
	}
	else
	{
		wg[x-n]=cw;
	}
}

void init(int on,int om,vector<int> prr,vector<int> aa)
{
	long long i;
	
	n=on;
	m=om;
	for(i=1;i<=n+m;i++)
	{
		pr[i]=prr[i-1]+1;
	}
	for(i=1;i<=m;i++)
	{
		a[i]=aa[i-1];
	}
	for(i=2;i<=n+m;i++)
	{
		al[pr[i]].push_back(i);
	}
	dfs(1);
	dfs2(1,1);
	sg.bd(1,m);
}

int count_ways(int lb,int rb)
{
	lb++;
	rb++;
	lb-=n;
	rb-=n;
	sg.ud(lb,rb);
	return sg.sm[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...