P11191 题解
Register_int · · 题解
鲜花:
考虑对于每个
考虑优化求
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 10;
vector<int> g[MAXN], rg[MAXN]; int d[MAXN], B;
int n, m, p, q, a[MAXN]; vector<pair<int, int>> f[MAXN]; bool isp[MAXN];
int tw[MAXN], w[MAXN], rev[MAXN], lst[MAXN], c[MAXN], ans[MAXN];
inline void add(int k, int x) { for (int i = k; i <= p; i += i & -i) c[i] += x; }
inline int ask(int k) { int res = 0; for (int i = k; i; i &= i - 1) res += c[i]; return res; }
int main() {
// freopen("./show/show5.in", "r", stdin);
// freopen("show5.out", "w", stdout);
scanf("%*d%d%d%d%d", &n, &m, &p, &q), B = sqrt(m);
for (int i = 1, u, v; i <= m; i++) {
scanf("%d%d", &u, &v); if (v == 1) isp[u] = 1;
g[u].emplace_back(v), d[u]++;
}
for (int u = 1; u <= n; u++) {
if (d[u] < B) continue;
for (int v : g[u]) rg[v].emplace_back(u);
}
for (int i = 1; i <= p; i++) scanf("%d", &a[i]);
for (int i = 1; i <= p; i++) {
if (isp[a[i]]) w[i] = i;
else if (d[a[i]] >= B) w[i] = tw[a[i]];
else for (int v : g[a[i]]) w[i] = max(w[i], rev[v]);
rev[a[i]] = w[i];
for (int v : rg[a[i]]) tw[v] = max(tw[v], w[i]);
}
for (int i = 1, l, r; i <= q; i++) scanf("%d%d", &l, &r), f[r].emplace_back(l, i);
for (int i = 1, cnt = 0; i <= p; i++) {
if (lst[a[i]]) add(lst[a[i]], -1), cnt--;
if (w[i]) add(w[i], 1), lst[a[i]] = w[i], cnt++;
for (pair<int, int> x : f[i]) ans[x.second] = n - 1 - cnt + ask(x.first - 1);
}
for (int i = 1; i <= q; i++) printf("%d\n", ans[i]);
}