제출 #232856

#제출 시각아이디문제언어결과실행 시간메모리
232856oolimryDesignated Cities (JOI19_designated_cities)C++14
100 / 100
423 ms38936 KiB
#include <bits/stdc++.h>
#define int long long
#define cost first
#define u second
using namespace std;
typedef pair<int,int> ii;

struct edge { int to, cost, rev; };
vector<edge> adj[200005];
int degree[200005];
int flipDist[200005];
int total = 0;

bool gone[200005];
int ans[200005];

void dfs(int u, int p){
	for(edge e : adj[u]){
		if(e.to == p) continue;
		total += e.cost;
		flipDist[e.to] = flipDist[u] - e.cost + e.rev;
		dfs(e.to, u);
	}
}

ii findParent(int u){
	for(edge e : adj[u]){
		if(!gone[e.to]) return ii(e.rev, e.to);
	}
}

signed main(){
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	
	int n; cin >> n;
	for(int i = 1;i < n;i++){
		int a, b, c, d; cin >> a >> b >> c >> d;
		adj[a].push_back({b,c,d});
		adj[b].push_back({a,d,c});
		degree[a]++; degree[b]++;
	}
	
	///solve the E = 1 case
	dfs(1,0);
	ans[1] = total + *min_element(flipDist + 1, flipDist + n+1);
	
	///Other cases
	priority_queue<ii, vector<ii>, greater<ii> > leaves;
	for(int i = 1;i <= n;i++){
		if(degree[i] == 1) leaves.push(ii(findParent(i).cost, i));
	}
	
	while((int) leaves.size() > 2){
		int u = leaves.top().u; int cost = leaves.top().cost;
		leaves.pop();
		
		gone[u] = true;
		int p = findParent(u).second;
		degree[p]--;
		
		
		if(degree[p] == 1){
			leaves.push(ii(findParent(p).cost + cost, p));
		}
		else{
			ans[(int) leaves.size()] = ans[(int) leaves.size()+1] + cost;
		}	
	}
	
	int Q; cin >> Q;
	while(Q--){
		int x; cin >> x; cout << ans[x] << "\n";
	}
}

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

designated_cities.cpp: In function 'ii findParent(long long int)':
designated_cities.cpp:30:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#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...