Submission #1146558

#TimeUsernameProblemLanguageResultExecution timeMemory
1146558zhasynDreaming (IOI13_dreaming)C++20
18 / 100
1093 ms11764 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
#define pb push_back
#define pf push_front
using namespace std;
#define F first
#define S second
typedef long long ll;
#define pii pair <int, int>
#define pll pair <ll, ll>
typedef long double ld;
const ll N = 1e5 + 100, M = 4096 + 10, len = 21, inf = 1e18;
const ll mod = 1e9 + 7;

vector <pii> q[N];
int cur[N], ans, put[N];
bool was[N];
int dfs1(int v, int pred){
	was[v] = true;
	int mx1 = 0, mx2 = 0;
	for(auto u : q[v]){
		if(u.F == pred) continue;
		int rs = dfs1(u.F, v) + u.S;
		if(rs > mx1){
			mx2 = mx1;
			mx1 = rs;
		} else mx2 = max(mx2, rs);
		put[v] = max(put[v], rs);
	}
	//ans = max(ans, mx1 + mx2);
	return put[v];
}
void dfs3(int v, int pred, int sum){
	ans = max(ans, sum);
	for(auto u : q[v]){
		if(u.F == pred) continue;
		dfs3(u.F, v, sum + u.S);
	}
}
int dfs2(int v, int pred){
	pii u;
	set <pii> st;
	st.insert({0, -1});
	for(int i = 0; i < (int)q[v].size(); i++){
		u = q[v][i];
		st.insert({put[u.F] + u.S, u.F});
	}
	for(int i = 0; i < (int)q[v].size(); i++){
		u = q[v][i];
		if(u.F == pred) continue;
		st.erase({put[u.F] + u.S, u.F});
		pii mx = *st.rbegin();
		if(put[u.F] > mx.F + u.S){
			put[v] = mx.F;
			return dfs2(u.F, v);
		}
		st.insert({put[u.F] + u.S, u.F});
	}
	return st.rbegin()->F;
}
int travelTime(int n, int m, int l, int a[], int b[], int t[]) {
    for(int i = 0; i < m; i++){
    	q[a[i]].pb({b[i], t[i]});
    	q[b[i]].pb({a[i], t[i]});
    }
    vector <int> vec;
    for(int i = 0; i < n; i++){
    	dfs3(i, -1, 0);
    	if(was[i]) continue;
    	dfs1(i, -1);
    	int mn = dfs2(i, -1);
    	vec.pb(mn);
    	//cout << i << " "<< mn << endl;
    	//cout << "NEW ONE\n\n";
    }
    sort(vec.begin(), vec.end());
    int ss = (int)vec.size();
    if((int)vec.size() >= 2) ans = max(ans, vec[ss - 1] + vec[ss - 2] + l);
	if((int)vec.size() >= 3) ans = max(ans, vec[ss - 3] + vec[ss - 2] + 2 * l);
    return ans;
}
// int main() {
  // ios::sync_with_stdio(false);
  // cin.tie(NULL);
  // int n, m, l;
  // cin >> n >> m >> l;
  // int a[m], b[m], x[m];
  // for(int i = 0; i < m; i++){
  	// cin >> a[i] >> b[i] >> x[i];
  // }
  // cout << travelTime(n, m, l, a, b, x);
  // return 0;
// }
#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...