求问动态开点线段树
  • 板块学术版
  • 楼主HJ221
  • 当前回复5
  • 已保存回复5
  • 发布时间2025/7/18 19:54
  • 上次更新2025/7/19 10:24:54
查看原帖
求问动态开点线段树
1096130
HJ221楼主2025/7/18 19:54
#include<bits/stdc++.h>
using namespace std;

struct Tree{
	int tot=0,rt=0;
	struct tp{
		int ls,rs,sum;
	}; 
	vector<tp> t={{0,0,0}};

	void pushup(int o){
		t[o].sum=t[ t[o].ls ].sum+t[ t[o].rs ].sum;
	}
	void ins(int &o,int l,int r,int st,int val){
		if(!o) {
			t.push_back({0,0,0});
			o=++tot;
		}
		if(l==r){
			t[o].sum+=val;
		    cout<<o<<" "<<l<<" "<<r<<" "<<t[o].sum<<"\n";
			return;
		}
		int mid=l+r>>1;
		if(st<=mid) ins(t[o].ls,l,mid,st,val);
		else ins(t[o].rs,mid+1,r,st,val);
		pushup(o);
		cout<<o<<" "<<t[o].ls<<" "<<t[o].rs<<" "<<l<<" "<<r<<" "<<t[o].sum<<"\n";
	}
};

int main(){
	Tree a;
	a.ins(a.rt,1,100000,1,1);
	return 0;
}

按照以上代码运行,会出现部分o所对应的t[o].ls未被赋值。但如果将t.push_back({0,0,0});o=++tot的位置互换,t[o].ls就能被正常赋值。

为什么呀,QAQ

2025/7/18 19:54
加载中...