제출 #1248160

#제출 시각아이디문제언어결과실행 시간메모리
1248160g4yuhgBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2099 ms241492 KiB
//Huyduocdithitp
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
typedef int ll;
#define pii pair<ll, ll> 
#define fi first
#define se second
#define faster ios_base::sync_with_stdio(false);cin.tie(NULL);
#define N 100005
#define endl '\n'
using namespace std;
using namespace __gnu_pbds;
 
bool ghuy4g;

const ll inf = 1e9;

const ll S = 320;

ll n, m, q, c[N], d[N], dp[N];

vector<ll> adj[N], adj_2[N];

vector<pii> vt[N]; // vt[u][0] la con {len, u} xa nhat 

void pre() {
	for (int u = 1; u <= n; u ++) {
		gp_hash_table<ll, ll> mp;
		for (auto v : adj_2[u]) {
			for (auto it : vt[v]) {
				mp[it.se] = max(mp[it.se], it.fi + 1);
			}
		}
		vt[u].push_back({0, u});
		for (auto it : mp) {
			vt[u].push_back({it.se, it.fi});
		}
		sort(vt[u].begin(), vt[u].end(), greater<pii>());
		if (vt[u].size() > S + 1) {
			vt[u].resize(S + 1);
		}
	}
}

bool is[N];

void solve1(ll u, ll k) {
	for (int i = 1; i <= k; i ++) {
		cin >> d[i];
		is[d[i]] = 1;
	}
	
	ll ans = -1;
	
	for (int i = 0; i < (ll)vt[u].size(); i ++) {
		if (is[vt[u][i].se] == 0) {
			ans = max(ans, vt[u][i].fi);
			// break;
		}
	}
	
	//if (ans == 0) ans --;
	cout << ans << endl;
	
	for (int i = 1; i <= k; i ++) {
		is[d[i]] = 0;
	}
}

void solve2(ll u, ll k) {
	for (int i = 1; i <= k; i ++) {
		cin >> d[i];
		is[d[i]] = 1;
	}
	
	dp[u] = 0;
	for (int i = u - 1; i >= 1; i --) {
		dp[i] = -inf;
		for (auto v : adj[i]) {
			if (v > u) continue;
			dp[i] = max(dp[i], dp[v] + 1);
		}
	}
	
	ll ans = -1;
	
	for (int i = 1; i <= u; i ++) {
		if (is[i]) continue;
		ans = max(ans, dp[i]);
	}
	
	cout << ans << endl;
	
	for (int i = 1; i <= k; i ++) {
		is[d[i]] = 0;
	}
}

void solve() {
	for (int i = 1; i <= q; i ++) {
		ll u, yj;
		cin >> u >> yj;
		if (yj <= S) {
			solve1(u, yj);
		}
		else {
			solve2(u, yj);
		}
	}
}
 
bool klinh;
 
signed main(void) {
	faster;
	
	cin >> n >> m >> q;
	
	for (int i = 1; i <= m; i ++) {
		ll u, v;
		cin >> u >> v;
		adj[u].push_back(v);
		adj_2[v].push_back(u);
	}
	
	pre();
	
	solve();
		
	cerr << fabs(&klinh - &ghuy4g) / 1048576.0;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...