WA on #52 是什么意思?
查看原帖
WA on #52 是什么意思?
482610
Mortidesperatslav楼主2024/10/23 07:41

可能是 intlong long 的问题?

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, q;
int fa[400005], dep[400005], dfn[400005], rdfn[400005], siz[400005], tot;
long long a[400005], tr[2000005], tg[2000005];
vector<int> G[400005];
void dfs(int u, int fa){
	dep[u] = dep[fa] + 1;
	++tot;
	dfn[u] = tot;
	rdfn[tot] = u;
	siz[u] = 1;
	for (auto v : G[u]){
		if (v != fa){
			dfs(v, u);
			siz[u] += siz[v];
		}
	}
}
void pup(int u){
	tr[u] = tr[u << 1] | tr[u << 1 | 1];
}
void build(int u, int l, int r){
	if (l == r){
		tr[u] = a[rdfn[l]];
		return;
	}
	int mid = (l + r) >> 1;
	build(u << 1, l, mid);
	build(u << 1 | 1, mid + 1, r);
	pup(u);
}
void pdn(int u){
	if (!tg[u])
		return;
	tr[u << 1] = tg[u];
	tr[u << 1 | 1] = tg[u];
	tg[u << 1] = tg[u];
	tg[u << 1 | 1] = tg[u];
	tg[u] = 0;
}
void upd(int u, int l, int r, int L, int R, int x){
	if (r < L || l > R)
		return;
	if (L <= l && r <= R){
		tg[u] = x;
		tr[u] = x;
		return;
	}
	pdn(u);
	int mid = (l + r) >> 1;
	upd(u << 1, l, mid, L, R, x);
	upd(u << 1 | 1, mid + 1, r, L, R, x);
	pup(u); 
}
long long qry(int u, int l, int r, int L, int R){
	if (r < L || l > R)
		return 0;
	pdn(u);
	if (L <= l && r <= R)
		return tr[u];
	int mid = (l + r) >> 1;
	return qry(u << 1, l, mid, L, R) | qry(u << 1 | 1, mid + 1, r, L, R);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n >> q;
	for (int i = 1; i <= n; i++){
		cin >> a[i];
		a[i] = 1ll << a[i] - 1;
	}
	for (int i = 1; i < n; i++){
		int u, v;
		cin >> u >> v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs(1, 0);
	build(1, 1, n);
//	for (int i = 1; i <= n; i++)
//		cout << i << " " << dfn[i] << " " << siz[i] << "\n"; 
	while (q--){
	//	for (int i = 1; i <= n; i++)
//			cout << qry(1, 1, n, i, i) << " ";
	//	cout << "\n";
		int op, u;
		cin >> op >> u;
		if (op == 1){
			int v;
			cin >> v;
			upd(1, 1, n, dfn[u], dfn[u] + siz[u] - 1, 1ll << v - 1);
		}else
			cout << __builtin_popcountll(qry(1, 1, n, dfn[u], dfn[u] + siz[u] - 1)) << "\n";
	}
	return 0;
}
2024/10/23 07:41
加载中...