社区讨论

对 vector 值的影响会导致 RE ?

P6329【模板】点分树 / 震波参与者 4已保存回复 12

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
12 条
当前快照
1 份
快照标识符
@lo9aj5l1
此快照首次捕获于
2023/10/28 08:15
2 年前
此快照最后确认于
2023/10/28 08:15
2 年前
查看原帖
rt.
我的代码中修改树状数组的值这一段,如果是如下:
CPP
inline void Modify(int ori,int u,int w) {
	if(u == 0) return ;
	int to = las[u];
	for(int i = dis(ori,u) + 1;i <= siz[u] + 1;i += lowbit(i)) s[u][i] += w - val[ori];// 这个位置
	for(int i = dis(ori,to) + 1;i <= siz[u] + 1;i += lowbit(i)) fa[u][i] += w - val[ori];
	Modify(ori,to,w);
}	
则可以 AC
若改成如下:
CPP
inline void Modify(int ori,int u,int w) {
	if(u == 0) return ;
	int to = las[u];
	for(int i = dis(ori,u) + 1;i <= siz[u] + 1;i += lowbit(i)) s[u][i] += w - val[u];// 这个位置
	for(int i = dis(ori,to) + 1;i <= siz[u] + 1;i += lowbit(i)) fa[u][i] += w - val[u];
	Modify(ori,to,w);
}	
则会全部 RE
感觉仅仅是对这个值的影响,调试的时候从来没想过这里会有问题
可能解锁了这道题 RE 的新型方法?
整个代码 :
CPP
#include <bits/stdc++.h>




using namespace std;
const int N = 4e5 + 10;
int n,m,Min = 2e9,cnt = 0,Rt,pos;
int first[N],nex[N << 1],v[N << 1],num = 0;
int sav[N],val[N],vis[N],siz[N],dep[N],F[N][20];
int las[N];
int ans = 0;
vector<int> s[N],fa[N];
inline int lowbit(int x) {return x & (-x);}
inline void add(int x,int y) {
	v[++num] = y;
	nex[num] = first[x];
	first[x] = num;
}
inline void predis(int u,int f) {
	dep[u] = dep[f] + 1;
	F[u][0] = f;
	for(int i = 1;i <= 19;i++) {
		F[u][i] = F[F[u][i - 1]][i - 1];
	}
	for(int i = first[u];i != -1;i = nex[i]) {
		int to = v[i];
		if(to != f) {
			predis(to,u);
		} 
	}
}
inline int Lca(int x,int y) {
	if(dep[x] < dep[y]) swap(x,y);
	for(int i = 19;i >= 0;i--) {
		if(dep[F[x][i]] >= dep[y]) x = F[x][i];
	}
	if(x == y) return x;
	for(int i = 19;i >= 0;i--) {
		if(F[x][i] != F[y][i]) x = F[x][i],y = F[y][i];
	}
	return F[x][0];
}
inline int dis(int x,int y) {
	if(1ll * x * y == 0) return 0;
	return dep[x] + dep[y] - 2 * dep[Lca(x,y)];
}
inline void Pre(int u,int f) {
	++cnt;
	for(int i = first[u];i != -1;i = nex[i]) {
		int to = v[i];
		if(!vis[to] && to != f) {
			Pre(to,u);
		}
	}
}
inline void getm(int u,int f) {
	int Max = 0;
	siz[u] = 1;
	for(int i = first[u];i != -1;i = nex[i]) {
		int to = v[i];
		if(to != f && !vis[to]) {
			getm(to,u);
			siz[u] += siz[to];
			Max = max(Max,siz[to]);
		}
	}
	Max = max(Max,cnt - siz[u]);
	if(Max < Min) Min = Max,pos = u;
}
inline void Build(int u,int f) {
	int rt;
	Min = 2e9,cnt = 0;
	Pre(u,0); getm(u,0);
	rt = pos;
	siz[rt] = cnt; vis[rt] = true;
	if(f) las[rt] = f;
	else Rt = rt;
	s[rt].resize(siz[rt] + 2),fa[rt].resize(siz[rt] + 2);
	for(int i = first[rt];i != -1;i = nex[i]) {
		int to = v[i];
		if(!vis[to]) {
			Build(to,rt);
		}
	}
}
inline int Asks(int u,int d) {
	if(d <= 0) return 0;
	int res = 0;
	d = min(d,siz[u] + 1);
	for(int i = d;i >= 1;i -= lowbit(i)) res += s[u][i];
	return res;
}
inline int Askf(int u,int d) {
	if(d <= 0) return 0;
	int res = 0;
	d = min(d,siz[u] + 1);
	for(int i = d;i >= 1;i -= lowbit(i)) res += fa[u][i];
	return res;
}
inline void sol(int ori,int u,int d) {
	if(u == Rt) return ;
	int to = las[u]; int D = dis(ori,to);
	ans += Asks(to,d - D + 1) - Askf(u,d - D + 1); 
	sol(ori,to,d);
}
inline void Modify(int ori,int u,int w) {
	if(u == 0) return ;
	int to = las[u];
	for(int i = dis(ori,u) + 1;i <= siz[u] + 1;i += lowbit(i)) s[u][i] += w - val[ori];
	for(int i = dis(ori,to) + 1;i <= siz[u] + 1;i += lowbit(i)) fa[u][i] += w - val[ori];
	Modify(ori,to,w);
}
int main() {
	memset(first,-1,sizeof first);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i <= n;i++) cin >> sav[i];
	for(int i = 1;i < n;i++) {
		int x,y;
		cin >> x >> y;
		add(x,y);
		add(y,x);
	}
	predis(1,0);
	Build(1,0);
//	for(int i = 1;i <= n;i++) cerr << las[i] << ' ' << i << '\n';
	for(int i = 1;i <= n;i++) Modify(i,i,sav[i]);
	for(int i = 1;i <= n;i++) val[i] = sav[i];
	int lasans = 0;
	for(int i = 1;i <= m;i++) {
		int opt,x,y;
		cin >> opt >> x >> y;
		x = x ^ lasans , y = y ^ lasans;
		if(opt == 0) {
			ans = 0;
			for(int k = min(y + 1,siz[x] + 1);k >= 1;k -= lowbit(k)) ans += s[x][k];
			sol(x,x,y);
			lasans = ans;
			cout << ans << '\n';
		} else {
			Modify(x,x,y);
			val[x] = y;
		}
	}
	return 0;
} 

回复

12 条回复,欢迎继续交流。

正在加载回复...