Submission #367906

#TimeUsernameProblemLanguageResultExecution timeMemory
367906PulgsterDreaming (IOI13_dreaming)C++17
100 / 100
173 ms26476 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
#define imie(...) " [" << #__VA_ARGS__ " :" << (__VA_ARGS__) << "] "
#define ed <<endl
const int mxn = 1e5+5;
vector<vector<pair<int, int>>> adj(mxn);
struct unionFind{
	vector<int> par;
	vector<int> rnk;
	unionFind(int n){
		par.resize(n);
		rnk.resize(n);
		for(int i=0;i<n;i++){
			par[i]=i;
		}
	}
	int find(int p){
		if(par[p] != p){
			par[p]=find(par[p]);
		}
		return par[p];
	}
	void join(int u, int v){
		int uroot = find(u);
		int vroot = find(v);
		if(uroot == vroot){
			return;
		}
		if(rnk[vroot] > rnk[uroot]) swap(uroot, vroot);
		if(rnk[uroot] == rnk[vroot]) rnk[uroot]++;
		par[vroot] = uroot;
	}
};
vector<int> connected;
vector<int> mn(mxn, (1e9)+(1e8));
vector<vector<pair<int, int>>> ncosts(mxn);
int INF = 1e9+1;
int dfs1(int node, int par){
	connected.push_back(node);
	// cerr << imie(node) imie(curcost) ed;
	if(adj[node].size() == 1 && adj[node][0].first == par){
		mn[node]=0;
		return 0;
	}
	vector<pair<int, int>> costs;
	int mx=0;
	for(int i=0;i<adj[node].size();i++){
		int c = adj[node][i].second;
		int v=adj[node][i].first;
		if(v == par or v == node) continue;
		// cerr << imie(node) imie(v) ed;
		costs.push_back({dfs1(v, node)+c, v});
		mx=max(mx, costs.back().first);
	}
	mn[node] = min(mn[node], mx);
	sort(costs.begin(), costs.end());
	ncosts[node] = costs;
	return mx;
}
void dfs2(int node, int par, int ppar){
	mn[node] = max(mn[node], ppar);
	for(pair<int, int> i : adj[node]){
		int c=i.second;
		int v=i.first;
		if(v != par){
			if(ncosts[node].size() <= 1){
				dfs2(v, node, ppar+c);
			} else{
				int mx = ppar;
				if(ncosts[node].back().second == v){
					int sz=ncosts[node].size();
					mx = max(mx, ncosts[node][sz-2].first);
				} else{
					mx = max(mx, ncosts[node].back().first);
				}
				dfs2(v, node, mx+c);
			}
		}
	}
}
int ans = 0;
int dfs(int node, int par){
	vector<int> cur;
	int mx =0;
	for(pair<int, int> i : adj[node]){
		int v=i.first;
		int c=i.second;
		if(v == par) continue;
		cur.push_back(dfs(v, node)+c);
	}
	cur.push_back(0);
	cur.push_back(0);
	sort(cur.begin(), cur.end(),  greater<int>());
	mx=cur[0];
	int other = cur[1];
	ans = max(ans, mx + other);
	return mx;
}
int travelTime(int n, int m, int l, int a[], int b[], int t[]) {
	unionFind uf(n);
	for(int i=0;i<m;i++){
		int u=a[i];
		int v=b[i];
		int c=t[i];
		// cerr << imie(u) imie(v) ed;
		adj[u].push_back({v, c});
		adj[v].push_back({u, c});

		uf.join(u, v);
	}
	vector<int> vis(n);
	vector<int> bests;
	int mx=-1;
	int center = -1;
	for(int i=0;i<n;i++){
		if(!vis[uf.find(i)]){
			//find a
			dfs1(uf.find(i), -1);
			dfs2(uf.find(i), -1, 0);
			int mns = INF;
			int no = -1;
			for(int i : connected){
				if(mn[i] < mns){
					no = i;
					mns = mn[i];
				}

			}
			if(mns > mx){
				center = no;
				mx = mns;
			}
			bests.push_back(no);
			connected.clear();
			vis[uf.find(i)] = 1;
		}
	}
	for(int i=0;i<bests.size();i++){
		if(bests[i] == center) continue;
		adj[center].push_back({bests[i], l});
		adj[bests[i]].push_back({center, l});
	}
	dfs(center, -1);

	return ans;
}

Compilation message (stderr)

dreaming.cpp: In function 'int dfs1(int, int)':
dreaming.cpp:49:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |  for(int i=0;i<adj[node].size();i++){
      |              ~^~~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:140:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  140 |  for(int i=0;i<bests.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...