답안 #807643

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
807643 2023-08-04T21:00:18 Z alex_2008 디지털 회로 (IOI22_circuit) C++17
컴파일 오류
0 ms 0 KB
#include "circuit.h"#include <cmath>#include <algorithm>#include <vector>#include <iostream>using namespace std;typedef long long ll;int NN, MM;const int N = 2e5 + 10, P = 1000002022;int p[N], d[N];int lazy[4 * N];int a[N];ll pref[N];pair <ll, ll> tree[4 * N];ll tree2[4 * N];ll binpow(ll a, ll n) {	if (n == 0) return 1;	if (n % 2 == 0) {		ll u = binpow(a, n / 2);		return (u * u) % P;	}	return (a * binpow(a, n - 1)) % P;}bool ch = true;void pushh(int v, int tl, int tr) {	if (lazy[v]) {		lazy[v] = 0;		if (tl != tr) {			lazy[2 * v] = (lazy[2 * v] + 1) % 2;			lazy[2 * v + 1] = (lazy[2 * v + 1] + 1) % 2;			swap(tree[2 * v].first, tree[2 * v].second);			swap(tree[2 * v + 1].first, tree[2 * v + 1].second);		}	}}void build_tree(int v, int tl, int tr) {	if (tl == tr) {		if (a[tl] == 1) tree[v] = { 1, 0 };		else tree[v] = { 0, 1 };	}	else {		int tm = (tl + tr) / 2;		build_tree(2 * v, tl, tm);		build_tree(2 * v + 1, tm + 1, tr);		ll a = tree[2 * v].first, b = tree[2 * v].second, c = tree[2 * v + 1].first, d = tree[2 * v + 1].second;		tree[v].first = 2 * a * c + a * d + b * c;		tree[v].second = 2 * b * d + a * d + b * c;		tree[v].first %= P;		tree[v].second %= P;	}}void update(int v, int tl, int tr, int l, int r) {	if (tl > r || tr < l) return;	if (tl >= l && tr <= r) {		lazy[v] = (lazy[v] + 1) % 2;		swap(tree[v].first, tree[v].second);		return;	}	pushh(v, tl, tr);	int tm = (tl + tr) / 2;	update(2 * v, tl, tm, l, r);	update(2 * v + 1, tm + 1, tr, l, r);	ll a = tree[2 * v].first, b = tree[2 * v].second, c = tree[2 * v + 1].first, d = tree[2 * v + 1].second;	tree[v].first = 2 * a * c + a * d + b * c;	tree[v].second = 2 * b * d + a * d + b * c;	tree[v].first %= P;	tree[v].second %= P;}void pushh2(int v, int tl, int tr) {	if (lazy[v]) {		lazy[v] = 0;		if (tl != tr) {			lazy[2 * v] = (lazy[2 * v] + 1) % 2;			lazy[2 * v + 1] = (lazy[2 * v + 1] + 1) % 2;			int tm = (tl + tr) / 2;			ll u = pref[tm];			if (tl) u -= pref[tl - 1];			u %= P;			tree2[2 * v] = (u + P - tree2[2 * v]) % P;			u = pref[tr] - pref[tm];			u %= P;			tree2[2 * v + 1] = (u + P - tree2[2 * v + 1]) % P;		}	}}void build_tree2(int v, int tl, int tr) {	if (tl == tr) {		if (a[tl]) {			tree2[v] = pref[tl];			if (tl) tree2[v] -= pref[tl - 1];		}		tree2[v] %= P;	}	else {		int tm = (tl + tr) / 2;		build_tree2(2 * v, tl, tm);		build_tree2(2 * v + 1, tm + 1, tr);		tree2[v] = tree2[2 * v] + tree2[2 * v + 1];		tree2[v] %= P;	}}void update2(int v, int tl, int tr, int l, int r) {	if (tl > r || tr < l) return;	if (tl >= l && tr <= r) {		lazy[v] = (lazy[v] + 1) % 2;		ll u = pref[tr];		if (tl) u -= pref[tl - 1];		u %= P;		tree2[v] = (u - tree2[v] + P) % P;		return;	}	pushh2(v, tl, tr);	int tm = (tl + tr) / 2;	update2(2 * v, tl, tm, l, r);	update2(2 * v + 1, tm + 1, tr, l, r);	tree2[v] = tree2[2 * v] + tree2[2 * v + 1];	tree2[v] %= P;}void init(int N, int M, std::vector<int> P, std::vector<int> A) {	NN = N, MM = M;	for (int i = 0; i < N + M - 1; i++) {		p[i] = P[i];		if (i == 0) d[0] = 0;		if (i > 0 && p[i] != (i - 1) / 2) ch = false;if (i)		d[i] = d[P[i]] + 1;	}			for (int i = 0; i < M; i++) {		a[i] = A[i];	}	if (M != N + 1) ch = false;	int u = log2(M);	if ((1 << u) != M) ch = false;	if (ch) build_tree(1, 0, M - 1);	else {		for (int i = 0; i < M; i++) {			pref[i] = binpow(2, N - d[i + N]);			if (i) pref[i] += pref[i - 1];		}			for (int i = 0; i < M; i++) {if(A[i]) update2(1,0,M-1,i,i)	;	}}}int count_ways(int L, int R) {	if (ch) {		update(1, 0, MM - 1, L - NN, R - NN);		return tree[1].first;	}	else {		update2(1, 0, MM - 1, L - NN, R - NN);		return tree2[1];	}}

Compilation message

