이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using PII = pair<int,int>;
#define all(a) begin(a), end(a)
#define f first
#define s second
constexpr int blockLen = 350;
constexpr int maxN = 1e5;
set<PII> blocks[maxN + 1];
vector<int> canals[maxN + 1];
bitset<maxN + 1> busy;
int main() {
cin.tie(0) -> sync_with_stdio(0);
int n,m,q; cin >> n >> m >> q;
while (m--) {
int start, end; cin >> start >> end;
canals[end].push_back(start);
}
for (int i = 1; i <= n; i++) {
vector<int> dist(n + 1);
blocks[i].insert({0, i});
for (int e: canals[i]) {
for (PII p: blocks[e]) {
if (p.f > dist[p.s]) {
continue;
}
if (dist[p.s] < 0) {
blocks[i].erase({dist[p.s], p.s});
}
blocks[i].insert({p.f - 1, p.s});
dist[p.s] = p.f - 1;
if (blocks[i].size() > blockLen) {
auto it = prev(end(blocks[i]));
dist[it -> s] = 0;
blocks[i].erase(it);
}
}
}
}
while (q--) {
int t,y; cin >> t >> y;
busy.reset();
for (int i = 0; i < y; i++) {
int a; cin >> a;
busy[a] = 1;
}
if (y >= blockLen) {
vector<int> dp(t+1, -1);
for (int i = 1; i <= t; i++) {
if (!busy[i]) dp[i] = max(dp[i], 0);
for (int e: canals[i]) {
if (dp[e] != -1) {
dp[i] = max(dp[i], dp[e] + 1);
}
}
}
cout << dp[t] << '\n';
}
else {
bool found = false;
for (PII p: blocks[t]) {
if (!busy[p.s]) {
found = true;
cout << (-1 * p.f) << '\n';
break;
}
}
if (!found) cout << "-1\n";
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |