zoukankan      html  css  js  c++  java
  • 让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
    ",qiulu2(a,b));}
            if (q[1]=='S') {scanf("%d%d",&a,&b);printf("%d
    ",qiulu1(a,b));}
        }
        return 0;
    }
  • 相关阅读:
    Oracle修改数据文件路径
    检查交换空间: 可用的交换空间为 0 MB, 所需的交换空间为 150 MB。 未通过 <<<<
    Oracle 字符集修改
    Bad check value found during backing up datafileBad check value found during backing up datafile
    Oracle编译失效对象
    带where查询条件的expdp/impdp
    impdp导入报错案例ORA00907建表缺失右括号
    数据库参数 PGA_AGGREGATE_LIMIT 限制进程大小
    oracle本地服务名配置说明
    返回起始日期到终止日期的日期数据
  • 原文地址:https://www.cnblogs.com/fushao2yyj/p/8195629.html
Copyright © 2011-2022 走看看