제출 #774367

#제출 시각아이디문제언어결과실행 시간메모리
774367GusterGoose27Digital Circuit (IOI22_circuit)C++17
100 / 100
970 ms25344 KiB
#include "circuit.h"

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MOD = 1000002022;
const int MAXN = 2e5;

bool init_active[MAXN];
int weight[MAXN];
vector<int> edges[MAXN];
int n, m;
int cur_mult;

class stree {
public:
	int lp, rp;
	stree *l = nullptr;
	stree *r = nullptr;
	int active;
	int tot;
	bool lz;
	stree(int lv, int rv) {
		lz = 0;
		lp = lv;
		rp = rv;
		if (lp < rp) {
			int mid = (lp+rp)/2;
			l = new stree(lp, mid);
			r = new stree(mid+1, rp);
			reupd();
		}
		else {
			tot = weight[lp];
			if (init_active[lp]) active = weight[lp];
			else active = 0;
		}
	}
	void reupd() {
		active = (l->active+r->active)%MOD;
		tot = (l->tot+r->tot)%MOD;
	}
	void setlz(bool nlz) {
		if (!nlz) return;
		lz ^= 1;
		active = (MOD+tot-active)%MOD;
	}
	void prop() {
		if (l) {
			l->setlz(lz);
			r->setlz(lz);
		}
		lz = 0;
	}
	void rev(int lv, int rv) {
		if (lp > rv || rp < lv) return;
		if (lp >= lv && rp <= rv) {
			setlz(1);
			return;
		}
		prop();
		l->rev(lv, rv);
		r->rev(lv, rv);
		reupd();
	}
};

void dfs(int cur, bool rev) {
	if (cur >= n-m) {
		// cout << cur_mult << "\n";
		weight[cur-n+m] = ((ll)weight[cur-n+m]*cur_mult)%MOD;
		return;
	}
	if (!rev) {
		for (int i = 0; i < edges[cur].size(); i++) {
			int nxt = edges[cur][i];
			dfs(nxt, rev);
		}
	}
	else {
		for (int i = edges[cur].size()-1; i >= 0; i--) {
			int nxt = edges[cur][i];
			dfs(nxt, rev);
		}
	}
	cur_mult = ((ll)cur_mult*edges[cur].size())%MOD;
	// cout << cur_mult << "\n";
}

stree *tree;

void init(int N, int M, vector<int> par, vector<int> act) {
	n = N+M;
	m = M;
	for (int i = 1; i < n; i++) {
		edges[par[i]].push_back(i);
	}
	for (int i = 0; i < m; i++) {
		init_active[i] = act[i];
		weight[i] = 1;
	}
	cur_mult = 1;
	dfs(0, 0);
	cur_mult = 1;
	dfs(0, 1);
	// for (int i = 0; i < m; i++) cout << weight[i] << ' ';
	// cout << "\n";
	tree = new stree(0, m-1);
}

int count_ways(int l, int r) {
	tree->rev(l-n+m, r-n+m);
	return tree->active;
}

컴파일 시 표준 에러 (stderr) 메시지

circuit.cpp: In function 'void dfs(int, bool)':
circuit.cpp:78:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |   for (int i = 0; i < edges[cur].size(); i++) {
      |                   ~~^~~~~~~~~~~~~~~~~~~
#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...