답안 #142853

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
142853 2019-08-11T14:15:03 Z Milki 꿈 (IOI13_dreaming) C++14
18 / 100
117 ms 14964 KB
//#ifndef DREAMING_H_INCLUDED
//#define DREAMING_H_INCLUDED

#include "dreaming.h"
#include<bits/stdc++.h>
using namespace std;

#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define REP(i, n) FOR(i, 0, n)
#define _ << " " <<
#define sz(x) ((int) x.size())
#define pb(x) push_back(x)
#define TRACE(x) cerr << #x << " = " << x << endl

typedef long long ll;
typedef pair<int, int> point;

const int MAXN = 1e5 + 5;

vector <point> E[MAXN];
vector <int> component[MAXN];
int boja[MAXN], dist[MAXN], dep[MAXN];
point par[MAXN], mx[MAXN];

void color(int x, int Time){
  boja[x] = Time;
  component[Time].pb(x);
  for(auto e : E[x]){
    if(boja[e.first] != -1) continue;
    color(e.first, Time);
  }
}

point find_furthest(int cmp, int x){
  for(auto it : component[cmp])
    dist[it] = 0;

  queue<int> Q;
  Q.push(x);

  point ret = point(0, 0);
  while(!Q.empty()){
    int nx = Q.front(); Q.pop();
    for(auto e : E[nx]){
      if(dist[e.first] || e.first == x)
        continue;

      par[e.first] = point(nx, e.second);
      dep[e.first] = dep[nx] + 1;
      dist[e.first] = dist[nx] + e.second;
      ret = max(ret, point(dist[e.first], e.first));
      Q.push(e.first);
    }
  }

  return ret;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
  REP(i, M){
    E[ A[i] ].pb( point( B[i], T[i] ) );
    E[ B[i] ].pb( point( A[i], T[i] ) );
  }

  memset(boja, -1, sizeof(boja));
  int Time = 0;
  REP(i, N)
    if(boja[i] == -1)
      color(i, Time ++);

  int ret = 0;
  REP(i, Time){
    int a = find_furthest(i, component[i][0]).second;
    point najdalji = find_furthest(i, a);
    int b = najdalji.second, d = najdalji.first;

    if(dep[a] < dep[b])
      swap(a, b);

    ret = max(ret, d);
    mx[i] = point(d, a);

    deque<point> lt, rt;

    while(dep[a] != dep[b]){
      lt.push_back(par[a]);
      a = par[a].first;
    }

    while(a != b){
      lt.push_back(par[a]);
      a = par[a].first;

      rt.push_front(point(b, par[b].second));
      b = par[b].first;
    }

    vector <point> center;
    center.pb(point(d, 0));

    int sum = 0;
    for(auto it : lt){
      sum += it.second;
      int ndist = max(d - sum, sum);
      if(ndist < center[0].first){
        center.clear();
        center.pb(point(ndist, it.first));
      }
      else if(ndist == center[0].first){
        center.pb(point(ndist, it.first));
      }
    }
    for(auto it : rt){
      sum += it.second;
      int ndist = max(d - sum, sum);
      if(ndist < center[0].first){
        center.clear();
        center.pb(point(ndist, it.first));
      }
      else if(ndist == center[0].first){
        center.pb(point(ndist, it.first));
      }
    }
    point zz = point(1e9, 1e9);
    for(auto it : center){
      zz = min(mx[i], find_furthest(i, it.second));
    }
    mx[i] = max(mx[i], zz);
  }

  sort(mx, mx + Time, greater<point>());
  //TRACE(mx[0].first); TRACE(mx[1].first); TRACE(L);

  if(Time == 1)
    return ret;
  else if(Time == 2)
    return max(ret, mx[0].first + mx[1].first + L);
  else
    return max(mx[1].first + mx[2].first + 2 * L, max(ret, mx[0].first + mx[1].first + L));
}

//#endif // DREAMING_H_INCLUDED
# 결과 실행 시간 메모리 Grader output
1 Incorrect 117 ms 14964 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 117 ms 14964 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 117 ms 14964 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 106 ms 12088 KB Output is correct
2 Correct 104 ms 12120 KB Output is correct
3 Correct 102 ms 12152 KB Output is correct
4 Correct 106 ms 12244 KB Output is correct
5 Correct 102 ms 12180 KB Output is correct
6 Correct 105 ms 12520 KB Output is correct
7 Correct 99 ms 12408 KB Output is correct
8 Correct 93 ms 11996 KB Output is correct
9 Correct 101 ms 12056 KB Output is correct
10 Correct 108 ms 12344 KB Output is correct
11 Correct 6 ms 5496 KB Output is correct
12 Correct 79 ms 10872 KB Output is correct
13 Correct 79 ms 11000 KB Output is correct
14 Correct 78 ms 10872 KB Output is correct
15 Correct 79 ms 10904 KB Output is correct
16 Correct 79 ms 10844 KB Output is correct
17 Correct 78 ms 10248 KB Output is correct
18 Correct 81 ms 11000 KB Output is correct
19 Correct 80 ms 10872 KB Output is correct
20 Correct 7 ms 5496 KB Output is correct
21 Correct 6 ms 5368 KB Output is correct
22 Correct 8 ms 5624 KB Output is correct
23 Correct 79 ms 10792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 117 ms 14964 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 117 ms 14964 KB Output isn't correct
2 Halted 0 ms 0 KB -