제출 #56445

#제출 시각아이디문제언어결과실행 시간메모리
56445hamzqq9Dreaming (IOI13_dreaming)C++14
100 / 100
119 ms15216 KiB
#include "dreaming.h"
#include<bits/stdc++.h>
#define lf double
#define ll long long
#define ull unsigned ll
#define ii pair<int,int>
#define li pair<ll,int>
#define iii pair<ii,int>
#define iiii pair<ii,ii>
#define iiii2 pair<int,iii>
#define lii pair<ll,ii>
#define lolo pair<ll,ll>
#define heap priority_queue
#define mp make_pair
#define st first
#define nd second
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define all(x) x.begin(),x.end()
#define len(x) strlen(x)
#define sz(x) (int) x.size()
#define orta ((bas+son)/2)
#define min3(x,y,z) min(min(x,y),z)
#define max3(x,y,z) max(max(x,y),z)
#define umin(x,y) x=min(x,y)
#define umax(x,y) x=max(x,y)
#define dbgs(x) cerr<<(#x)<<" --> "<<(x)<<" "
#define dbg(x) cerr<<(#x)<<" --> "<<(x)<<endl;getchar()
#define MOD 1000000007
#define inf 1002000000
#define LOG 20
#define magic 100
#define MAX 100005
#define KOK 350
#define EPS 0.000000000001
#define pw(x) (1<<(x))
#define PI 3.1415926535
using namespace std;

vector< pair<int,short int> > v[MAX];
int mx[4],deep[MAX];
int cnt,Dcnt;
bool vis[MAX];

void up(int val) {

	mx[2]=val;

	for(int i=2;i>0;i--) {

		if(mx[i]>mx[i-1]) swap(mx[i],mx[i-1]);

	}

}

void dfs3(int node,int ata) {

	deep[node]=0;

	for(ii i:v[node]) {

		if(i.st==ata) continue ;

		dfs3(i.st,node);

		if(node==cnt) {

			up(deep[i.st]+i.nd);
		
		}
		else {

			umax(deep[node],deep[i.st]+i.nd);

		}

 	}

}

void dfs2(int node,int ata,int up_max) {

	int Mx[2]={0,0};

	int MX=max(deep[node],up_max);

	if(MX<Dcnt) {

		Dcnt=MX;
		cnt=node;

	}

	for(ii i:v[node]) {

		if(i.st==ata) continue ;

		Mx[1]=max(Mx[1],deep[i.st]+i.nd);

		if(Mx[1]>Mx[0]) swap(Mx[1],Mx[0]);

	}

	for(ii i:v[node]) {

		if(i.st==ata) continue ;

		int send=(Mx[Mx[0]==deep[i.st]+i.nd]);

		dfs2(i.st,node,max(up_max,send)+i.nd);

	}

}

void dfs1(int node,int ata) {

	deep[node]=0;
	vis[node]=true;

	for(ii i:v[node]) {

		if(i.st==ata) continue ;

		dfs1(i.st,node);

		umax(deep[node],deep[i.st]+i.nd);

	}

}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    
	vector<ii> CMP;

	for(int i=0;i<M;i++) {

		v[A[i]].pb({B[i],T[i]});
		v[B[i]].pb({A[i],T[i]});

	}

	for(int i=0;i<N;i++) {

		if(!vis[i]) {

			dfs1(i,-1);

			Dcnt=inf;

			dfs2(i,-1,0);

		//	printf("%d %d\n",Dcnt,cnt);

			mx[0]=mx[1]=0;

			dfs3(cnt,-1);

		//	printf("%d %d\n",mx[0],mx[1]);

			CMP.pb({mx[0],mx[1]});

		}

	}

	int ans=0;

	sort(all(CMP),greater<ii>());

	mx[0]=mx[1]=-inf;

	for(int i=0;i<sz(CMP);i++) {

		umax(ans,CMP[i].st+CMP[i].nd);

		if(i==0) {

			up(CMP[i].st);

		}
		else {

			up(CMP[i].st+L);

		}

	}

	umax(ans,mx[0]+mx[1]);

	return ans;

}
/*
int main() {

	freopen("read.txt","r",stdin);

	int a[55],b[55],t[55],L,N,M;

	scanf("%d %d %d",&N,&M,&L);

	for(int i=0;i<M;i++) {

		scanf("%d %d %d",&a[i],&b[i],&t[i]);

	}

	printf("%d\n",travelTime(N,M,L,a,b,t));

}*/
#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...