让lu哥头痛了许久的代码(洛谷:树的统计)

错在单点修改时传的是a,应该是id[a](Line 89)。谨记!!!

//fushao zuishuai
#include <cstdio>
#include <cstring>
#include <iostream>
#define ll(x) (x<<1)
#define rr(x) (x<<1|1)
using namespace std;

const int N=30010;
int w[N],a[N],maxx[N*4],sum[N*4];
int n,m,s[N*2][2],o[N],top[N],son[N],id[N],cnt,siz[N],d[N],f[N],dfn;

void jia(int a,int b) {s[++cnt][0]=b;s[cnt][1]=o[a];o[a]=cnt;return;}

void shang(int r) {maxx[r]=max(maxx[ll(r)],maxx[rr(r)]);sum[r]=sum[ll(r)]+sum[rr(r)];}

void js(int r,int z,int y)
{
    if (z==y) {sum[r]=a[z];maxx[r]=a[z];return;}
    int k=z+y>>1;js(ll(r),z,k);js(rr(r),k+1,y);shang(r);
}

void ddxg(int r,int z,int y,int g,int v)
{
    if (z>g||y<g) return;
    if (z>=g&&y<=g) {sum[r]=v;maxx[r]=v;return;}int k=z+y>>1;
    ddxg(ll(r),z,k,g,v);ddxg(rr(r),k+1,y,g,v);shang(r);
}

int cx1(int r,int z,int y,int zz,int yy)
{
    if (z>yy||y<zz) return 0;if (z>=zz&&y<=yy) return sum[r];
    int k=z+y>>1;return cx1(ll(r),z,k,zz,yy)+cx1(rr(r),k+1,y,zz,yy);
}

int cx2(int r,int z,int y,int zz,int yy)
{
    if (z>yy||y<zz) return -3500000;if (z>=zz&&y<=yy) return maxx[r];
    int k=z+y>>1;return max(cx2(ll(r),z,k,zz,yy),cx2(rr(r),k+1,y,zz,yy));
}

void dfs1(int x,int fa,int dep)
{
    f[x]=fa;d[x]=dep;siz[x]=1;
    for (int i=o[x];i;i=s[i][1])
    if (s[i][0]!=fa) {
        dfs1(s[i][0],x,dep+1);siz[x]+=siz[s[i][0]];
        if (siz[s[i][0]]>siz[son[x]]) son[x]=s[i][0];
    }
}

void dfs2(int x,int tp)
{
    id[x]=++dfn;top[x]=tp;a[dfn]=w[x];
    if (son[x]) dfs2(son[x],tp);
    for (int i=o[x];i;i=s[i][1])
    if (s[i][0]!=f[x]&&son[x]!=s[i][0]) dfs2(s[i][0],s[i][0]);
}

int qiulu2(int a,int b)
{
    int ans=-3e8;
    while (top[a]!=top[b]) {
        if (d[top[a]]<d[top[b]]) swap(a,b);
        ans=max(ans,cx2(1,1,n,id[top[a]],id[a]));a=f[top[a]];
    }
    if (d[a]>d[b]) swap(a,b);ans=max(ans,cx2(1,1,n,id[a],id[b]));
    return ans;
}

int qiulu1(int a,int b)
{
    int ans=0;
    while (top[a]!=top[b]) {
        if (d[top[a]]<d[top[b]]) swap(a,b);
        ans+=cx1(1,1,n,id[top[a]],id[a]);a=f[top[a]];
    }
    if (d[a]>d[b]) swap(a,b);ans+=cx1(1,1,n,id[a],id[b]);
    return ans;
}

int main()
{
    cin>>n;int a,b,t=n-1;while (t--) {scanf("%d%d",&a,&b);jia(a,b);jia(b,a);}
    for (int i=1;i<=n;i++) scanf("%d",&w[i]);dfs1(1,0,1);dfs2(1,1);js(1,1,n);
    cin>>m;char q[20];
    while (m--) {
        scanf("%s",q);
        if (q[1]=='H') {scanf("%d%d",&a,&b);ddxg(1,1,n,id[a],b);}
        if (q[1]=='M') {scanf("%d%d",&a,&b);printf("%d\n",qiulu2(a,b));}
        if (q[1]=='S') {scanf("%d%d",&a,&b);printf("%d\n",qiulu1(a,b));}
    }
    return 0;
}

 

posted @ 2018-01-04 20:09  fuyan0101  阅读(292)  评论(0编辑  收藏  举报