이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using i64 = long long;
constexpr int maxN = 1E5 + 5;
std::vector<int> prev[maxN], val(maxN, -1), vis(maxN, -1);
std::vector<std::pair<int, int>> save[maxN];
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, m, q;
std::cin >> n >> m >> q;
for(int i = 0; i < m; i++) {
int u, v;
std::cin >> u >> v;
prev[--v].emplace_back(--u);
}
constexpr int S = 350;
for(int i = 0; i < n; i++) {
std::vector<int> all{i};
val[i] = 0;
for(int u : prev[i]) {
for(auto [d, v] : save[u]) {
if(vis[v] != i) {
all.emplace_back(v);
val[v] = d + 1;
} else {
val[v] = std::max(val[v], d + 1);
}
}
}
std::sort(all.begin(), all.end(), [&](int lhs, int rhs) -> bool {
return val[lhs] > val[rhs];
});
for(int j = 0; j < std::min(int(all.size()), S); j++) {
save[i].emplace_back(val[all[j]], all[j]);
}
}
for(int _ = 0; _ < q; _++) {
int t, y;
std::cin >> t >> y;
std::set<int> ban;
for(int i = 0, x; i < y; i++) {
std::cin >> x;
ban.emplace(x - 1);
}
if(y >= S) {
std::vector<int> dp(t, -1);
dp[t - 1] = 0;
for(int i = t - 1; i >= 0; i--) {
if(dp[i] == -1) {
continue;
}
for(int u : prev[i]) {
dp[u] = std::max(dp[u], dp[i] + 1);
}
}
int ans = -1;
for(int i = 0; i < t; i++) {
if(!ban.count(i)) {
ans = std::max(ans, dp[i]);
}
}
std::cout << ans << "\n";
} else {
int ans = -1;
for(auto [d, v] : save[t - 1]) {
if(!ban.count(v)) {
ans = d;
break;
}
}
std::cout << ans << "\n";
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |