传送门

树链剖分。

如何维护?

如果颜色少直接每种颜色一颗线段树走人。

但这题颜色数量不大于1e5" role="presentation" style="position: relative;">1e51e5,空间难以承受。

因此我们动态开点(毕竟所有点数加起来只有1e5" role="presentation" style="position: relative;">1e51e5)

其余就是树链剖分的基本操作了。

代码如下:

#include<bits/stdc++.h>
#define N 3000005
#define lc T[p].l
#define rc T[p].r
using namespace std;
int n,m,cntx=0,cnt=0,tot=0,first[N],dep[N],top[N],num[N],fa[N],hson[N],siz[N],rt[N],w[N],c[N],pos=0;
struct Node{int l,r,sum,maxn;}T[N<<2];
struct node{int v,next;}e[N<<1];
inline void add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;}
inline void dfs1(int p){
    siz[p]=1,hson[p]=0;
    for(int i=first[p];i;i=e[i].next){
        if(e[i].v==fa[p])continue;
        fa[e[i].v]=p,dep[e[i].v]=dep[p]+1,dfs1(e[i].v),siz[p]+=siz[e[i].v];
        if(siz[hson[p]]<siz[e[i].v])hson[p]=e[i].v;
    }
}
inline void dfs2(int p,int tp){
    top[p]=tp,num[p]=++tot;
    if(hson[p])dfs2(hson[p],tp);
    else return;
    for(int i=first[p];i;i=e[i].next)if(e[i].v!=fa[p]&&e[i].v!=hson[p])dfs2(e[i].v,e[i].v);
}
inline void pushup(int p){
    T[p].maxn=T[p].sum=0;
    if(lc)T[p].maxn=T[lc].maxn,T[p].sum=T[lc].sum;
    if(rc)T[p].maxn=max(T[p].maxn,T[rc].maxn),T[p].sum+=T[rc].sum;
}
inline void update(int&p,int l,int r,int v,int k){
    if(!p)p=++pos;
    if(l==r){T[p].sum+=v,T[p].maxn+=v;return;}
    int mid=l+r>>1;
    if(k<=mid)update(lc,l,mid,v,k);
    else update(rc,mid+1,r,v,k);
    pushup(p);
}
inline int query_sum(int p,int ql,int qr,int l,int r){
    if(!p)return 0;
    if(ql<=l&&r<=qr)return T[p].sum;
    int ret=0,mid=l+r>>1;
    if(ql<=mid)ret+=query_sum(lc,ql,qr,l,mid);
    if(mid<qr)ret+=query_sum(rc,ql,qr,mid+1,r);
    return ret;
}
inline int query_max(int p,int ql,int qr,int l,int r){
    if(!p)return 0;
    if(ql<=l&&r<=qr)return T[p].maxn;
    int ret=0,mid=l+r>>1;
    if(ql<=mid)ret=max(ret,query_max(lc,ql,qr,l,mid));
    if(qr>mid)ret=max(ret,query_max(rc,ql,qr,mid+1,r));
    return ret;
}
inline int ask_sum(int x,int y,int col){
    int ans=0;
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        ans+=query_sum(rt[col],num[top[x]],num[x],1,n);
        x=fa[top[x]];
    }
    if(dep[x]<dep[y])swap(x,y);
    return ans+query_sum(rt[col],num[y],num[x],1,n);
}
inline int ask_max(int x,int y,int col){
    int ans=0;
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        ans=max(ans,query_max(rt[col],num[top[x]],num[x],1,n));
        x=fa[top[x]];
    }
    if(dep[x]<dep[y])swap(x,y);
    return max(ans,query_max(rt[col],num[y],num[x],1,n));
}
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;++i)w[i]=read(),c[i]=read();
    for(int i=1;i<n;++i){
        int u=read(),v=read();
        add(u,v),add(v,u);
    }
    dfs1(1),dfs2(1,1);
    for(int i=1;i<=n;++i)update(rt[c[i]],1,n,w[i],num[i]);
    while(m--){
        char op[3];
        scanf("%s",op);
        int a=read(),b=read();
        switch(op[1]){
            case 'C':{update(rt[c[a]],1,n,-w[a],num[a]),update(rt[c[a]=b],1,n,w[a],num[a]);break;}
            case 'W':{update(rt[c[a]],1,n,b-w[a],num[a]),w[a]=b;break;}
            case 'S':{cout<<ask_sum(a,b,c[a])<<'\n';break;}
            default:{cout<<ask_max(a,b,c[a])<<'\n';break;}
        }
    }
    return 0;
}

