답안 #897383

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
897383 2024-01-03T03:01:40 Z NeroZein Designated Cities (JOI19_designated_cities) C++17
16 / 100
239 ms 47444 KB
#include "bits/stdc++.h"
using namespace std;

#ifdef Nero
#include "Deb.h"
#else
#define deb(...)
#endif

const int N = 2e5 + 5;

int n;
int cnt;
int euler[N];
bool active[N];
long long f[N];
long long ans[N];
int in[N], out[N];
long long dist[N];
pair<int, int> pr[N];
long long seg[N * 2];
long long lazy[N * 2];
vector<pair<int, int>> g[N];
pair<long long, long long> dp[N];

void dfs1(int v, int p) {
  long long mx = 0, mx2 = 0;
  for (auto [u, w] : g[v]) {
    if (u == p) continue;
    dist[1] += w;
    dfs1(u, v); 
    mx2 = max(mx2, dp[u].first + w); 
    if (mx2 > mx) swap(mx, mx2);
  }
  dp[v] = make_pair(mx, mx2);
}

void dfs2(int v, int p, long long up) {
  auto [mx, mx2] = dp[v];
  for (auto [u, w] : g[v]) {
    if (u == p) {
      dist[v] += w;
      up += w; 
    }
  }
  f[v] = max(mx, up);
  for (auto [u, w] : g[v]) {
    if (u == p) continue;
    dist[u] = dist[v] - w; 
    long long nup = (mx == dp[u].first + w ? mx2 : mx);
    nup = max(up, nup);
    dfs2(u, v, nup);
  }
}

void push(int nd, int l, int r) {
  if (!lazy[nd]) return;
  seg[nd] += lazy[nd];
  if (l != r) {
    int mid = (l + r) >> 1;
    int rs = nd + ((mid - l + 1) << 1);
    lazy[nd + 1] += lazy[nd];
    lazy[rs] += lazy[nd];    
  }
  lazy[nd] = 0; 
}

void upd(int nd, int l, int r, int s, int e, int v) {
  push(nd, l, r);
  if (l >= s && r <= e) {
    lazy[nd] = v; 
    push(nd, l, r);
    return;
  }
  int mid = (l + r) >> 1;
  int rs = nd + ((mid - l + 1) << 1);
  if (mid >= e) {
    push(rs, mid + 1, r);
    upd(nd + 1, l, mid, s, e, v); 
  } else {
    if (mid < s) {
      push(nd + 1, l, mid);
      upd(rs, mid + 1, r, s, e, v); 
    } else {
      upd(nd + 1, l, mid, s, e, v);
      upd(rs, mid + 1, r, s, e, v);       
    }
  }
  seg[nd] = max(seg[nd + 1], seg[rs]); 
}

int get(int nd, int l, int r) {
  push(nd, l, r); 
  if (l == r) {
    return euler[l]; 
  }
  int mid = (l + r) >> 1;
  int rs = nd + ((mid - l + 1) << 1);
  push(nd + 1, l, mid);
  push(rs, mid + 1, r); 
  if (seg[nd + 1] > seg[rs]) {
    return get(nd + 1, l, mid);
  }
  return get(rs, mid + 1, r); 
}

bool dfs3(int v, int p, int o) {
  euler[cnt] = v; 
  in[v] = cnt++;
  bool ret = o == v;
  for (auto [u, w] : g[v]) {
    if (u == p) continue;
    pr[u] = make_pair(v, w);
    bool ru = dfs3(u, v, o);
    if (!ru) {
      upd(0, 0, n - 1, in[u], out[u], w);
    } else {
      ret = true;
    }
  }
  out[v] = cnt - 1;
  active[v] = ret;
  return ret; 
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n;
  for (int i = 1; i < n; ++i) {
    int u, v, c, d;
    cin >> u >> v >> c >> d;
    g[u].emplace_back(v, c);
    g[v].emplace_back(u, d); 
  }
  dfs1(1, 0);
  dfs2(1, 0, 0);
  ans[1] = *min_element(dist + 1, dist + 1 + n);
  ans[2] = LLONG_MAX;
  dist[0] = LLONG_MAX;
  int r = 0, o = 0; 
  for (int i = 1; i <= n; ++i) {
    if (dist[i] - f[i] < dist[r] - f[r]) {
      r = i;
    } else if (dist[i] - f[i] == dist[r] - f[r]) {
      o = i;
    }
  }
  ans[2] = dist[r] - f[r];
  dfs3(r, r, o);
  for (int i = 3; i <= n; ++i) {
    if (!seg[0]) break;
    ans[i] = ans[i - 1] - seg[0];
    int v = get(0, 0, n - 1);
    //while (!active[v]) {
      //auto [pv, pw] = pr[v];
      //upd(0, 0, n - 1, in[v], out[v], -pw);
      //v = pv; 
    //}
  }
  int q;
  cin >> q;
  while (q--) {
    int e;
    cin >> e;
    cout << ans[e] << '\n'; 
  }
  return 0;
}

Compilation message

designated_cities.cpp: In function 'int main()':
designated_cities.cpp:154:9: warning: unused variable 'v' [-Wunused-variable]
  154 |     int v = get(0, 0, n - 1);
      |         ^
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16728 KB Output is correct
2 Incorrect 3 ms 18780 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16732 KB Output is correct
2 Correct 215 ms 30432 KB Output is correct
3 Correct 172 ms 44112 KB Output is correct
4 Correct 203 ms 30548 KB Output is correct
5 Correct 195 ms 30384 KB Output is correct
6 Correct 239 ms 32908 KB Output is correct
7 Correct 182 ms 30596 KB Output is correct
8 Correct 217 ms 47444 KB Output is correct
9 Correct 170 ms 31040 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16732 KB Output is correct
2 Correct 221 ms 30520 KB Output is correct
3 Correct 179 ms 44112 KB Output is correct
4 Correct 203 ms 30544 KB Output is correct
5 Correct 230 ms 30544 KB Output is correct
6 Correct 213 ms 33500 KB Output is correct
7 Correct 171 ms 30912 KB Output is correct
8 Correct 221 ms 41864 KB Output is correct
9 Correct 148 ms 31092 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16728 KB Output is correct
2 Incorrect 3 ms 18780 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16732 KB Output is correct
2 Correct 215 ms 30432 KB Output is correct
3 Correct 172 ms 44112 KB Output is correct
4 Correct 203 ms 30548 KB Output is correct
5 Correct 195 ms 30384 KB Output is correct
6 Correct 239 ms 32908 KB Output is correct
7 Correct 182 ms 30596 KB Output is correct
8 Correct 217 ms 47444 KB Output is correct
9 Correct 170 ms 31040 KB Output is correct
10 Correct 2 ms 16732 KB Output is correct
11 Correct 221 ms 30520 KB Output is correct
12 Correct 179 ms 44112 KB Output is correct
13 Correct 203 ms 30544 KB Output is correct
14 Correct 230 ms 30544 KB Output is correct
15 Correct 213 ms 33500 KB Output is correct
16 Correct 171 ms 30912 KB Output is correct
17 Correct 221 ms 41864 KB Output is correct
18 Correct 148 ms 31092 KB Output is correct
19 Correct 3 ms 16880 KB Output is correct
20 Incorrect 219 ms 30544 KB Output isn't correct
21 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 16728 KB Output is correct
2 Incorrect 3 ms 18780 KB Output isn't correct
3 Halted 0 ms 0 KB -