数组大小
查看原帖
数组大小
225484
Kent999楼主2024/1/15 21:42

线段树数组大小要开多少啊?

我感觉4e6就够了,但是RE75pts

然后改到8e6就过了

#include<bits/stdc++.h>
using namespace std;
#define mid (l+r>>1)
#define lson tr[rt].ls
#define rson tr[rt].rs
#define ls1 tr[rt1].ls
#define ls2 tr[rt2].ls
#define rs1 tr[rt1].rs
#define rs2 tr[rt2].rs
int n,m;
struct edge{
	int v,nx;
}e[200005];
int cnt,hd[100005];
void add(int u,int v){
	e[++cnt]=edge{v,hd[u]};
	hd[u]=cnt;
}
namespace LCA{
	int dp[100005],fa[100005][25];
	void dfs(int u,int f){
		fa[u][0]=f;dp[u]=dp[f]+1;
		for(int i=1;i<=20;i++)fa[u][i]=fa[fa[u][i-1]][i-1];
		for(int i=hd[u];i;i=e[i].nx){
			int v=e[i].v;if(v==f)continue;
			dfs(v,u);
		}
	}
	int lca(int x,int y){
		if(dp[x]<dp[y])swap(x,y);
		for(int i=20;i>=0;i--)
			if(dp[fa[x][i]]>=dp[y])
				x=fa[x][i];
		if(x==y)return x;
		for(int i=20;i>=0;i--)
			if(fa[x][i]!=fa[y][i])
				x=fa[x][i],y=fa[y][i];
		return fa[x][0];
	}
}
struct tree{
	int ls,rs,id,cnt;
	tree(int _ls=0,int _rs=0,int _id=0,int _cnt=0):ls(_ls),rs(_rs),id(_id),cnt(_cnt){}
}tr[8000005];//tr[4000005];
int tot;
void push_up(int rt){
	if(tr[lson].cnt>=tr[rson].cnt)tr[rt].id=tr[lson].id,tr[rt].cnt=tr[lson].cnt;
	else tr[rt].id=tr[rson].id,tr[rt].cnt=tr[rson].cnt;
}
void update(int rt,int l,int r,int q,int k){
	if(l==q && q==r){
		tr[rt].id=l;
		tr[rt].cnt+=k;
		return ;
	}
	if(q<=mid){
		if(!lson)lson=++tot;
		update(lson,l,mid,q,k);
	}else{
		if(!rson)rson=++tot;
		update(rson,mid+1,r,q,k);
	}
	push_up(rt);
}
void merge(int rt1,int rt2,int l,int r){
	if(l==r){
		tr[rt1].cnt+=tr[rt2].cnt;
		return ;
	}
	if(!ls1){
		if(ls2)
			ls1=ls2;
	}else{
		if(ls2)
			merge(ls1,ls2,l,mid);
	}
	if(!rs1){
		if(rs2)
			rs1=rs2;
	}else{
		if(rs2)
			merge(rs1,rs2,mid+1,r);
	}
	push_up(rt1);
}
void dfs(int u,int fa){
	for(int i=hd[u];i;i=e[i].nx){
		int v=e[i].v;if(v==fa)continue;
		dfs(v,u);
		merge(u,v,1,100000);
	}
}
int main(){
	scanf("%d%d",&n,&m);
	tot=n;
	for(int i=1;i<n;i++){
		int u,v;scanf("%d%d",&u,&v);
		add(u,v);add(v,u);
	} 
	LCA::dfs(1,0);
	for(int i=1;i<=m;i++){
		int x,y,z;scanf("%d%d%d",&x,&y,&z);
		int Lca=LCA::lca(x,y);
//		cout<<Lca<<endl;
		update(x,1,100000,z,1);
		update(y,1,100000,z,1);
		update(Lca,1,100000,z,-1);
		update(LCA::fa[Lca][0],1,100000,z,-1);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++)
		if(tr[i].cnt!=0)printf("%d\n",tr[i].id);
		else printf("0\n");
	return 0;
}  
2024/1/15 21:42
加载中...