답안 #1068607

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1068607 2024-08-21T10:55:19 Z duckindog Inside information (BOI21_servers) C++17
15 / 100
1066 ms 46708 KB
#include <bits/stdc++.h>

using namespace std;

const int N = 120'000 + 10;
int n, k;
vector<pair<int, int>> ad[N];
vector<tuple<int, int, int>> Q;

int st[N], ed[N], it;
int f[N][18], increase[N][18], decrease[N][18];
void dfs(int u, int p = -1) { 
  st[u] = ++it;

  for (int i = 1; i <= 17; ++i) { 
    f[u][i] = f[f[u][i - 1]][i - 1];

    if (increase[u][i - 1] != -1 && increase[f[u][i - 1]][i - 1] != -1) { 
      if (increase[u][i - 1] < increase[f[u][i - 1]][0]) 
        increase[u][i] = increase[f[u][i - 1]][i - 1];
    }
    if (decrease[u][i - 1] != -1 && decrease[f[u][i - 1]][i - 1] != -1) { 
      if (decrease[u][i - 1] > decrease[f[u][i - 1]][0]) 
        decrease[u][i] = decrease[f[u][i - 1]][i - 1];
    }
  }

  for (const auto& [v, w] : ad[u]) { 
    if (v == p) continue;
    f[v][0] = u;
    increase[v][0] = decrease[v][0] = w;
    dfs(v, u);
  }

  ed[u] = it;
}
inline bool anc(int u, int v) { return st[u] <= st[v] && ed[u] >= ed[v]; }

int get(int u, int v) { 
  int uwd = 0, dwd = 1'000'000, ma = 0;
  for (int i = 17; i >= 0; --i) { 
    if (anc(f[u][i], v)) continue;
    if (uwd > increase[u][i] || increase[u][i] == -1) return -1;
    uwd = increase[u][i];
    u = f[u][i];
  }
  if (!anc(u, v) && anc(f[u][0], v)) { 
    if (uwd > increase[u][0] || increase[u][0] == -1) return -1;
    uwd = increase[u][0];
    u = f[u][0];
  } ma = uwd;
  
  for (int i = 17; i >= 0; --i) { 
    if (anc(f[v][i], u)) continue;
    if (dwd < decrease[v][i] || decrease[v][i] == -1) return -1;
    dwd = decrease[v][i];
    ma = max(ma, decrease[v][0]);
    v = f[v][i];
  }
  
  if (v != u) { 
    if (dwd < decrease[v][0] || decrease[v][0] == -1) return -1;
    dwd = decrease[v][0];
    ma = max(ma, decrease[v][0]);
    v = f[v][0];
  }

  return uwd < dwd ? ma : -1;
}

int32_t main() { 
  cin.tie(0)->sync_with_stdio(0);

  cin >> n >> k;
  for (int i = 1; i < n + k; ++i) { 
    char type; cin >> type;
    if (type == 'S') { 
      int a, b; cin >> a >> b;
      ad[a].push_back({b, i});
      ad[b].push_back({a, i});
      cerr << a << " " << b << " " << i << "\n";
    }

    if (type == 'Q') { 
      int a, d; cin >> a >> d;
      Q.emplace_back(a, d, i);
    }

    if (type == 'C') { 
      int d; cin >> d;
      Q.emplace_back(0, d, i);
    }
  }

  memset(increase, -1, sizeof increase);
  memset(decrease, -1, sizeof decrease);
  for (int i = 1; i <= n; ++i) if (!f[i][0]) dfs(f[i][0] = i);

  for (const auto& [a, d, i] : Q) { 
    if (!a) continue;
    int time = get(d, a);
    cout << (time == -1 || time > i ? "no" : "yes") << '\n';
  }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 25304 KB Output is correct
2 Correct 55 ms 25272 KB Output is correct
3 Correct 106 ms 25516 KB Output is correct
4 Correct 59 ms 25368 KB Output is correct
5 Correct 68 ms 25700 KB Output is correct
6 Correct 52 ms 25332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 25304 KB Output is correct
2 Correct 55 ms 25272 KB Output is correct
3 Correct 106 ms 25516 KB Output is correct
4 Correct 59 ms 25368 KB Output is correct
5 Correct 68 ms 25700 KB Output is correct
6 Correct 52 ms 25332 KB Output is correct
7 Incorrect 24 ms 25144 KB Extra information in the output file
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 25296 KB Output is correct
2 Correct 1066 ms 37780 KB Output is correct
3 Correct 974 ms 37720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 25296 KB Output is correct
2 Correct 1066 ms 37780 KB Output is correct
3 Correct 974 ms 37720 KB Output is correct
4 Incorrect 27 ms 25228 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 25288 KB Output is correct
2 Incorrect 1047 ms 46668 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 25288 KB Output is correct
2 Incorrect 1047 ms 46668 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 25288 KB Output is correct
2 Correct 1022 ms 38196 KB Output is correct
3 Correct 1020 ms 38660 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 25288 KB Output is correct
2 Correct 1022 ms 38196 KB Output is correct
3 Correct 1020 ms 38660 KB Output is correct
4 Incorrect 36 ms 25288 KB Extra information in the output file
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 25292 KB Output is correct
2 Incorrect 1061 ms 46708 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 25292 KB Output is correct
2 Incorrect 1061 ms 46708 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 25292 KB Output is correct
2 Correct 62 ms 25384 KB Output is correct
3 Correct 63 ms 25308 KB Output is correct
4 Correct 63 ms 25440 KB Output is correct
5 Correct 62 ms 25620 KB Output is correct
6 Correct 84 ms 25368 KB Output is correct
7 Correct 23 ms 25292 KB Output is correct
8 Correct 1061 ms 37744 KB Output is correct
9 Correct 917 ms 37736 KB Output is correct
10 Correct 30 ms 25288 KB Output is correct
11 Incorrect 1039 ms 46588 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 25292 KB Output is correct
2 Correct 62 ms 25384 KB Output is correct
3 Correct 63 ms 25308 KB Output is correct
4 Correct 63 ms 25440 KB Output is correct
5 Correct 62 ms 25620 KB Output is correct
6 Correct 84 ms 25368 KB Output is correct
7 Correct 23 ms 25292 KB Output is correct
8 Correct 1061 ms 37744 KB Output is correct
9 Correct 917 ms 37736 KB Output is correct
10 Correct 30 ms 25288 KB Output is correct
11 Incorrect 1039 ms 46588 KB Output isn't correct
12 Halted 0 ms 0 KB -