제출 #577930

#제출 시각아이디문제언어결과실행 시간메모리
577930M_W공장들 (JOI14_factories)C++17
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#define ii pair<int, long long>
using namespace std;
int up[21][500001], lg, timer = 0;
int tin[500001], tout[500001]; 
long long dist[500001];
vector<ii> adj[500001];

// LCA stuff

void process_lca(int a, int p){
	tin[a] = timer++;
	for(int i = 1; i <= lg; i++){
		up[a][i] = up[up[a][i - 1]][i - 1];
	}
	
	for(auto [x, w] : adj[a]){
		if(x == p) continue;
		dist[x] = dist[a] + w;
		process_lca(x, a);
	}
	tout[a] = timer++;
}

bool is_an(int u, int v){
	return tin[u] <= tin[v] && tout[u] >= tout[v];
}

int lca(int u, int v){
	if(is_an(v, u)) return v;
	for(int i = lg; i >= 0; i--){
		if(!is_an(u, v)) u = up[u][i];
	}
	return up[u][0];
}

long long get_dist(int u, int v){
	int lca_uv = lca(u, v);
	return - (dist[lca_uv] << 1) + (dist[u] + dist[v]);
}

// Centroid stuff

bool blocked[500001];
int sz[500001], split_node;

int calc_subtree(int a, int p){
	sz[a] = 1;
	for(auto [x, w] : adj[a]){
		if(x == p || blocked[x]) continue;
		sz[a] += calc_subtree(x, a);
	}
	return sz[a];
}

bool get_split(int a, int p, int rt){
	int msz = sz[rt] - sz[a];
	for(auto [x, w] : adj[a]){
		if(x == p || blocked[x]) continue;
		msz = max(msz, sz[x]);
		if(get_split(x, a, rt)) return true;
	}
	if(msz <= sz[rt] >> 1){
		split_node = a;
		return true;
	}
	return false;
}

int pa[500001];

void build_tree(int a, int p){
	calc_subtree(a, p);
	get_split(a, p, a);
	
	pa[split_node] = p;
	blocked[split_node] = true;
	for(auto [x, w] : adj[split_node]){
		if(blocked[x]) continue;
		build_tree(x, split_node);
	}
}

// Actual Problem

int bk[500001], book = 1;
long long d[500001];

void update(int u){
	int tmp_u = u;
	while(u != -1){
		if(bk[u] < book) d[u] = get_dist(tmp_u, u);
		else d[u] = min(d[u], get_dist(tmp_u, u));
		bk[u] = book;
		u = pa[u];
	}
}

long long query(int v){
	int tmp_v = v; long long ret = LLONG_MAX;
	while(v != -1){
		if(bk[v] == book) ret = min(ret, d[v] + get_dist(tmp_v, v));
		v = pa[v];
	}
	return ret;
}

int main(){
	int N, Q;
	scanf("%d %d", &N, &Q); lg = int(ceil(log2(N)));
	for(int i = 1; i < N; i++){
		int u, v; long long w;
		scanf("%d %d %lld", &u, &v, &w);
		adj[u].push_back({v, w});
		adj[v].push_back({u, w});
	}
	process_lca(0, -1);
	build_tree(0, -1);
	while(Q--){
		int S, T; long long ans = LLONG_MAX;
		scanf("%d %d", &S, &T);
		while(S--){
			int u; scanf("%d", &u);
			update(u);
		}
		while(T--){
			int v; scanf("%d", &v);
			ans = min(ans, query(v));
		}
		printf("%lld\n", ans);
		book++;
	}
}

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

factories.cpp: In function 'int main()':
factories.cpp:110:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  110 |  scanf("%d %d", &N, &Q); lg = int(ceil(log2(N)));
      |  ~~~~~^~~~~~~~~~~~~~~~~
factories.cpp:113:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  113 |   scanf("%d %d %lld", &u, &v, &w);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
factories.cpp:121:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  121 |   scanf("%d %d", &S, &T);
      |   ~~~~~^~~~~~~~~~~~~~~~~
factories.cpp:123:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |    int u; scanf("%d", &u);
      |           ~~~~~^~~~~~~~~~
factories.cpp:127:16: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  127 |    int v; scanf("%d", &v);
      |           ~~~~~^~~~~~~~~~
/usr/bin/ld: /tmp/ccT6dIuh.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccqwgIii.o:factories.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccT6dIuh.o: in function `main':
grader.cpp:(.text.startup+0x37d): undefined reference to `Init(int, int*, int*, int*)'
/usr/bin/ld: grader.cpp:(.text.startup+0x412): undefined reference to `Query(int, int*, int, int*)'
collect2: error: ld returned 1 exit status