MLE四个点,RE六个点,大佬求助!!!

P4114 Qtree1

RQ。。。 @ 2019-08-10 19:58:58

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=10005;
vector <pair<int,int> >va[N<<1];
int n,dfn;
int dep[N],size[N],top[N],heavy_son[N],fa[N],id[N],ys[N],val[N],ask1[N],ask2[N];
int tr[N<<2];
char t[20];
void dfs1(int now)
{
    size[now]=1;
    for(int i=0;i<va[now].size();i++)
    {
        int to=va[now][i].first;
        if(to==fa[now])
        continue;
        val[to]=va[now][i].second;
        dep[to]=dep[now]+1;
        fa[to]=now;
        dfs1(to);
        size[now]+=size[to];
        if(!heavy_son[now]||size[heavy_son[now]]<size[to])
        heavy_son[now]=to;
    }
}
void dfs2(int now,int first)
{
    top[now]=first;
    id[now]=++dfn;
    ys[id[now]]=now;
    if(!heavy_son[now])
    return;
    dfs2(heavy_son[now],first);
    for(int i=0;i<va[now].size();i++)
    {
        int to=va[now][i].first;
        if(to==fa[now])
        continue;
        if(to==heavy_son[now])
        continue;
        dfs2(to,to);
    }
}
void update(int k)
{
    tr[k]=max(tr[k<<1],tr[k<<1|1]);
    return;
}
void build(int k,int l,int r)
{
    if(l==r)
    {
        tr[k]=val[ys[l]];
        return;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    update(k);
}
void change(int k,int l,int r,int pos,int x)
{
    if(l>r)
    return;
    if(l==r)
    {
        tr[k]=x;
        return;
    }
    int mid=(l+r)>>1;
    if(mid>=pos)
    change(k<<1,l,mid,pos,x);
    else
    change(k<<1|1,mid+1,r,pos,x);
    update(k);
}
int query(int k,int l,int r,int x,int y)
{
    if(l>r)
    return 0;
    if(l==x&&r==y)
    return tr[k];
    int mid=(l+r)>>1;
    if(y<=mid)
    return query(k<<1,l,mid,x,y);
    else
    if(x>mid)
    return query(k<<1|1,mid+1,r,x,y);
    else
    return max(query(k<<1,l,mid,x,mid),query(k<<1|1,mid+1,r,mid+1,y));
}
int work(int x,int y)
{
    int tx=top[x],ty=top[y];
    int ans=-1e8;
    while(tx!=ty)
    {
        if(dep[tx]<dep[ty])
        tx^=ty,ty^=tx,tx^=ty,x^=y,y^=x,x^=y;
        ans=max(ans,query(1,1,n,id[tx],id[x]));
        x=fa[tx],tx=top[x];
    }
    if(dep[x]>dep[y])
    x^=y,y^=x,x^=y;
    ans=max(ans,query(1,1,n,id[x]+1,id[y]));
    return ans;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        ask1[i]=x;
        ask2[i]=y;
        va[x].push_back(make_pair(y,z));
        va[y].push_back(make_pair(x,z));
    }
    dep[1]=1;
    dfs1(1);
    dfs2(1,1);
    build(1,1,n);
    int x,y;
    while(1)
    {
        cin>>(t+1);
        if(t[1]=='D')
        break;
        cin>>x>>y;
        if(t[1]=='Q')
        {
            if(x==y)
            cout<<"0"<<endl;
            else
            cout<<work(x,y)<<endl;
        }
        if(t[1]=='C')
        {
            int a=ask1[x];
            int b=ask2[x];
            if(fa[a]==b) swap(a,b);
            change(1,1,n,id[b],y);
        }
    }
}

by 生而为人 @ 2019-08-10 20:03:08

码死码农了,╮( ̄▽ ̄")╭


by RQ。。。 @ 2019-08-10 20:12:48

慢慢改吧


by _gifbmp @ 2019-08-10 20:18:05

@燃情 您的dfs1,2写得有些怪啊QwQ(可能是实现方法不同)

不过dfs2那里的

ys[id[now]]=now;

应该改成

ys[dfn]=now;

by 生而为人 @ 2019-08-10 20:18:54

@_gifbmp 一样呀,


by _gifbmp @ 2019-08-10 20:31:48

@燃情 还有您不把点权下放到边权吗QAQ


|