Submission #837275

#TimeUsernameProblemLanguageResultExecution timeMemory
837275ymmDigital Circuit (IOI22_circuit)C++17
100 / 100
904 ms47656 KiB
#include "circuit.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < ll(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= ll(l); --x)
typedef long long ll;
using namespace std;

const int mod = 1'000'002'022;
const int N = 200'010;
vector<int> A[N];
ll kol[N];
ll val[N];

void dfskol(int v)
{
	if (A[v].empty()) {
		kol[v] = 1;
		return;
	}
	kol[v] = A[v].size();
	for (int u : A[v]) {
		dfskol(u);
		kol[v] = kol[v] * kol[u] % mod;
	}
}
void dfsval(int v, ll val)
{
	if (A[v].empty()) {
		::val[v] = val;
		return;
	}
	vector<ll> vec;
	for (int u : A[v])
		vec.push_back(kol[u]);
	vector<ll> pre = {1}, suf = {1};
	Loop (i,0,vec.size()-1)
		pre.push_back(pre.back() * vec[i] % mod);
	LoopR (i,1,vec.size())
		suf.push_back(suf.back() * vec[i] % mod);
	reverse(suf.begin(), suf.end());
	Loop (i,0,A[v].size())
		dfsval(A[v][i], val * pre[i] % mod * suf[i] % mod);
}

namespace seg {
	struct node {
		ll sum, sumr;
		bool swp;
	} t[4*N];
	int st, fi;

	void tag(int i) {
		swap(t[i].sum, t[i].sumr);
		t[i].swp ^= 1;
	}
	void ppg(int i) {
		if (t[i].swp) {
			tag(2*i+1);
			tag(2*i+2);
			t[i].swp = 0;
		}
	}
	void merge(int i) {
		t[i].sum = (t[2*i+1].sum + t[2*i+2].sum) % mod;
		t[i].sumr = (t[2*i+1].sumr + t[2*i+2].sumr) % mod;
	}

	void up(int l, int r, int i, int b, int e) {
		if (l <= b && e <= r)
			return tag(i);
		if (r <= b || e <= l)
			return;
		ppg(i);
		up(l, r, 2*i+1, b, (b+e)/2);
		up(l, r, 2*i+2, (b+e)/2, e);
		merge(i);
	}
	void up(int l, int r) { up(l, r, 0, st, fi); }

	void init(ll *v, int *s, int i, int b, int e) {
		if (e-b == 1) {
			t[i].sum = 0;
			t[i].sumr = v[b];
			if (s[b])
				swap(t[i].sum, t[i].sumr);
			return;
		}
		init(v, s, 2*i+1, b, (b+e)/2);
		init(v, s, 2*i+2, (b+e)/2, e);
		merge(i);
	}
	void init(int l, int r, ll *v, int *s) {
		st = l;
		fi = r;
		init(v, s, 0, st, fi);
	}

	ll get() { return t[0].sum; }
}
	

void init(int n, int m, std::vector<int> P, std::vector<int> A) {
	Loop (i,1,n+m)
		::A[P[i]].push_back(i);
	dfskol(0);
	dfsval(0, 1);
	seg::init(n, n+m, val, A.data() - n);
}

int count_ways(int L, int R) {
	seg::up(L, R+1);
	return seg::get();
}
#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...