数组肯定开得尽可能大了,但大部分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;
}