点分树板子RE求助,应该是下标越界
查看原帖
点分树板子RE求助,应该是下标越界
542128
liyixin0514楼主2024/10/17 22:17

RT.提交记录https://www.luogu.com.cn/record/182811365

应该是下标越界,但是蒟蒻看不出来是哪里越界了,求助,万分感谢orzorz

#include<bits/stdc++.h>
// #define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
const int N=1e5+7,inf=0x3f3f3f3f;
int n,m,u,v,w,k,op;
int ans;
struct edge {
	int to,ne;
}e[N<<1];
int head[N],cnt;
int val[N];
void addedge(int u,int v) { e[++cnt]={v,head[u]}; head[u]=cnt; }
int st[N][20],dfn[N];
int gfa[N];
int sz[N],dep[N];
void dfs(int u,int f) {
	dep[u]=dep[f]+1;dfn[u]=++dfn[0];st[dfn[0]][0]=f;
	for(int i=head[u];i;i=e[i].ne) {
		int v=e[i].to;
		if(v==f) continue;
		dfs(v,u);
	}
}
int lcamin(int x,int y) { return dfn[x]<dfn[y]?x:y; }
void initlca() {
	int lg=__lg(n);
	rep(k,1,lg) for(int i=1;i+(1<<k)-1<=n;i++) st[i][k]=lcamin(st[i][k-1],st[i+(1<<(k-1))][k-1]);
}
int getlca(int u,int v) {
	if(u==v) return u;
	int mnx=min(dfn[u],dfn[v])+1,mxx=max(dfn[u],dfn[v]);
	int lg=__lg(mxx-mnx+1);
	return lcamin(st[mnx][lg],st[mxx-(1<<lg)+1][lg]);
}
int rt,mnrt;
void _max(int &a,int b) { a=max(a,b); }
void _min(int &a,int b) { a=min(a,b); }
bool del[N];
int getdis(int u,int v) {
	int lca=getlca(u,v);
	return dep[u]+dep[v]-2*dep[lca];
}
int sum;
void getroot(int u,int f) {
	// pf("getroot %d %d %d\n",szx,u,f);
	sz[u]=1;
	int mx=0;
	for(int i=head[u];i;i=e[i].ne) {
		int v=e[i].to;
		if(v==f||del[v]) continue;
		getroot(v,u);
		sz[u]+=sz[v];
		_max(mx,sz[v]);
	}
	_max(mx,sum-sz[u]);
	if(mx<mnrt) rt=u,mnrt=mx;
}
vector<int> tr[2][N];
void buildshu(int u) {
	// pf("buildshu %d\n",u);
	del[u]=1;
	sz[u]=sum+1;
	tr[0][u].resize(sz[u]);
	tr[1][u].resize(sz[u]);
	for(int i=head[u];i;i=e[i].ne) {
		int v=e[i].to;
		if(del[v]) continue;
		sum=sz[v];
		rt=0; mnrt=inf;
		getroot(v,0);
		gfa[rt]=u;
		buildshu(rt);
	}
}
void add(vector<int> &tr,int x,int val) {
	// pf("add %d\n",x);
	int n=tr.size();
	x++;
	for(;x<=n;x+=x&-x) tr[x-1]+=val;
	// pf("exit add\n");
}
int ask(vector<int> &tr,int x) {
	int s=0;
	x++;
	_min(x,tr.size());
	for(;x;x-=x&-x) s+=tr[x-1];
	return s;
}
void modify(int x,int val) {
	// pf("modify %d\n",u);
	for(int u=x;u;u=gfa[u]) add(tr[0][u],getdis(x,u),val);
	for(int u=x;gfa[u];u=gfa[u]) add(tr[1][u],getdis(x,gfa[u]),w);
}
int query(int x,int k) {
	int s=0;
	s+=ask(tr[0][x],k);
	for(int u=x;gfa[u];u=gfa[u]) {
		int d=getdis(x,gfa[u]);
		if(k>=d) s+=ask(tr[0][gfa[u]],k-d)-ask(tr[1][u],k-d);
	}
	return s;
}
int main() {
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    // freopen("my.out","w",stdout);
    #endif
	sf("%d%d",&n,&m);
	rep(i,1,n) sf("%d",&val[i]);
	rep(i,1,n-1) sf("%d%d",&u,&v), addedge(u,v),addedge(v,u);
	dfs(1,0);
	initlca();
	sum=n;
	mnrt=inf;
	getroot(1,0);
	buildshu(rt);
	// rep(i,1,n) pf("%d ",gfa[i]); pf("\n");
	rep(i,1,n) modify(i,val[i]);
	// rep(i,1,n) { for(int x:tr[i]) pf("%d ",x); pf("\n"); }
	rep(i,1,m) {
		sf("%d%d%d",&op,&u,&k);
		u^=ans,k^=ans;
		if(op==0) {
			ans=query(u,k);
			pf("%d\n",ans);
		}else{
			modify(u,k-val[u]); val[u]=k;
		}
	}
}
2024/10/17 22:17
加载中...