답안 #257063

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
257063 2020-08-03T15:09:42 Z Bruteforceman Aesthetic (NOI20_aesthetic) C++11
51 / 100
1343 ms 79784 KB
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
const int logn = 19;
const long long inf = 1e16;
int anc[logn + 1][maxn];
int l[maxn], r[maxn], w[maxn];
vector <int> g[maxn], t[maxn];
long long ans[maxn];
int dep[maxn];
int n, m;

struct data {
  long long dist;
  int node;
  data (long long dist, int node) : dist(dist), node(node) {}
  data () {}
  bool operator < (data d) const {
    return dist > d.dist;
  }
};

vector <long long> dijstra(int root) {
  priority_queue <data> Q;

  vector <long long> dist (n, inf);
  Q.emplace(0, root);
  dist[root] = 0;
  while(!Q.empty()) {
    int node = Q.top().node;
    long long var = Q.top().dist;
    Q.pop();
    if(var != dist[node]) continue;
    for(int e : g[node]) {
      int x = l[e] ^ r[e] ^ node;
      if(w[e] + dist[node] < dist[x]) {
        dist[x] = w[e] + dist[node];
        Q.emplace(dist[x], x);
      }
    }
  }
  return dist;
}
void dfs(int x) {
  for(int i = 1; i <= logn; i++) {
    anc[i][x] = anc[i - 1][anc[i - 1][x]];
  }
  for(int i : t[x]) {
    dep[i] = 1 + dep[x];
    anc[0][i] = x;
    dfs(i);
  }
}
int lca(int x, int y) {
  if(dep[x] > dep[y]) swap(x, y);
  for(int i = logn; i >= 0; i--) {
    if(dep[y] - (1 << i) >= dep[x]) {
      y = anc[i][y];
    }
  }
  if(x == y) return x;
  for(int i = logn; i >= 0; i--) {
    if(anc[i][x] != anc[i][y]) {
      x = anc[i][x];
      y = anc[i][y];
    }
  }
  return anc[0][x];
}
long long prop[maxn * 4];
void update(int x, int y, long long val, int c = 1, int b = 0, int e = n) {
  if(x <= b && e <= y) {
    prop[c] = min(prop[c], val);
    return ;
  }
  if(y < b || e < x) return ;
  int m = (b + e) >> 1;
  int l = c << 1;
  int r = l + 1;
  update(x, y, val, l, b, m);
  update(x, y, val, r, m + 1, e);
}
long long get(int x, int c = 1, int b = 0, int e = n) {
  if(b == e) return prop[c];
  int m = (b + e) >> 1;
  int l = c << 1;
  int r = l + 1;
  if(x <= m) return min(prop[c], get(x, l, b, m));
  else return min(prop[c], get(x, r, m + 1, e));
}
int main() {
  scanf("%d %d", &n, &m);
  for(int i = 0; i < m; i++) {
    scanf("%d %d %d", &l[i], &r[i], &w[i]);
    l[i] -= 1;
    r[i] -= 1;
    g[l[i]].push_back(i);
    g[r[i]].push_back(i);
  }
  for(int i = 0; i <= 4 * (n + 1); i++) prop[i] = inf;
  vector <long long> forward = dijstra(0);
  vector <int> par (n);
  for(int i = 1; i < n; i++) {
    for(int e : g[i]) {
      int x = l[e] ^ r[e] ^ i;
      if(forward[x] + w[e] == forward[i]) {
        par[i] = e;
        t[x].push_back(i);
        break;
      }
    }
  }
  dfs(0);
  vector <long long> backward = dijstra(n - 1);
  int cur = n - 1;
  vector <bool> onPath (m);
  vector <int> id (n);
  while(cur != 0) {
    int e = par[cur];
    onPath[e] = true;
    cur = anc[0][cur];
    id[dep[cur]] = e;
  }
  for(int i = 0; i < m; i++) ans[i] = inf;
  for(int i = 0; i < m; i++) {
    if(onPath[i]) continue;
    ans[i] = forward[n - 1];
    int p = lca(l[i], n - 1);
    int q = lca(r[i], n - 1);
    if(dep[p] > dep[q])  {
      swap(p, q);
      swap(l[i], r[i]);
    }
    long long cost = w[i] + forward[l[i]] + backward[r[i]];
    if(dep[p] < dep[q]) {
      update(dep[p], dep[q] - 1, cost);
    }
  }
  for(int i = 0; i < dep[n - 1]; i++) {
    ans[id[i]] = get(i);
  }
  int mx = w[m - 1];
  long long res = 0;
  for(int i = m - 2; i >= 0; i--) {
    long long p = forward[l[i]] + mx + w[i] + backward[r[i]];
    long long q = forward[r[i]] + mx + w[i] + backward[l[i]];
    res = max(res, min({ans[i], p, q}));
    mx = max(mx, w[i]);
  }
  printf("%lld\n", res);
  return 0;
}

