求助,萌新连1+1都不会了

P4114 Qtree1

洛谷加油 @ 2020-02-13 15:00:13

#include<bits/stdc++.h>
using namespace std;
int n,a[100005],p1[100005],p2[100005];
vector<int>g[100005],g2[100005],g3[100005];
int dep[10005],fa[100005],w[100005],vist[100005],sn[100005];
int lt[100005],lf[100005],st[100005],en[100005],tot;
long long sm[400005],lz[400005],sm2[400005];
void dfs1(int x)
{
    w[x]=1;
    for(int i=0;i<g[x].size();i++)
    {
        int cu=g[x][i];
        fa[cu]=x;
        dep[cu]=dep[x]+1;
        dfs1(cu);
        w[x]+=w[cu];
    }
}
void dfs2(int x)
{
    st[x]=tot++;
    if(!g[x].size())return;
    int flag=0,zh=0;
    for(int i=0;i<g[x].size();i++)if(w[g[x][i]]>zh)zh=w[g[x][i]],sn[x]=g[x][i];
    for(int i=0;i<g[x].size();i++)if(flag==0&&w[g[x][i]]==zh)
    {
        flag=1;
        lt[x]=g[x][i];
        lf[g[x][i]]=lf[x];
        dfs2(g[x][i]);
    }
    for(int i=0;i<g[x].size();i++)if(g[x][i]!=lt[x])
    {
        lf[g[x][i]]=g[x][i];
        dfs2(g[x][i]);
    }
    en[x]=tot;
}
void add(int l,int r,int o,int ll,int rr,int oo)
{
    if(l>=ll&&r<=rr)
    {
        lz[o]=(lz[o]+oo);
        sm[o]=(sm[o]+1ll*(r-l+1)*oo);
        sm2[o]=(sm2[o]+oo);
        return;
    }
    int mid=l+r>>1;
    lz[o<<1]=(lz[o<<1]+lz[o]);
    lz[o<<1|1]=(lz[o<<1|1]+lz[o]);
    sm[o<<1]=(sm[o<<1]+1ll*(mid-l+1)*lz[o]);
    sm[o<<1|1]=(sm[o<<1|1]+1ll*(r-mid)*lz[o]);
    sm2[o<<1]+=lz[o];
    sm2[o<<1|1]+=lz[o];
    lz[o]=0;
    if(mid>=ll)add(l,mid,o<<1,ll,rr,oo);
    if(mid<rr)add(mid+1,r,o<<1|1,ll,rr,oo);
    sm[o]=(sm[o<<1]+sm[o<<1|1]);
    sm2[o]=max(sm2[o<<1],sm2[o<<1|1]);
}
int query(int l,int r,int o,int ll,int rr)
{
    if(l>=ll&&r<=rr)return sm2[o];
    int mid=l+r>>1;
    lz[o<<1]=(lz[o<<1]+lz[o]);
    lz[o<<1|1]=(lz[o<<1|1]+lz[o]);
    sm[o<<1]=(sm[o<<1]+1ll*(mid-l+1)*lz[o]);
    sm[o<<1|1]=(sm[o<<1|1]+1ll*(r-mid)*lz[o]);
    sm2[o<<1]+=lz[o];
    sm2[o<<1|1]+=lz[o];
    lz[o]=0;
    int ans=-2147483647;
    if(mid>=ll)ans=max(ans,query(l,mid,o<<1,ll,rr));
    if(mid<rr)ans=max(ans,query(mid+1,r,o<<1|1,ll,rr));
    return ans;
}
void dfs(int x)
{
    vist[x]=1;
    for(int i=0;i<g2[x].size();i++)
    {
        int cu=g2[x][i];
        if(vist[cu])continue;
        g[x].push_back(cu);
        a[cu]=g3[x][i];
        dfs(cu);
    }
}
int main()
{
//  freopen("444.in","r",stdin);
//  freopen("444.out","w",stdout);
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        g2[u].push_back(v);
        g2[v].push_back(u);
        g3[u].push_back(w);
        g3[v].push_back(w);
        p1[i]=u,p2[i]=v;
    }
    dfs(1);
    dfs1(1);
    dfs2(1);
    for(int i=2;i<=n;i++)add(1,n,1,st[i],st[i],a[i]);
    char s[105]={0};
    scanf("%s",s);
    while(s[0]!='D')
    {
        if(s[0]=='C')
        {
            int p,t;
            scanf("%d%d",&p,&t);
            if(fa[p1[p]]==p2[p])
            {
                add(1,n,1,st[p1[p]],st[p1[p]],t-query(1,n,1,st[p1[p]],st[p1[p]]));
            }else
            {                   
                add(1,n,1,st[p2[p]],st[p2[p]],t-query(1,n,1,st[p2[p]],st[p2[p]]));
            }
        }else
        {
            int x,y;
            scanf("%d%d",&x,&y);
            int ans=0;
            while(lf[x]!=lf[y]&&x&&y)
            {
                if(dep[lf[x]]>dep[lf[y]])swap(x,y);
                ans=max(ans,query(1,n,1,st[lf[y]]+1,st[y]));
                y=fa[lf[y]];
            }
            if(dep[x]>dep[y])swap(x,y);
            if(x&&y&&x!=y)ans=max(ans,query(1,n,1,st[x]+1,st[y]));
            printf("%d\n",ans);
        }
        scanf("%s",s);
    }
    return 0;
}

by xzy062609 @ 2020-02-13 15:04:11

有毒

QWQ


by xh39 @ 2020-02-13 15:18:43

1

+

1


|