求助RE
查看原帖
求助RE
701202
high_sky楼主2025/2/8 18:02
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
#include <vector>
#include <cmath>
#define N 40005
#define M 100005
using namespace std;
int seq[N << 1],n,m,cnt,dep[N],fa[N][25],c[N],col[N],b[N],cntp,st[N],ed[N],len,ans[M],now_ans;
bool vis[N];
int mp[N];
vector<int> g[N];
int getid(int x) {
	int l = 1,r = cntp,res = 1;
	while(l <= r) {
		int mid = l + r >> 1;
		if (c[mid] >= x) res = mid,r = mid - 1;
		else l = mid + 1;
	}
	return res;
}
void dfs0(int cur,int father) {
	seq[++cnt] = cur;
	st[cur] = cnt;
	dep[cur] = dep[father] + 1;
	fa[cur][0] = father;
	for (auto i : g[cur])
		if (i != father)
			dfs0(i,cur);
	seq[++cnt] = cur;
	ed[cur] = cnt;
}
struct node{
	int id,l,r,pos,x;
}q[M];
int LCA(int x,int y) {
	if (dep[x] < dep[y]) x ^= y ^= x ^= y;
	for (int j = 20;j >= 0;j --)
		if (dep[fa[x][j]] >= dep[y]) x = fa[x][j];
	if (x == y) return x;
	for (int j = 20;j >= 0;j --)
		if (fa[x][j] != fa[y][j]) x = fa[x][j],y = fa[y][j];
	return fa[x][0];
}
void update(int x) {
	if (vis[x]) {
		vis[x] = 0;
		mp[col[x]] --;
		if (mp[col[x]] == 0) now_ans --;
	}
	else {
		vis[x] = 1;
		mp[col[x]] ++;
		if (mp[col[x]] == 1) now_ans ++;
	}
}
signed main(){
	cin >> n >> m;
	len = ceil(n / sqrt(m));
	for (int i = 1;i <= n;i ++) cin >> col[i],b[i] = col[i];
	stable_sort(b + 1,b + 1 + n);
	for (int i = 1;i <= n;i ++)
		if (b[i] != b[i - 1])
			c[++cntp] = b[i];
	for (int i = 1;i <= n;i ++) col[i] = getid(col[i]);
	for (int i = 1,u,v;i < n;i ++) {
		cin >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs0(1,0);
	for (int j = 1;j <= 20;j ++)
		for (int i = 1;i <= n;i ++)
			fa[i][j] = fa[fa[i][j - 1]][j - 1];
	for (int i = 1;i <= m;i ++) {
		q[i].id = i;
		int u,v;
		cin >> u >> v;
		int lca = LCA(u,v);
//		cout << lca << endl;
		if (u == lca || v == lca) {// line
			if (st[v] < st[u]) u ^= v ^= u ^= v;
			q[i].l = st[u],q[i].r = st[v];
		}
		else {
			if (st[v] < ed[u]) u ^= v ^= u ^= v;
			q[i].l = ed[u],q[i].r = st[v],q[i].x = lca;
		}
		q[i].pos = q[i].l / len;
//		cout << q[i].l << ' ' << q[i].r << ' ' << q[i].x << ' ' << q[i].pos << endl;
	}
	stable_sort(q + 1,q + 1 + m,[](node x,node y) {
		if (x.pos == y.pos) return (x.pos & 1) ? x.r > y.r : x.r < y.r;
		return x.pos < y.pos;
	});
	for (int i = 1,l = 1,r = 0;i <= m;i ++) {
		int ql = q[i].l,qr = q[i].r;
		while (l < ql) update(seq[l ++]);
		while (l > ql) update(seq[++l]);
		while (r < qr) update(seq[++r]);
		while (r > qr) update(seq[r --]);
		if (q[i].x) update(q[i].x);
		ans[q[i].id] = now_ans;
		if (q[i].x) update(q[i].x);
	}
	for (int i = 1;i <= m;i ++) cout << ans[i] << endl;
	return 0;
} 
2025/2/8 18:02
加载中...