Submission #592427

# Submission time Handle Problem Language Result Execution time Memory
592427 2022-07-09T07:45:26 Z Bobaa Cats or Dogs (JOI18_catdog) C++17
Compilation error
0 ms 0 KB
#include "catdog.h"
#include <bits/stdc++.h>
using namespace std; 

const int maxn = 1e5 + 5; 
int n;
vector<int> adj[maxn]; 
int A[maxn]; 
int sz[maxn]; 
int par[maxn]; 

void dfs_sz(int cur, int prv) {
	if (prv) adj[cur].erase(find(adj[cur].begin(), adj[cur].end(), prv)); 
	sz[cur] = 1; 
	par[cur] = prv; 
	for (int nxt : adj[cur]) {
		dfs_sz(nxt, cur); 
		sz[cur] += sz[nxt]; 
	}
	nth_element(adj[cur].begin(), adj[cur].begin(), adj[cur].end(), [&](int i, int j) {
		return sz[i] > sz[j]; 
	}); 
}

int hvypar[maxn]; 
int num[maxn]; 
int pos[maxn]; 

void dfs_hld(int cur, int top) {
	hvypar[cur] = top; 
	pos[cur] = num[top]; 
	num[top]++; 
	bool isfrst = true; 
	for (int nxt : adj[cur]) {
		dfs_hld(nxt, (isfrst ? top : nxt)); 
		isfrst = false; 
	}
}

struct mat {
	int a00, a01, a10, a11; 
	friend mat operator * (const mat& a, const mat& b) {
		mat r; 
		r.a00 = min(a.a00 + b.a00, a.a01 + b.a01); 
		r.a01 = min(a.a00 + b.a01, a.a01 + b.a11); 
		r.a10 = min(a.a10 + b.a00, a.a11 + b.a10); 
		r.a11 = min(a.a10 + b.a01, a.a11 + b.a11); 
		return r; 
	}
};

struct segtree {
	int s; 
	vector<mat> cost; 
	
	segtree() {}
	
	segtree(int n) {
		for (s = 1; s < n; s *= 2) {}
		cost = vector<mat>(2 * s); 
		for (int i = 0; i < 2 * s; i++) cost[i].a01 = cost[i].a10 = 1; 
	}
	
	void upd(int i, int& v0, int& v1) {
		i += s; 
		cost[i].a00 += v0; 
		cost[i].a01 += v0; 
		cost[i].a10 += v1; 
		cost[i].a11 += v1; 
		for (i /= 2; i; i /= 2) cost[i] = cost[2 * i] * cost[2 * i + 1]; 
	}
	
	void eval(int& a0, int& a1) {
		a0 = min(cost[1].a00, cost[1].a01); 
		a1 = min(cost[1].a10, cost[1].a11); 
	}
} seg[maxn]; 

void initialize(int k, vector<int> a, vector<int> b) {
	n = k; 
	for (int i = 0; i < n - 1; i++) {
		adj[a[i]].push_back(b[i]); 
		adj[b[i]].push_back(a[i]); 
	}
	for (int i = 1; i <= n; i++) A[i] = 0; 
	dfs_sz(1, 0); 
	dfs_hld(1, 1); 
	for (int i = 1; i <= n; i++) {
		assert((pos[i] == 0) == (hvypar[i] == i)); 
		if (hvypar[i] == i) seg[i] = segtree(num[i]); 
	}
}

int qry() {
	int a0, a1; 
	seg[1].eval(a0, a1); 
	return min(a0, a1); 
}

int cat(int v) {
	A[v] = 1; 
	seg.upd(v, 0, n); 
	return qry(); 
}

int dog(int v) {
	A[v] = 2; 
	seg.upd(v, n, 0); 
	return qry(); 
}

int neighbor(int v) {
	if (A[v] == 1) seg.upd(v, 0, -n); 
	else if (A[v] == 2) seg.upd(v, -n, 0); 
	else assert(false); 
	A[v] = 0; 
	return qry(); 
}

Compilation message

catdog.cpp: In function 'int cat(int)':
catdog.cpp:102:6: error: request for member 'upd' in 'seg', which is of non-class type 'segtree [100005]'
  102 |  seg.upd(v, 0, n);
      |      ^~~
catdog.cpp: In function 'int dog(int)':
catdog.cpp:108:6: error: request for member 'upd' in 'seg', which is of non-class type 'segtree [100005]'
  108 |  seg.upd(v, n, 0);
      |      ^~~
catdog.cpp: In function 'int neighbor(int)':
catdog.cpp:113:21: error: request for member 'upd' in 'seg', which is of non-class type 'segtree [100005]'
  113 |  if (A[v] == 1) seg.upd(v, 0, -n);
      |                     ^~~
catdog.cpp:114:26: error: request for member 'upd' in 'seg', which is of non-class type 'segtree [100005]'
  114 |  else if (A[v] == 2) seg.upd(v, -n, 0);
      |                          ^~~