2018.07.24 bzoj3531: [Sdoi2014]旅行(树链剖分+动态开点)的更多相关文章

  1. BZOJ 3531 [Sdoi2014]旅行 树链剖分+动态开点线段树

    题意 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我们用 ...

  2. 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)

    题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

  3. 【BZOJ3531】[Sdoi2014]旅行 树链剖分+动态开点线段树

    [BZOJ3531][Sdoi2014]旅行 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天 ...

  4. BZOJ3531:[SDOI2014]旅行(树链剖分)

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...

  5. BZOJ3531 SDOI2014 旅行 - 树链剖分,主席树

    题意:给定一棵树,树上每个点有权值和类型.支持:修改某个点的类型:修改某个点的权值:询问某条链上某个类型的点的和/最大值.点数/类型数/询问数<=100000. 分析: 树链剖分,对每个类型的点 ...

  6. BZOJ3531 [Sdoi2014]旅行 树链剖分 线段树

    原文链接:http://www.cnblogs.com/zhouzhendong/p/8080189.html 题目传送门 - BZOJ3531 题意概括 一棵树,n个节点,每一个节点两个值,一个颜色 ...

  7. BZOJ3531[Sdoi2014]旅行——树链剖分+线段树

    题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...

  8. BZOJ.3531.旅行(树链剖分 动态开点)

    题目链接 无优化版本(170行): /* 首先树剖可以维护树上的链Sum.Max 可以对每个宗教建一棵线段树,那这题就很好做了 不过10^5需要动态开点 (不明白为什么nlogn不需要回收就可以 不是 ...

  9. 【bzoj4999】This Problem Is Too Simple! 树链剖分+动态开点线段树

    题目描述 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x. 2. Q i j x(0<=x<2^31) ...

随机推荐

  1. Firemonkey 绘图 TPathData

    Firemonkey  TPathData TPath控件 procedure TForm12.FormPaint( Sender : TObject; Canvas : TCanvas; const ...

  2. Declaration terminated incorrectly 讨厌 这样就不可以了

    #include "vcl.fctreeview.hpp"#include "RM_Class.hpp"#include "RM_Common.hpp ...

  3. xe Style

    //注意引用:vcl.themes, vcl.styles, IOutils procedure TForm1.FormCreate(Sender: TObject); var stylename: ...

  4. 19 python unit4 常用模块练习题&总结

      1.logging模块有几个日志级别? logging模块共有5个级别,分别是: DEBUG INFO WARNING ERROR CRITICAL logging的日志可以分为 debug(), ...

  5. ABAP-关于COMMIT WORK 和COMMIT WORK AND WAIT

    转载:https://blog.csdn.net/champaignwolf/article/details/6925019 首先说明一点:更新是异步的,更新是由SAP中UPD1和UPD2两个进程执行 ...

  6. React Native指南汇集了各类react-native学习资源、开源App和组件

    来自:https://github.com/ele828/react-native-guide React Native指南汇集了各类react-native学习资源.开源App和组件 React-N ...

  7. ntohs, ntohl, htons,htonl的比较和详解【转】

    ntohs =net to host short int 16位 htons=host to net short int 16位 ntohs =net to host long int 32位 hto ...

  8. Social media users of the world unite!

    Social media users of the world unite!全世界社交媒体用户联合起来!If Plato were alive today, he might well regard ...

  9. Python基础杂点

    Black Hat Python Python Programming for Hackers and Pentesters by  Justin Seitz December 2014, 192 p ...

  10. Process ProcessThread Thread

    Process ProcessThread: Process and ProcessThread objects have a ProcessorAffinity property of IntPtr ...