Compilation message

Aesthetic.cpp: In function 'int main()':
Aesthetic.cpp:92:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &n, &m);
   ~~~~~^~~~~~~~~~~~~~~~~
Aesthetic.cpp:94:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &l[i], &r[i], &w[i]);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 14592 KB Output is correct
2 Correct 10 ms 14592 KB Output is correct
3 Correct 10 ms 14592 KB Output is correct
4 Correct 10 ms 14592 KB Output is correct
5 Correct 9 ms 14592 KB Output is correct
6 Correct 9 ms 14592 KB Output is correct
7 Correct 10 ms 14592 KB Output is correct
8 Correct 11 ms 14592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 14592 KB Output is correct
2 Correct 10 ms 14592 KB Output is correct
3 Correct 10 ms 14592 KB Output is correct
4 Correct 10 ms 14592 KB Output is correct
5 Correct 9 ms 14592 KB Output is correct
6 Correct 9 ms 14592 KB Output is correct
7 Correct 10 ms 14592 KB Output is correct
8 Correct 11 ms 14592 KB Output is correct
9 Correct 12 ms 14848 KB Output is correct
10 Correct 13 ms 14848 KB Output is correct
11 Correct 13 ms 14976 KB Output is correct
12 Correct 13 ms 14848 KB Output is correct
13 Correct 12 ms 14720 KB Output is correct
14 Correct 11 ms 14720 KB Output is correct
15 Correct 13 ms 14720 KB Output is correct
16 Correct 12 ms 14720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1255 ms 78864 KB Output is correct
2 Correct 1108 ms 79352 KB Output is correct
3 Correct 1260 ms 78456 KB Output is correct
4 Correct 1258 ms 78456 KB Output is correct
5 Correct 1288 ms 78540 KB Output is correct
6 Correct 1201 ms 79608 KB Output is correct
7 Correct 1163 ms 79176 KB Output is correct
8 Correct 1227 ms 79784 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1343 ms 79548 KB Output is correct
2 Correct 1300 ms 78712 KB Output is correct
3 Correct 1241 ms 78548 KB Output is correct
4 Correct 1032 ms 79608 KB Output is correct
5 Correct 1164 ms 78328 KB Output is correct
6 Correct 1033 ms 78712 KB Output is correct
7 Correct 1214 ms 78584 KB Output is correct
8 Correct 1259 ms 78968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1095 ms 61952 KB Output is correct
2 Correct 378 ms 72952 KB Output is correct
3 Correct 406 ms 44024 KB Output is correct
4 Correct 416 ms 44024 KB Output is correct
5 Correct 412 ms 44152 KB Output is correct
6 Correct 413 ms 44152 KB Output is correct
7 Correct 407 ms 44152 KB Output is correct
8 Correct 405 ms 44156 KB Output is correct
9 Correct 411 ms 44152 KB Output is correct
10 Correct 406 ms 44280 KB Output is correct
11 Correct 413 ms 44152 KB Output is correct
12 Correct 867 ms 61216 KB Output is correct
13 Correct 441 ms 44152 KB Output is correct
14 Correct 273 ms 67320 KB Output is correct
15 Correct 248 ms 64124 KB Output is correct
16 Correct 839 ms 60048 KB Output is correct
17 Correct 818 ms 58864 KB Output is correct
18 Correct 888 ms 59760 KB Output is correct
19 Correct 346 ms 73272 KB Output is correct
20 Correct 376 ms 73468 KB Output is correct
21 Correct 344 ms 73208 KB Output is correct
22 Correct 371 ms 73336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1095 ms 61952 KB Output is correct
2 Correct 378 ms 72952 KB Output is correct
3 Correct 406 ms 44024 KB Output is correct
4 Correct 416 ms 44024 KB Output is correct
5 Correct 412 ms 44152 KB Output is correct
6 Correct 413 ms 44152 KB Output is correct
7 Correct 407 ms 44152 KB Output is correct
8 Correct 405 ms 44156 KB Output is correct
9 Correct 411 ms 44152 KB Output is correct
10 Correct 406 ms 44280 KB Output is correct
11 Correct 413 ms 44152 KB Output is correct
12 Correct 867 ms 61216 KB Output is correct
13 Correct 441 ms 44152 KB Output is correct
14 Correct 273 ms 67320 KB Output is correct
15 Correct 248 ms 64124 KB Output is correct
16 Correct 839 ms 60048 KB Output is correct
17 Correct 818 ms 58864 KB Output is correct
18 Correct 888 ms 59760 KB Output is correct
19 Correct 346 ms 73272 KB Output is correct
20 Correct 376 ms 73468 KB Output is correct
21 Correct 344 ms 73208 KB Output is correct
22 Correct 371 ms 73336 KB Output is correct
23 Correct 773 ms 61244 KB Output is correct
24 Correct 331 ms 51724 KB Output is correct
25 Correct 480 ms 43256 KB Output is correct
26 Correct 439 ms 43128 KB Output is correct
27 Correct 444 ms 43212 KB Output is correct
28 Correct 450 ms 40952 KB Output is correct
29 Correct 473 ms 41080 KB Output is correct
30 Correct 557 ms 40952 KB Output is correct
31 Correct 460 ms 41080 KB Output is correct
32 Correct 467 ms 40952 KB Output is correct
33 Correct 509 ms 41208 KB Output is correct
34 Correct 760 ms 58056 KB Output is correct
35 Correct 449 ms 41080 KB Output is correct
36 Correct 248 ms 58088 KB Output is correct
37 Correct 217 ms 39916 KB Output is correct
38 Incorrect 843 ms 58628 KB Output isn't correct
39 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 14592 KB Output is correct
2 Correct 10 ms 14592 KB Output is correct
3 Correct 10 ms 14592 KB Output is correct
4 Correct 10 ms 14592 KB Output is correct
5 Correct 9 ms 14592 KB Output is correct
6 Correct 9 ms 14592 KB Output is correct
7 Correct 10 ms 14592 KB Output is correct
8 Correct 11 ms 14592 KB Output is correct
9 Correct 12 ms 14848 KB Output is correct
10 Correct 13 ms 14848 KB Output is correct
11 Correct 13 ms 14976 KB Output is correct
12 Correct 13 ms 14848 KB Output is correct
13 Correct 12 ms 14720 KB Output is correct
14 Correct 11 ms 14720 KB Output is correct
15 Correct 13 ms 14720 KB Output is correct
16 Correct 12 ms 14720 KB Output is correct
17 Correct 1255 ms 78864 KB Output is correct
18 Correct 1108 ms 79352 KB Output is correct
19 Correct 1260 ms 78456 KB Output is correct
20 Correct 1258 ms 78456 KB Output is correct
21 Correct 1288 ms 78540 KB Output is correct
22 Correct 1201 ms 79608 KB Output is correct
23 Correct 1163 ms 79176 KB Output is correct
24 Correct 1227 ms 79784 KB Output is correct
25 Correct 1343 ms 79548 KB Output is correct
26 Correct 1300 ms 78712 KB Output is correct
27 Correct 1241 ms 78548 KB Output is correct
28 Correct 1032 ms 79608 KB Output is correct
29 Correct 1164 ms 78328 KB Output is correct
30 Correct 1033 ms 78712 KB Output is correct
31 Correct 1214 ms 78584 KB Output is correct
32 Correct 1259 ms 78968 KB Output is correct
33 Correct 1095 ms 61952 KB Output is correct
34 Correct 378 ms 72952 KB Output is correct
35 Correct 406 ms 44024 KB Output is correct
36 Correct 416 ms 44024 KB Output is correct
37 Correct 412 ms 44152 KB Output is correct
38 Correct 413 ms 44152 KB Output is correct
39 Correct 407 ms 44152 KB Output is correct
40 Correct 405 ms 44156 KB Output is correct
41 Correct 411 ms 44152 KB Output is correct
42 Correct 406 ms 44280 KB Output is correct
43 Correct 413 ms 44152 KB Output is correct
44 Correct 867 ms 61216 KB Output is correct
45 Correct 441 ms 44152 KB Output is correct
46 Correct 273 ms 67320 KB Output is correct
47 Correct 248 ms 64124 KB Output is correct
48 Correct 839 ms 60048 KB Output is correct
49 Correct 818 ms 58864 KB Output is correct
50 Correct 888 ms 59760 KB Output is correct
51 Correct 346 ms 73272 KB Output is correct
52 Correct 376 ms 73468 KB Output is correct
53 Correct 344 ms 73208 KB Output is correct
54 Correct 371 ms 73336 KB Output is correct
55 Correct 773 ms 61244 KB Output is correct
56 Correct 331 ms 51724 KB Output is correct
57 Correct 480 ms 43256 KB Output is correct
58 Correct 439 ms 43128 KB Output is correct
59 Correct 444 ms 43212 KB Output is correct
60 Correct 450 ms 40952 KB Output is correct
61 Correct 473 ms 41080 KB Output is correct
62 Correct 557 ms 40952 KB Output is correct
63 Correct 460 ms 41080 KB Output is correct
64 Correct 467 ms 40952 KB Output is correct
65 Correct 509 ms 41208 KB Output is correct
66 Correct 760 ms 58056 KB Output is correct
67 Correct 449 ms 41080 KB Output is correct
68 Correct 248 ms 58088 KB Output is correct
69 Correct 217 ms 39916 KB Output is correct
70 Incorrect 843 ms 58628 KB Output isn't correct
71 Halted 0 ms 0 KB -