mxqz,线段树合并板子RE,60pts
查看原帖
mxqz,线段树合并板子RE,60pts
743127
Wu1hong2shen4楼主2023/8/9 21:02

记录

数组肯定开得尽可能大了,但大部分RE,一些TLE也出现RE信息,求大佬帮助,谢谢!

#include <bits/stdc++.h>
using namespace std;

const int T = 1e6+10;
int n,m;
struct bian {
    int to,next;
}edge[T<<1];
int cn = 0;
int head[T];
void add(int u,int v) {
    cn++;
    edge[cn].to = v;
    edge[cn].next = head[u];
    head[u] = cn;
}

// -Wl,-stack=999999999
int bei[T][20];
int len[T];
void dfs_bei(int hao,int pre) {
	bei[hao][0] = pre;
	len[hao] = len[pre]+1;
	for(int i = 1;i <= 19;i++)
		bei[hao][i] = bei[bei[hao][i-1]][i-1];
	int dian;
	for(int i = head[hao];i;i = edge[i].next) {
		dian = edge[i].to;
		if(dian == pre) continue;
		dfs_bei(dian,hao);
	}
}
int LCA(int a,int b) {
	if(len[a] < len[b]) swap(a,b);// >
	for(int i = 18;i >= 0;i--)
		if(len[bei[a][i]] >= len[b])
			a = bei[a][i];
	if(a == b) return a;
	for(int i = 18;i >= 0;i--)
		if(bei[a][i] != bei[b][i])
			a = bei[a][i],b = bei[b][i];
	return bei[a][0];
}

struct ttt {
	int ls = 0,rs = 0,sum = 0;
}tr[T*100];
int tt[T];int cnt = 0;

void pushup(int p) {
	if(tr[p].ls == 0) {
		tr[p].sum = tr[tr[p].rs].sum;
		tt[p] = tt[tr[p].rs];
		return ;
	}
	if(tr[p].rs == 0) {
		tr[p].sum = tr[tr[p].ls].sum;
		tt[p] = tt[tr[p].ls];
		return ;
	}
	if(tr[tr[p].ls].sum >= tr[tr[p].rs].sum) {
		tr[p].sum = tr[tr[p].ls].sum;
		tt[p] = tt[tr[p].ls];
	}
	else {
		tr[p].sum = tr[tr[p].rs].sum;
		tt[p] = tt[tr[p].rs];
	}
}

int merge(int a,int b,int l,int r) {
	if(a == 0 || b == 0) return a+b;
	if(l == r) {
		tr[a].sum += tr[b].sum;
		return a;
	}
	int mid = l+r>>1;
	tr[a].ls = merge(tr[a].ls,tr[b].ls,l,mid);
	tr[a].rs = merge(tr[a].rs,tr[b].rs,mid+1,r);
	pushup(a);
	return a;
}

void bian(int &p,int l,int r,int yyy,int zz) {
    if(p == 0) p = ++cnt;
    if(l == r) {
        tr[p].sum += zz;
        tt[p] = yyy;
        return ;
    }
    int mid = l+r>>1;
    if(yyy <= mid) bian(tr[p].ls,l,mid,yyy,zz);
    else bian(tr[p].rs,mid+1,r,yyy,zz);
    pushup(p);
}
int root[T];
int ans[T];
void dfs(int hao,int pre) {
	int dian;
	for(int i = head[hao];i;i = edge[i].next){
        dian = edge[i].to;
        if(dian == pre) continue;
        dfs(dian,hao);
        root[hao] = merge(root[hao],root[dian],1,1e5);
    }
    ans[hao] = tt[root[hao]];
    if(tr[root[hao]].sum == 0) ans[hao] = 0;
}

signed main() {
	//freopen("RE.in","r",stdin);
	//freopen("RE.out","w",stdout); 
	scanf("%d%d",&n,&m);
	//cout << n << " " << m << endl; 
	int u,v;
	for(int i = 1;i < n;i++) {
		scanf("%d%d",&u,&v);
		//printf("%d : %d %d\n",i,u,v);
		add(u,v);
		add(v,u);
	}
	dfs_bei(1,0);
	int x,y,z;
	while(m--) {
        scanf("%d%d%d",&x,&y,&z);
        int lll = LCA(x,y);
        bian(root[x],1,1e5,z,1);
        bian(root[y],1,1e5,z,1);
        bian(root[lll],1,1e5,z,-1);
        bian(root[bei[lll][0]],1,1e5,z,-1);
    }
    dfs(1,0);
    for(register int i = 1;i <= n;i++)
		printf("%d\n",ans[i]);
	return 0;
}
2023/8/9 21:02
加载中...