代码,但是样例都过不去
查看原帖
代码,但是样例都过不去
437398
EastIsRed楼主2023/6/23 12:36
#include<stdio.h>

int n,q;

//edge part
int head[200086],to[200086],nxt[200086],edge_tot;
void add_edge(int a,int b)
{
    to[++edge_tot]=b;
    nxt[edge_tot]=head[a];
    head[a]=edge_tot;
}

//TCP part
int tree_root;
int hson[200086],dep[200086],siz[200086],fa[200086];
void dfs1(int now,int f)
{
    siz[now]=1;
    dep[now]=dep[f]+1;
    for(int i=head[now];i;i=nxt[i])
        if(to[i]!=f)
        {
            dfs1(to[i],now);
            siz[now]+=siz[to[i]];
            if(siz[hson[now]]<siz[to[i]])
                hson[now]=to[i];
        }
}
int dfn[200086],rfn[200086],top[200086],tree_tot;
void dfs2(int now,int f)
{
    if(hson[now])
    {
        dfn[hson[now]]=++tree_tot;
        rfn[tree_tot]=hson[now];
        top[hson[now]]=top[now];
        dfs2(hson[now],now);
    }
    for(int i=head[now];i;i=nxt[i])
        if(!top[to[i]])
        {
            dfn[to[i]]=++tree_tot;
            rfn[tree_tot]=to[i];
            top[to[i]]=to[i];
            dfs2(to[i],now);
        }
}
inline void tcp_init()
{
    dfs1(tree_root,0);
    dfn[tree_root]=tree_tot=1;
    rfn[tree_tot]=tree_root;
    top[tree_root]=tree_root;
    dfs2(tree_root,0);
}
inline int lca(int a,int b)
{
    while(top[a]!=top[b])
    {
        if(dep[top[a]]<dep[top[b]])
            a^=b,b^=a,a^=b;
        a=fa[top[a]];
    }
    return dep[a]<dep[b]?a:b;
}

//prizident-tree part
struct node{
    int l,r,val;
}tr[27000086];
int root[200086],pt_tot;
void build(int &now,int l,int r)
{
    if(!now)
        now=++pt_tot;
    if(l!=r)
    {
        int mid=l+r>>1;
        build(tr[now].l,l,mid);
        build(tr[now].r,mid+1,r);
    }
}
void insert(int &now,int pnow,int l,int r,int pos)
{
    if(!now)
        now=++pt_tot;
    tr[now].val=tr[pnow].val+1;
    if(l>=r)
        return;
    int mid=l+r>>1;
    if(pos<=mid)
    {
        tr[now].r=tr[pnow].r;
        insert(tr[now].l,tr[pnow].l,l,mid,pos);
    }
    else
    {
        tr[now].l=tr[pnow].l;
        insert(tr[now].r,tr[pnow].r,mid+1,r,pos);
    }
}
int getsum(int pnow,int now,int l,int r,int pos)
{
    if(l==r)
        return tr[now].val-tr[pnow].val;
    int mid=l+r>>1;
    if(pos<=mid)
        return getsum(tr[pnow].l,tr[now].l,l,mid,pos);
    else return tr[tr[now].l].val-tr[tr[pnow].l].val+getsum(tr[pnow].r,tr[now].r,mid+1,r,pos);
}

int task_tot,tim[200086];
struct tsk{
    int bt,et,c,tim;
}tasks[200086];

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",fa+i);
        if(!fa[i])
            tree_root=i;
        tim[i]=200086;
    }
    tcp_init();
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        int op;
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d%d%d",&tasks[task_tot].bt,&tasks[task_tot].et,&tasks[task_tot].c);
            tasks[task_tot].tim=i;
            task_tot++;
        }
        else
        {
            int that;
            scanf("%d",&that);
            if(tim[that]==200086)
                tim[that]=i;
        }
    }
    build(root[0],1,200086);
    for(int i=1;i<=n;i++)
        insert(root[i],root[i-1],1,200086,tim[rfn[i]]);
    for(int i=0;i<task_tot;i++)
    {
        printf("%d ",dep[tasks[i].bt]+dep[tasks[i].et]+1-2*dep[lca(tasks[i].bt,tasks[i].et)]);
        int ans=0,a=tasks[i].bt,b=tasks[i].et;
        while(top[a]!=top[b])
        {
            if(dep[top[a]]<dep[top[b]])
                a^=b,b^=a,a^=b;
            ans+=getsum(root[dfn[top[a]]],root[dfn[a]],1,200086,tasks[i].tim-tasks[i].c-1);
            a=fa[top[a]];
        }
        if(dep[a]>dep[b])
            a^=b,b^=a,a^=b;
        ans+=getsum(root[dfn[a]],root[dfn[b]],1,200086,tasks[i].tim-tasks[i].c-1);
        printf("%d\n",ans);
    }
    return 0;
}

孩子对着这么长的代码已经疯掉了,帮帮忙吧

2023/6/23 12:36
加载中...