线段树数组大小要开多少啊?
我感觉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;
}