이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define task "Bitaro"
#define rep(i, l, r) for (int i = (l); i <= (r); ++i)
#define Rep(i, r, l) for (int i = (r); i >= (l); --i)
#define pb push_back
#define eb emplace_back
#define F first
#define S second
#define ll long long
using namespace std;
typedef pair < int, int > ii;
const int N = 1e5 + 2, can = 200;
int n, m, q, na, mx[N], dp[N];
ii a[N];
bool busy[N];
vector < int > g[N];
vector < ii > data[N];
bool cmp(ii x, ii y)
{
return x.F > y.F;
}
void pre()
{
rep(i, 1, n)
{
vector < int > tmp;
for (int v : g[i])
{
if (!mx[v])
tmp.eb(v);
mx[v] = max(mx[v], 1);
for (ii it : data[v])
{
if (!mx[it.S])
tmp.eb(it.S);
mx[it.S] = max(mx[it.S], it.F + 1);
}
}
int na = 0;
for (int v : tmp)
a[++na] = {mx[v], v}, mx[v] = 0;
nth_element(a + 1, a + 1 + min(can, na), a + 1 + na, cmp);
rep(j, 0, min(na, can) - 1)
data[i].eb(a[j+1]);
}
}
int solve(int s)
{
int res = -1;
fill(dp+1, dp+1+n, INT_MIN);
dp[s] = 0;
for (int i = s - 1; i >= 1; --i)
for (int j : g[i])
dp[j] = max (dp[j], dp[i] + 1);
for (int i = 1; i <= s; ++i)
res = max (res, dp[i]);
return res;
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(0);
cin >> n >> m >> q;
rep(i, 1, m)
{
int u, v;
cin >> u >> v;
g[v].eb(u);
}
pre();
while (q--)
{
int s, num;
cin >> s >> num;
vector < int > tmp;
rep(i, 0, num - 1)
{
int x;
cin >> x;
busy[x] = 1;
tmp.eb(x);
}
if (num >= can) cout << solve(s) << '\n';
else
{
int res = -1;
for (ii it : data[s])
if (!busy[it.S])
res = max(res, it.F);
if (!busy[s])
res = max (res, 0);
cout << res << '\n';
}
for (auto i : tmp)
busy[i] = 0;
}
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... |