萌新求助树剖,调死力
查看原帖
萌新求助树剖,调死力
307453
云浅知处はなび楼主2020/9/2 21:28
  • 这玩意,打的不熟,回来练板子
  • 没想到,第一遍打就统统炸掉
  • 样例都过不去/kel
  • 估计是DFS1DFS2build中的一个炸了,因为是在输入所有边之后立马 RE 掉。
  • 先给一下各种定义&define&include
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cstdlib>

#define MAXN 100005
#define lson(o) (o<<1)
#define rson(o) (o<<1|1)
#define LL long long

using namespace std;

vector<LL>v[MAXN];
LL d[MAXN],fa[MAXN],sz[MAXN],rk[MAXN],hson[MAXN],dfn[MAXN],top[MAXN],val[MAXN],w[MAXN];
//d:节点深度;fa:父节点;sz:子树大小;rk:dfn序对应的节点编号;hson:重儿子;dfn:重链剖分后的顺序;top:链顶端;
//val:重链剖分之后节点的值;w:初始值
LL n,m,r,p;
  • DFS1代码:
LL DFS1(LL u,LL dep){
	hson[u]=0;
	sz[hson[u]]=0;
	d[u]=dep;
	sz[u]=1;
	for(LL i=0,s=v[u].size();i<s;i++){
		sz[u]+=DFS1(v[u][i],dep+1);
		fa[v[u][i]]=u;
		if(sz[v[u][i]]>sz[hson[u]]){
			hson[u]=v[u][i];
		}
	}
	return sz[u];
}
  • DFS2代码:
LL tot=0;

void DFS2(LL u,LL tp){
	top[u]=tp;
	tot++;
	dfn[u]=tot;
	val[tot]=w[u];
	rk[tot]=u;
	if(hson[u]!=0){
		DFS2(hson[u],tp);
		for(LL i=0,s=v[u].size();i<s;i++){
			if(v[u][i]!=hson[u]){
				DFS2(v[u][i],v[u][i]);
			}
		}
	}
}
  • build代码:
inline void build(LL l,LL r,LL o){
	plz[o]=0;
	d[o]=0;
	if(l==r){
		d[o]=val[l];
		return ;
	}
	LL mid=(l+r)>>1;
	build(l,mid,lson(o));
	build(mid+1,r,rson(o));
	pushup(o);
}
  • 主函数部分代码:
int main(void){

	scanf("%lld%lld%lld%lld",&n,&m,&r,&p);

	for(int i=1;i<=n;i++){
		LL vl;
		scanf("%lld",&vl);
		w[i]=vl;
	}

	for(int i=1;i<n;i++){
		LL p,q;
		scanf("%lld%lld",&p,&q);
		v[p].push_back(q);
		v[q].push_back(p);
	}

	DFS1(r,1);
	DFS2(r,r);
	tree.build(1,n,1);
	while(m--){//后面就是各种操作
  • 这里说一下tree是我封装的线段树结构体,里面有build建树,change区间修改,query区间求和,以及一堆pushup之类的函数。
  • 输样例的时候,是输完所有边之后,也就是输到4 1的时候,出现了一个zsh:segmentation,(一般)也就是 RE。
  • 所以应该是tree.buildDFS1DFS2出了问题?

如果您觉得我太菜了,光凭这些代码根本看不出哪里有错,请移步完整代码

2020/9/2 21:28
加载中...