线段树合并板子 TLE90求助
查看原帖
线段树合并板子 TLE90求助
577066
2949767807qwer楼主2023/1/29 22:59

求助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;
}
2023/1/29 22:59
加载中...