답안 #257094

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
257094 2020-08-03T15:25:54 Z Bruteforceman Aesthetic (NOI20_aesthetic) C++11
51 / 100
1414 ms 82260 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 <long long> backward = dijstra(n - 1);

  vector <int> par (n);
  vector <pair <long long, int>> ord;
  for(int i = 0; i < n; i++) ord.emplace_back(forward[i], i);
  sort(ord.begin(), ord.end());
  vector <bool> done (n, false);
  for(auto y : ord) {
    int i = y.second;
    for(int e : g[i]) {
      int x = l[e] ^ r[e] ^ i;
      if(forward[x] + w[e] == forward[i] && done[x]) {
        par[i] = e;
        t[x].push_back(i);
        break;
      }
    }
    done[i] = true;
  }
  dfs(0);
  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);
    }
    long long cost = min(w[i] + forward[l[i]] + backward[r[i]], 
        w[i] + forward[r[i]] + backward[l[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 10 ms 14592 KB Output is correct
2 Correct 9 ms 14592 KB Output is correct
3 Correct 9 ms 14592 KB Output is correct
4 Correct 11 ms 14592 KB Output is correct
5 Correct 10 ms 14592 KB Output is correct
6 Correct 10 ms 14592 KB Output is correct
7 Correct 10 ms 14592 KB Output is correct
8 Correct 10 ms 14592 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 14592 KB Output is correct
2 Correct 9 ms 14592 KB Output is correct
3 Correct 9 ms 14592 KB Output is correct
4 Correct 11 ms 14592 KB Output is correct
5 Correct 10 ms 14592 KB Output is correct
6 Correct 10 ms 14592 KB Output is correct
7 Correct 10 ms 14592 KB Output is correct
8 Correct 10 ms 14592 KB Output is correct
9 Correct 11 ms 14976 KB Output is correct
10 Correct 11 ms 14976 KB Output is correct
11 Correct 11 ms 14976 KB Output is correct
12 Correct 11 ms 14976 KB Output is correct
13 Correct 11 ms 14720 KB Output is correct
14 Correct 13 ms 14720 KB Output is correct
15 Correct 11 ms 14720 KB Output is correct
16 Correct 11 ms 14720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1201 ms 80856 KB Output is correct
2 Correct 1074 ms 81364 KB Output is correct
3 Correct 1277 ms 80384 KB Output is correct
4 Correct 1208 ms 80304 KB Output is correct
5 Correct 1330 ms 80596 KB Output is correct
6 Correct 1259 ms 82088 KB Output is correct
7 Correct 1271 ms 81752 KB Output is correct
8 Correct 1301 ms 82260 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1326 ms 82132 KB Output is correct
2 Correct 1246 ms 81184 KB Output is correct
3 Correct 1049 ms 81312 KB Output is correct
4 Correct 1081 ms 82260 KB Output is correct
5 Correct 1256 ms 80984 KB Output is correct
6 Correct 1077 ms 81364 KB Output is correct
7 Correct 1302 ms 81084 KB Output is correct
8 Correct 1414 ms 81560 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1006 ms 63328 KB Output is correct
2 Correct 397 ms 75104 KB Output is correct
3 Correct 450 ms 43756 KB Output is correct
4 Correct 482 ms 43504 KB Output is correct
5 Correct 443 ms 43624 KB Output is correct
6 Correct 482 ms 43628 KB Output is correct
7 Correct 480 ms 43756 KB Output is correct
8 Correct 490 ms 43884 KB Output is correct
9 Correct 471 ms 43628 KB Output is correct
10 Correct 410 ms 43752 KB Output is correct
11 Correct 415 ms 43632 KB Output is correct
12 Correct 904 ms 62552 KB Output is correct
13 Correct 415 ms 43628 KB Output is correct
14 Correct 262 ms 68576 KB Output is correct
15 Correct 256 ms 65508 KB Output is correct
16 Correct 1002 ms 61368 KB Output is correct
17 Correct 1095 ms 60120 KB Output is correct
18 Correct 907 ms 61304 KB Output is correct
19 Correct 355 ms 75620 KB Output is correct
20 Correct 362 ms 75608 KB Output is correct
21 Correct 380 ms 75620 KB Output is correct
22 Correct 385 ms 75492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1006 ms 63328 KB Output is correct
2 Correct 397 ms 75104 KB Output is correct
3 Correct 450 ms 43756 KB Output is correct
4 Correct 482 ms 43504 KB Output is correct
5 Correct 443 ms 43624 KB Output is correct
6 Correct 482 ms 43628 KB Output is correct
7 Correct 480 ms 43756 KB Output is correct
8 Correct 490 ms 43884 KB Output is correct
9 Correct 471 ms 43628 KB Output is correct
10 Correct 410 ms 43752 KB Output is correct
11 Correct 415 ms 43632 KB Output is correct
12 Correct 904 ms 62552 KB Output is correct
13 Correct 415 ms 43628 KB Output is correct
14 Correct 262 ms 68576 KB Output is correct
15 Correct 256 ms 65508 KB Output is correct
16 Correct 1002 ms 61368 KB Output is correct
17 Correct 1095 ms 60120 KB Output is correct
18 Correct 907 ms 61304 KB Output is correct
19 Correct 355 ms 75620 KB Output is correct
20 Correct 362 ms 75608 KB Output is correct
21 Correct 380 ms 75620 KB Output is correct
22 Correct 385 ms 75492 KB Output is correct
23 Correct 989 ms 62580 KB Output is correct
24 Correct 362 ms 53860 KB Output is correct
25 Correct 478 ms 42856 KB Output is correct
26 Correct 483 ms 43116 KB Output is correct
27 Correct 451 ms 42988 KB Output is correct
28 Correct 482 ms 42600 KB Output is correct
29 Correct 477 ms 42604 KB Output is correct
30 Correct 469 ms 42600 KB Output is correct
31 Correct 508 ms 42856 KB Output is correct
32 Correct 495 ms 42476 KB Output is correct
33 Correct 493 ms 42856 KB Output is correct
34 Correct 851 ms 60796 KB Output is correct
35 Correct 458 ms 42728 KB Output is correct
36 Correct 241 ms 60332 KB Output is correct
37 Correct 262 ms 60416 KB Output is correct
38 Incorrect 878 ms 61960 KB Output isn't correct
39 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 14592 KB Output is correct
2 Correct 9 ms 14592 KB Output is correct
3 Correct 9 ms 14592 KB Output is correct
4 Correct 11 ms 14592 KB Output is correct
5 Correct 10 ms 14592 KB Output is correct
6 Correct 10 ms 14592 KB Output is correct
7 Correct 10 ms 14592 KB Output is correct
8 Correct 10 ms 14592 KB Output is correct
9 Correct 11 ms 14976 KB Output is correct
10 Correct 11 ms 14976 KB Output is correct
11 Correct 11 ms 14976 KB Output is correct
12 Correct 11 ms 14976 KB Output is correct
13 Correct 11 ms 14720 KB Output is correct
14 Correct 13 ms 14720 KB Output is correct
15 Correct 11 ms 14720 KB Output is correct
16 Correct 11 ms 14720 KB Output is correct
17 Correct 1201 ms 80856 KB Output is correct
18 Correct 1074 ms 81364 KB Output is correct
19 Correct 1277 ms 80384 KB Output is correct
20 Correct 1208 ms 80304 KB Output is correct
21 Correct 1330 ms 80596 KB Output is correct
22 Correct 1259 ms 82088 KB Output is correct
23 Correct 1271 ms 81752 KB Output is correct
24 Correct 1301 ms 82260 KB Output is correct
25 Correct 1326 ms 82132 KB Output is correct
26 Correct 1246 ms 81184 KB Output is correct
27 Correct 1049 ms 81312 KB Output is correct
28 Correct 1081 ms 82260 KB Output is correct
29 Correct 1256 ms 80984 KB Output is correct
30 Correct 1077 ms 81364 KB Output is correct
31 Correct 1302 ms 81084 KB Output is correct
32 Correct 1414 ms 81560 KB Output is correct
33 Correct 1006 ms 63328 KB Output is correct
34 Correct 397 ms 75104 KB Output is correct
35 Correct 450 ms 43756 KB Output is correct
36 Correct 482 ms 43504 KB Output is correct
37 Correct 443 ms 43624 KB Output is correct
38 Correct 482 ms 43628 KB Output is correct
39 Correct 480 ms 43756 KB Output is correct
40 Correct 490 ms 43884 KB Output is correct
41 Correct 471 ms 43628 KB Output is correct
42 Correct 410 ms 43752 KB Output is correct
43 Correct 415 ms 43632 KB Output is correct
44 Correct 904 ms 62552 KB Output is correct
45 Correct 415 ms 43628 KB Output is correct
46 Correct 262 ms 68576 KB Output is correct
47 Correct 256 ms 65508 KB Output is correct
48 Correct 1002 ms 61368 KB Output is correct
49 Correct 1095 ms 60120 KB Output is correct
50 Correct 907 ms 61304 KB Output is correct
51 Correct 355 ms 75620 KB Output is correct
52 Correct 362 ms 75608 KB Output is correct
53 Correct 380 ms 75620 KB Output is correct
54 Correct 385 ms 75492 KB Output is correct
55 Correct 989 ms 62580 KB Output is correct
56 Correct 362 ms 53860 KB Output is correct
57 Correct 478 ms 42856 KB Output is correct
58 Correct 483 ms 43116 KB Output is correct
59 Correct 451 ms 42988 KB Output is correct
60 Correct 482 ms 42600 KB Output is correct
61 Correct 477 ms 42604 KB Output is correct
62 Correct 469 ms 42600 KB Output is correct
63 Correct 508 ms 42856 KB Output is correct
64 Correct 495 ms 42476 KB Output is correct
65 Correct 493 ms 42856 KB Output is correct
66 Correct 851 ms 60796 KB Output is correct
67 Correct 458 ms 42728 KB Output is correct
68 Correct 241 ms 60332 KB Output is correct
69 Correct 262 ms 60416 KB Output is correct
70 Incorrect 878 ms 61960 KB Output isn't correct
71 Halted 0 ms 0 KB -