求助TLE 90分提交记录。
求问各位大佬,这是常数问题还是写的假了。
#include<iostream>
#define mid ((l+r)>>1)
using namespace std;
const int N=800020;
const int M=10000020;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
inline void write(int x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void write(int x,char s)
{
write(x);
putchar(s);
}
struct ed
{
int next,to;
}edge[N];
int head[N],cnt;
inline void Add(int u,int v)
{
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
inline void add(int u,int v)
{
Add(u,v);
Add(v,u);
}
int dep[N],son[N],fa[N],sz[N],top[N];
void dfs1(int u,int fat)
{
fa[u]=fat;
sz[u]=1;
dep[u]=dep[fat]+1;
int maxn=-1;
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fat) continue;
dfs1(v,u);
sz[u]+=v;
if(sz[v]>maxn) maxn=sz[v],son[u]=v;
}
}
void dfs2(int u,int tp)
{
top[u]=tp;
if(!son[u]) return;
dfs2(son[u],tp);
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
inline int LCA(int u,int v)
{
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v]?u:v;
}
int idcnt,maxr,L[M],R[M],sum[M],pos[M],root[N],ans[N];
inline void pushup(int i)
{
if(sum[L[i]]>=sum[R[i]]) sum[i]=sum[L[i]],pos[i]=pos[L[i]];
else sum[i]=sum[R[i]],pos[i]=pos[R[i]];
}
int merge(int u,int v,int l,int r)
{
if(u*v==0) return u+v;
if(l==r) {sum[u]+=sum[v];pos[u]=l;return u;}
L[u]=merge(L[u],L[v],l,mid);
R[u]=merge(R[u],R[v],mid+1,r);
pushup(u);return u;
}
int add(int i,int l,int r,int x,int k)
{
if(!i) i=++idcnt;
if(l==r) {sum[i]+=k;pos[i]=l;return i;}
if(x<=mid) L[i]=add(L[i],l,mid,x,k);
else R[i]=add(R[i],mid+1,r,x,k);
pushup(i);
return i;
}
void dfs(int u,int fa)
{
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa) continue;
dfs(v,u);
root[u]=merge(root[u],root[v],1,maxr);
}
if(sum[root[u]]) ans[u]=pos[root[u]];
}
int uu[N],vv[N],zz[N];
signed main()
{
int n=read(),m=read();
for(int i=1;i<n;i++)
{
int u=read(),v=read();
add(u,v);
}
for(int i=1;i<=m;i++) uu[i]=read(),vv[i]=read(),zz[i]=read(),maxr=max(maxr,zz[i]);
dfs1(1,0);
dfs2(1,1);
for(int i=1;i<=m;i++)
{
int u=uu[i],v=vv[i],z=zz[i];
int lca=LCA(u,v);
root[u]=add(root[u],1,maxr,z,1);
root[v]=add(root[v],1,maxr,z,1);
root[lca]=add(root[lca],1,maxr,z,-1);
root[fa[lca]]=add(root[fa[lca]],1,maxr,z,-1);
}
dfs(1,0);
for(int i=1;i<=n;i++) write(ans[i],'\n');
return 0;
}