为什么 P6177 过了而这题过不了呜呜呜。
代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define ll long long
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef vector <int> vi;
typedef pair <int, int> pii;
inline int rd() { int x = 0, f = 1; char c = getchar(); while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar(); while (isdigit(c)) x = (x<<3)+(x<<1)+(c^48), c = getchar(); return x*f; }
inline ll rdll() { ll x = 0, f = 1; char c = getchar(); while (!isdigit(c)) f = c == '-' ? -1 : f, c = getchar(); while (isdigit(c)) x = (x<<3)+(x<<1)+(c^48), c = getchar(); return x*f; }
template <typename T> inline void write(T x) { if (x < 0) x = -x, putchar('-'); if (x > 9) write(x/10); putchar(x%10+48); }
const int N = 4e4+5, B = 1000;
int n, m, tot, idx, top, lst, a[N], b[N], d[N], fa[N], sz[N], id[N], tp[N], up[N], son[N], mxd[N], stk[N];
vi E[N]; bitset <N> bt[45][45];
void dfs1(int u, int f) {
d[u] = mxd[u] = d[f]+1, fa[u] = f, sz[u] = 1;
for (int v:E[u]) if (v != f) {
dfs1(v, u);
sz[u] += sz[v];
if (sz[v] > sz[son[u]]) son[u] = v;
mxd[u] = max(mxd[u], mxd[v]);
}
if (mxd[u]-d[u] >= B) id[u] = ++idx, mxd[u] = d[u];
}
void dfs2(int u, int p) {
tp[u] = p;
if (son[u]) dfs2(son[u], p);
for (int v:E[u]) if (v != son[u] && v != fa[u]) dfs2(v, v);
}
void dfs(int u) {
for (int v:E[u]) if (v != fa[u]) {
if (id[v]) {
for (int x = v; x != stk[top]; x = fa[x]) bt[id[stk[top]]][id[v]].set(a[x]);
for (int i = 1; i < top; ++i) bt[id[stk[i]]][id[v]] = bt[id[stk[i]]][id[stk[top]]]|bt[id[stk[top]]][id[v]];
up[v] = stk[top], stk[++top] = v;
}
dfs(v);
if (id[v]) --top;
}
}
int lca(int u, int v) {
while (tp[u] != tp[v]) {
if (d[tp[u]] < d[tp[v]]) swap(u, v);
u = fa[tp[u]];
}
return d[u] < d[v] ? u : v;
}
int ask(int u, int v) {
bitset <N> ans;
int l = lca(u, v);
while (u != l && !id[u]) ans.set(a[u]), u = fa[u];
while (v != l && !id[v]) ans.set(a[v]), v = fa[v];
if (u != l) {
int pre = u;
while (d[up[u]] >= d[l]) u = up[u];
if (u != pre) ans |= bt[id[u]][id[pre]];
while (u != l) ans.set(a[u]), u = fa[u];
}
if (v != l) {
int pre = v;
while (d[up[v]] >= d[l]) v = up[v];
if (v != pre) ans |= bt[id[v]][id[pre]];
while (v != l) ans.set(a[v]), v = fa[v];
}
ans.set(a[l]);
return ans.count();
}
int main() {
n = rd(), m = rd();
for (int i = 1; i <= n; ++i) a[i] = b[i] = rd();
for (int i = 1; i < n; ++i) {
int x = rd(), y = rd();
E[x].pb(y), E[y].pb(x);
}
sort(b+1, b+n+1); tot = unique(b+1, b+n+1)-b-1;
for (int i = 1; i <= n; ++i) a[i] = lower_bound(b+1, b+tot+1, a[i])-b;
dfs1(1, 0), dfs2(1, 1);
if (!id[1]) id[1] = ++idx;
stk[top = 1] = 1; dfs(1);
while (m--) {
int u = rd()^lst, v = rd();
write(lst = ask(u, v)), enter;
}
return 0;
}
悬关(小号)