Submission #473029

#TimeUsernameProblemLanguageResultExecution timeMemory
473029berarchegasBitaro’s Party (JOI18_bitaro)C++17
0 / 100
9 ms8924 KiB
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define MAXN 100100
#define INF 1e17
#define pb push_back
#define F first
#define S second
 
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int M = 998244353;
const int X = 100;

vector<int> v[MAXN], w[MAXN];
vector<pii> atual, sq[MAXN];
int vis[MAXN], dp[MAXN];
bool inv[MAXN];

void merg(int node) {
	atual = sq[node];
	vector<pii> novo;
	for (int i = 0; i < (int)atual.size(); i++) {
		if (i == (int)atual.size() -1 || atual[i].F != atual[i+1].F) novo.pb(atual[i]);
	}
	atual = novo;
	sort(atual.begin(), atual.end(), [&] (pii x, pii y) { return x.S > y.S; });
	while ((int)atual.size() > X) atual.pop_back();
	sq[node] = atual;
	for (pii &x : atual) x.S++;
	sort(atual.begin(), atual.end());
	for (int x : w[node]) {
		novo = sq[x];
		sq[x].resize((int)sq[x].size() + (int)atual.size());
		merge(novo.begin(), novo.end(), atual.begin(), atual.end(), sq[x].begin());
	}
}

void dfs(int node) {
	vis[node] = 1;
	for (int x : v[node]) {
		if (!vis[x]) dfs(x);
		dp[node] = max(dp[node], 1 + dp[x]);
	}
}

int main() { _
	int n, m, q, a, b;
	cin >> n >> m >> q;
	for (int i = 0; i < m; i++) {
		cin >> a >> b;
		v[b].pb(a);
		w[a].pb(b);
	}
	for (int i = 1; i <= n; i++) sq[i].pb({i, 0});
	for (int i = 1; i <= n; i++) {
		merg(i);
	}
	int d, tot, aux;
	for (int i = 0; i < q; i++) {
		cin >> d >> tot;
		memset(inv, 0, sizeof(inv));
		for (int j = 0; j < tot; j++) {
			cin >> aux;
			inv[aux] = 1;
		}
		if (tot < X) {
			int ans = -1;
			for (pii x : sq[d]) {
				if (!inv[x.F]) ans = max(ans, x.S);
			}
			cout << ans << '\n';
		}
		if (tot >= X) {
			memset(dp, 0, sizeof(dp));
			memset(vis, 0, sizeof(vis));
			dfs(d);
			int ans = -1;
			for (int i = 1; i <= n; i++) {
				if (!inv[i]) ans = max(ans, dp[i]);
			}
			cout << ans << '\n';
		}
	}
    return 0;
}
/* stuff you should look for
	* int overflow, array bounds
	* special cases (lowest n, greatest n)
	* RTE MAXN
	* WRITE/DRAW STUFF DOWN
	* DONT OVERCOMPLICATE
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...