80pts 求调
查看原帖
80pts 求调
637796
Xy_top楼主2024/10/16 19:49
#include <bits/stdc++.h>
#define int long long
#define For(i, a, b) for (int i = (a); i <= (b); i ++)
#define foR(i, a, b) for (int i = (a); i >= (b); i --)
using namespace std;
int n, m, k, q;
int b[400005], c[400005], d[400005];
int ans[400005], lst[400005], pre[400005];
vector <int> G[400005], u[400005];
struct Query {int l, r, id;}a[400005];
bool cmp (Query q1, Query q2) {return q1.r < q2.r;}
void add (int x, int y) {if (x) for (; x <= k; x += x & -x) c[x] += y;}
int query (int x) {
	int ans = 0;
	for (; x; x -= x & -x) ans += c[x];
	return ans;
}
void solve () {
	cin >> n >> n >> m >> k >> q;
	For (i, 1, m) {
		int u, v;
		cin >> u >> v;
		G[u].push_back (v);
		++ d[u];
	}
	For (i, 1, n) {
		if (d[i] < 500) continue;
		for (int j : G[i]) u[j].push_back (i);
	}
	For (i, 1, k) cin >> b[i];
	For (i, 1, q) {
		int l, r;
		cin >> l >> r;
		a[i] = {l, r, i};
	}
	sort (a + 1, a + q + 1, cmp);
	int tail = 1;
	For (i, 1, k) {
		lst[1] = i;
		add (lst[b[i] ], -1);
		if (d[b[i] ] < 500) for (int v : G[b[i] ]) lst[b[i] ] = max (lst[b[i] ], lst[v]);
		else lst[b[i] ] = max (lst[b[i] ], pre[b[i] ]);
		add (lst[b[i] ], 1);
		for (int v : u[b[i] ]) pre[v] = max (pre[v], lst[b[i]]);
		while (tail <= q && a[tail].r == i) {
			ans[a[tail].id] = query (k) - query (a[tail].l - 1);
			tail ++;
		}
	}
	For (i, 1, q) cout << n - 1 - ans[i] << '\n';
}
signed main () {
	int _ = 1;
//	cin >> _;
	while (_ --) {
		solve ();
		cout << '\n';
	}
	return 0;
}
2024/10/16 19:49
加载中...