circuit.cpp:1:21: warning: extra tokens at end of #include directive
    1 | #include "circuit.h"#include <cmath>#include <algorithm>#include <vector>#include <iostream>using namespace std;typedef long long ll;int NN, MM;const int N = 2e5 + 10, P = 1000002022;int p[N], d[N];int lazy[4 * N];int a[N];ll pref[N];pair <ll, ll> tree[4 * N];ll tree2[4 * N];ll binpow(ll a, ll n) { if (n == 0) return 1; if (n % 2 == 0) {  ll u = binpow(a, n / 2);  return (u * u) % P; } return (a * binpow(a, n - 1)) % P;}bool ch = true;void pushh(int v, int tl, int tr) { if (lazy[v]) {  lazy[v] = 0;  if (tl != tr) {   lazy[2 * v] = (lazy[2 * v] + 1) % 2;   lazy[2 * v + 1] = (lazy[2 * v + 1] + 1) % 2;   swap(tree[2 * v].first, tree[2 * v].second);   swap(tree[2 * v + 1].first, tree[2 * v + 1].second);  } }}void build_tree(int v, int tl, int tr) { if (tl == tr) {  if (a[tl] == 1) tree[v] = { 1, 0 };  else tree[v] = { 0, 1 }; } else {  int tm = (tl + tr) / 2;  build_tree(2 * v, tl, tm);  build_tree(2 * v + 1, tm + 1, tr);  ll a = tree[2 * v].first, b = tree[2 * v].second, c = tree[2 * v + 1].first, d = tree[2 * v + 1].second;  tree[v].first = 2 * a * c + a * d + b * c;  tree[v].second = 2 * b * d + a * d + b * c;  tree[v].first %= P;  tree[v].second %= P; }}void update(int v, int tl, int tr, int l, int r) { if (tl > r || tr < l) return; if (tl >= l && tr <= r) {  lazy[v] = (lazy[v] + 1) % 2;  swap(tree[v].first, tree[v].second);  return; } pushh(v, tl, tr); int tm = (tl + tr) / 2; update(2 * v, tl, tm, l, r); update(2 * v + 1, tm + 1, tr, l, r); ll a = tree[2 * v].first, b = tree[2 * v].second, c = tree[2 * v + 1].first, d = tree[2 * v + 1].second; tree[v].first = 2 * a * c + a * d + b * c; tree[v].second = 2 * b * d + a * d + b * c; tree[v].first %= P; tree[v].second %= P;}void pushh2(int v, int tl, int tr) { if (lazy[v]) {  lazy[v] = 0;  if (tl != tr) {   lazy[2 * v] = (lazy[2 * v] + 1) % 2;   lazy[2 * v + 1] = (lazy[2 * v + 1] + 1) % 2;   int tm = (tl + tr) / 2;   ll u = pref[tm];   if (tl) u -= pref[tl - 1];   u %= P;   tree2[2 * v] = (u + P - tree2[2 * v]) % P;   u = pref[tr] - pref[tm];   u %= P;   tree2[2 * v + 1] = (u + P - tree2[2 * v + 1]) % P;  } }}void build_tree2(int v, int tl, int tr) { if (tl == tr) {  if (a[tl]) {   tree2[v] = pref[tl];   if (tl) tree2[v] -= pref[tl - 1];  }  tree2[v] %= P; } else {  int tm = (tl + tr) / 2;  build_tree2(2 * v, tl, tm);  build_tree2(2 * v + 1, tm + 1, tr);  tree2[v] = tree2[2 * v] + tree2[2 * v + 1];  tree2[v] %= P; }}void update2(int v, int tl, int tr, int l, int r) { if (tl > r || tr < l) return; if (tl >= l && tr <= r) {  lazy[v] = (lazy[v] + 1) % 2;  ll u = pref[tr];  if (tl) u -= pref[tl - 1];  u %= P;  tree2[v] = (u - tree2[v] + P) % P;  return; } pushh2(v, tl, tr); int tm = (tl + tr) / 2; update2(2 * v, tl, tm, l, r); update2(2 * v + 1, tm + 1, tr, l, r); tree2[v] = tree2[2 * v] + tree2[2 * v + 1]; tree2[v] %= P;}void init(int N, int M, std::vector<int> P, std::vector<int> A) { NN = N, MM = M; for (int i = 0; i < N + M - 1; i++) {  p[i] = P[i];  if (i == 0) d[0] = 0;  if (i > 0 && p[i] != (i - 1) / 2) ch = false;if (i)  d[i] = d[P[i]] + 1; }   for (int i = 0; i < M; i++) {  a[i] = A[i]; } if (M != N + 1) ch = false; int u = log2(M); if ((1 << u) != M) ch = false; if (ch) build_tree(1, 0, M - 1); else {  for (int i = 0; i < M; i++) {   pref[i] = binpow(2, N - d[i + N]);   if (i) pref[i] += pref[i - 1];  }   for (int i = 0; i < M; i++) {if(A[i]) update2(1,0,M-1,i,i) ; }}}int count_ways(int L, int R) { if (ch) {  update(1, 0, MM - 1, L - NN, R - NN);  return tree[1].first; } else {  update2(1, 0, MM - 1, L - NN, R - NN);  return tree2[1]; }}
      |                     ^
/usr/bin/ld: /tmp/ccE4cMxt.o: in function `main':
stub.cpp:(.text.startup+0x128): undefined reference to `init(int, int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
/usr/bin/ld: stub.cpp:(.text.startup+0x169): undefined reference to `count_ways(int, int)'
collect2: error: ld returned 1 exit status