社区讨论
对 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感觉仅仅是对这个值的影响,调试的时候从来没想过这里会有问题
可能解锁了这道题 RE 的新型方法?
整个代码 :
#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 条回复,欢迎继续交流。
正在加载回复...