80pts求调悬关
查看原帖
80pts求调悬关
637796
Xy_top楼主2024/10/16 20:21

tlq 里的 hack 都过了,看了 1h 还是看不出哪里有问题,请大佬们帮忙。

#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, cnt;
int b[400005], c[400005], d[400005];
int ans[400005], lst[400005], pre[400005];
vector <int> G[400005], u[400005];
vector <pair <int, int> > a[400005];
void add (int x, int y) {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[r].push_back (make_pair (l, i) );
	}
	int tail = 0;
	For (i, 1, k) {
		lst[1] = i;
		if (lst[b[i] ]) add (lst[b[i] ], -1), -- cnt;
		if (d[b[i] ] < 500) for (int v : G[b[i] ]) pre[b[i] ] = max (pre[b[i] ], lst[v]);
		lst[b[i] ] = max (max (pre[b[i] ], lst[b[i] ]), pre[b[i] ]);
		if (lst[b[i] ]) add (lst[b[i] ], 1), ++ cnt;
		for (int v : u[b[i] ]) pre[v] = max (pre[v], lst[b[i]]);
		for (auto j : a[i]) ans[j.second] = n - 1 - cnt + query (j.first - 1);
	}
	For (i, 1, q) cout << ans[i] << '\n';
}
signed main () {
	int _ = 1;
//	cin >> _;
	while (_ --) {
		solve ();
		cout << '\n';
	}
	return 0;
}
2024/10/16 20:21
加载中...