이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("O3")
#pragma GCC target("sse4,avx2,fma,avx")
#define FOR(i, x, y) for (int i = x; i < y; i++)
using namespace std;
const int L = 200;
vector<int> graph[100001];
vector<pair<int, int>> sqrt_farthest[100001];
int a[100001], dp[100001];
bool bad[100001], in_ret[100001];
inline vector<pair<int, int>> merge(vector<pair<int, int>> X, vector<pair<int, int>> Y) {
vector<pair<int, int>> ret;
int xptr = 0;
for (int yptr = 0; ret.size() <= L && yptr < Y.size() && xptr < X.size(); yptr++) {
while (xptr < X.size() && X[xptr].second >= Y[yptr].second) {
if (!in_ret[X[xptr].first]) ret.push_back({X[xptr].first, X[xptr].second + 1});
in_ret[X[xptr].first] = true;
xptr++;
}
if (!in_ret[Y[yptr].first]) ret.push_back(Y[yptr]);
in_ret[Y[yptr].first] = true;
}
while (xptr < X.size() && ret.size() <= L) {
if (!in_ret[X[xptr].first]) ret.push_back({X[xptr].first, X[xptr].second + 1});
in_ret[X[xptr].first] = true;
xptr++;
}
for (pair<int, int> i : ret) in_ret[i.first] = false;
return ret;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m, k;
cin >> n >> m >> k;
FOR(i, 0, m) {
int u, v;
cin >> u >> v;
graph[u].push_back(v);
}
FOR(i, 1, n + 1) sqrt_farthest[i] = {{i, 0}};
FOR(i, 1, n + 1) for (int j : graph[i]) sqrt_farthest[j] = merge(sqrt_farthest[i], sqrt_farthest[j]);
while (k--) {
int t, y;
cin >> t >> y;
FOR(i, 0, y) {
cin >> a[i];
bad[a[i]] = true;
}
if (y >= L) {
FOR(i, 1, n + 1) dp[i] = (bad[i] ? INT_MIN : 0);
FOR(i, 1, t + 1) for (int j : graph[i]) dp[j] = max(dp[j], dp[i] + 1);
cout << max(-1, dp[t]) << '\n';
} else {
bool can = false;
for (pair<int, int> i : sqrt_farthest[t]) if (!bad[i.first]) {
can = true;
cout << i.second << '\n';
break;
}
if (!can) cout << "-1\n";
}
FOR(i, 0, y) bad[a[i]] = false;
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
bitaro.cpp: In function 'std::vector<std::pair<int, int> > merge(std::vector<std::pair<int, int> >, std::vector<std::pair<int, int> >)':
bitaro.cpp:18:48: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int yptr = 0; ret.size() <= L && yptr < Y.size() && xptr < X.size(); yptr++) {
~~~~~^~~~~~~~~~
bitaro.cpp:18:67: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int yptr = 0; ret.size() <= L && yptr < Y.size() && xptr < X.size(); yptr++) {
~~~~~^~~~~~~~~~
bitaro.cpp:19:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while (xptr < X.size() && X[xptr].second >= Y[yptr].second) {
~~~~~^~~~~~~~~~
bitaro.cpp:27:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while (xptr < X.size() && ret.size() <= L) {
~~~~~^~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |