社区讨论

昨天一直在judgeing的我又来了

SP375QTREE - Query on a tree参与者 6已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mi6y15yg
此快照首次捕获于
2025/11/20 12:40
4 个月前
此快照最后确认于
2025/11/20 12:40
4 个月前
查看原帖
这回变成TLE了
哪位dalao能帮我看一下这题的树剖QwQ
CPP
#include<stdio.h>
int T,N,Fa[10005],Size[10005],Top[10005],bq[10005],Son[10005],id[10005],nbq[10005],Head[10005],Deep[10005],cnt=1,F[40005],ans;
char ch[10];
int maxx(int a,int b)
{
    if(a>b)
    return a;
    return b;
}
struct lx
{
    int b,c,next;
}Lx[20005];
void add(int u,int v,int w)
{
    Lx[++cnt].b=v;
    Lx[cnt].c=w;
    Lx[cnt].next=Head[u];
    Head[u]=cnt;
}
void dfs1(int fa,int now,int len)
{
    Deep[now]=cnt;
    int maxn=0;
    Fa[now]=fa;
    Size[now]=1;
    bq[now]=len;
    for(int i=Head[now],zj;i;i=Lx[i].next)
    {
        zj=Lx[i].b;
        if(zj==Fa[now]) continue;
        cnt++;
        dfs1(now,zj,Lx[i].c);
        cnt--;
        Size[now]+=Size[zj];
        if(Size[zj]>maxn)
        {
            Son[now]=zj;
            maxn=Size[zj];
        }
    }
}
void dfs2(int top,int now)
{
    id[now]=++cnt;
    nbq[cnt]=bq[now];
    Top[now]=top;
    if(Son[now])
    dfs2(top,Son[now]);
    for(int i=Head[now],zj;i;i=Lx[i].next)
    {
        zj=Lx[i].b;
        if(zj==Fa[now]||zj==Son[now]) continue;
        dfs2(zj,zj);
    }
}
void bu(int O,int l,int r)
{
    if(l==r)
    {
        F[O]=nbq[l];
        return ;
    }
    int mid=(l+r)/2;
    bu(O*2,l,mid);
    bu(O*2+1,mid+1,r);
    F[O]=maxx(F[O*2],F[O*2+1]);
}
void up(int O,int l,int r,int id,int k)
{
    if(l==id&&r==id)
    {
        F[O]=k;
        return ;
    }
    int mid=(l+r)/2;
    if(id<=mid)
    up(O*2,l,mid,id,k);
    else
    up(O*2+1,mid+1,r,id,k);
    F[O]=maxx(F[O*2],F[O*2+1]);
}
int qu(int O,int l,int r,int s,int t)
{
    if(l==s&&r==t)
    return F[O];
    int mid=(l+r)/2;
    if(t<=mid)
    return qu(O*2,l,mid,s,t);
    else if(s>mid)
    return qu(O*2+1,mid+1,r,s,t);
    else
    return maxx(qu(O*2,l,mid,s,mid),qu(O*2+1,mid+1,r,mid+1,t));
}
int LCA(int a,int b)
{
    int maxn=0;
    while(Top[a]!=Top[b])
    {
        if(Deep[Top[a]]>Deep[Top[b]])
        {
            maxn=maxx(maxn,qu(1,1,N,id[Top[a]],id[a]));
            a=Fa[Top[a]];
        }
        else
        {
            maxn=maxx(maxn,qu(1,1,N,id[Top[b]],id[b]));
            b=Fa[Top[b]];
        }
    }
    if(Deep[a]>Deep[b])
    maxn=maxx(maxn,qu(1,1,N,id[Son[b]],id[a]));
    else
    maxn=maxx(maxn,qu(1,1,N,id[Son[a]],id[b]));
    return maxn;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        for(int i=1;i<=10000;i++)
        Deep[i]=Son[i]=Fa[i]=Size[i]=Top[i]=bq[i]=id[i]=nbq[i]=Head[i]=0;
        for(int i=1;i<=20000;i++)
        Lx[i].b=Lx[i].c=Lx[i].next=0;
        for(int i=1;i<=40000;i++)
        F[i]=0;
        cnt=0;
        scanf("%d",&N);
        for(int i=1,a,b,c;i<=N-1;i++)
        {
            scanf("%d %d %d",&a,&b,&c);
            add(a,b,c);
            add(b,a,c);
        }
        dfs1(1,1,0);
        cnt=0;
        dfs2(1,1);
        bu(1,1,N);
        while(scanf("%s",ch)&&ch[0]!='D')
        {
            if(ch[0]=='C')
            {
                int ti,ith,zj1,zj2;
                scanf("%d %d",&ith,&ti);
                zj1=Lx[ith*2-1].b;
                zj2=Lx[ith*2].b;
                if(Fa[zj1]==zj2)
                up(1,1,N,id[zj1],ti);
                else
                up(1,1,N,id[zj2],ti);
            }
            if(ch[0]=='Q')
            {
                int a,b;
                scanf("%d %d",&a,&b);
                ans=LCA(a,b);
                printf("%d\n",ans);
            }
        }
    }
    return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...