# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1153166 | tvgk | Bitaro’s Party (JOI18_bitaro) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<int, int>
const long mxN = 1e5 + 7, nB = 316;
int dp[mxN], n, m, q;
bool dd[mxN];
vector<int> w[mxN];
vector<ii> ans[mxN];
int Topo(int j)
{
for (int i = 1; i <= j; i++)
dp[i] = -1;
for (int i = 1; i <= j; i++)
{
if (dd[i])
continue;
dp[i] = max(0, dp[i]);
for (int u : w[i])
dp[u] = max(dp[u], dp[i] + 1);
}
return dp[j];
}
void Merge(vector<ii>& u, vector<ii>& v)
{
vector<ii> tmp;
vector<int> mem;
merge(u.begin(), u.end(), v.begin(), v.end(), back_inserter(tmp));
v.clear();
for (ii i : tmp)
{
if (v.size() > nB)
break;
if (dd[i.se])
continue;
dd[i.se] = 1;
mem.push_back(i.se);
v.push_back(i);
}
for (int i : mem)
dd[i] = 0;
return res;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen(task".INP", "r", stdin);
//freopen(task".OUT", "w", stdout);
cin >> n >> m >> q;
for (int i = 1; i <= m; i++)
{
int u, v;
cin >> u >> v;
w[u].push_back(v);
}
for (int i = 1; i <= n; i++)
{
for (ii& j : ans[i])
j.fi--;
ans[i].push_back({0, i});
for (int j : w[i])
Merge(ans[i], ans[j]);
}
for (int i = 1; i <= q; i++)
{
int vt, num;
cin >> vt >> num;
vector<int> mem(num);
for (int& j : mem)
{
cin >> j;
dd[j] = 1;
}
int res = -1;
if (num < nB)
{
for (ii j : ans[vt])
{
if (!dd[j.se])
{
res = -j.fi;
break;
}
}
}
else
res = Topo(vt);
cout << res << '\n';
for (int j : mem)
dd[j] = 0;
}
}