• 树上启发式合并 待补


    对于每个子树,直接遍历所有轻儿子,继承重儿子
    会了板子后,修改维护的东西和莫队是一样的

    洛谷 U41492

    #include 
    #define ll long long
    #define ull unsigned long long
    constexpr int N=1e5+5;
    std::vector<int> e[N];
    int c[N],sum[N],ans[N],dfn[N],dfncnt,sz[N],node[N],son[N],tol;
    
    void add(int x){
        if (sum[c[x]]==0){
            tol++;
        }
        sum[c[x]]++;
    }
    void del(int x){
        sum[c[x]]--;
        if (sum[c[x]]==0){
            tol--;
        }
    }
    void dfs1(int u,int fa){
        dfn[u]=++dfncnt;
        node[dfncnt]=u;
        sz[u]=1;
        int maxson=0;
        for (auto v:e[u]){
            if (v==fa) continue;
            dfs1(v,u);
            sz[u]+=sz[v];
            if (maxson<sz[v]){
                son[u]=v;
                maxson=sz[v];
            }
        }
    }
    void dfs2(int u,int fa,bool keep){
        for (auto v:e[u]){
            if (v==fa||v==son[u]) continue;
            dfs2(v,u,0);
        }
        if (son[u]){
            dfs2(son[u],u,1);
        }
        for (auto v:e[u]){
            if (v==fa||v==son[u]) continue;
            for (int i=dfn[v];i<=dfn[v]+sz[v]-1;i++){
                add(node[i]);
            }
        }
        add(u);
        ans[u]=tol;
        if (!keep){
            for (int i=dfn[u];i<=dfn[u]+sz[u]-1;i++){
                del(node[i]);
            }
        }
    }
    void yrzr(){
        int n;
        std::cin>>n;
        for (int i=1;i<n;i++){
            int x,y;
            std::cin>>x>>y;
            e[x].push_back(y);
            e[y].push_back(x);
        }
        for (int i=1;i<=n;i++){
            std::cin>>c[i];
        }
        dfs1(1,0);
        dfs2(1,0,1);
        int m;
        std::cin>>m;
        while (m--){
            int x;
            std::cin>>x;
            std::cout<<ans[x]<<"\n";
        }
    }
    int main(){
        std::ios::sync_with_stdio(false);
        std::cin.tie(nullptr);
        std::cout.tie(nullptr);
    
        int T=1;
        // std::cin>>T;
        while (T--){
            yrzr();
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    CF600E
    板子,改一下修改操作就行了

    #include 
    #define ll long long
    #define ull unsigned long long
    constexpr int N=1e5+5;
    std::vector<int> e[N];
    int c[N],dfn[N],dfncnt,son[N],sz[N],sum[N],node[N],maxn;
    ll tol[N],ans[N];
    void add(int x){
        x=c[x];
        tol[sum[x]]-=x;
        sum[x]++;
        tol[sum[x]]+=x;
        maxn=std::max(maxn,sum[x]);
    }
    void del(int x){
        x=c[x];
        tol[sum[x]]-=x;
        sum[x]--;
        tol[sum[x]]+=x;
        if (maxn==sum[x]+1&&tol[sum[x]+1]==0){
            maxn--;
        }
    }
    void dfs1(int u,int fa){
        dfn[u]=++dfncnt;
        node[dfncnt]=u;
        sz[u]=1;
        int maxson=0;
        for (auto v:e[u]){
            if (v==fa) continue;
            dfs1(v,u);
            sz[u]+=sz[v];
            if (maxson<sz[v]){
                son[u]=v;
                maxson=sz[v];
            }
        }
    }
    void dfs2(int u,int fa,bool keep){
        for (auto v:e[u]){
            if (v==fa||v==son[u]) continue;
            dfs2(v,u,0);
        }
        if (son[u]){
            dfs2(son[u],u,1);
        }
        for (auto v:e[u]){
            if (v==fa||v==son[u]) continue;
            for (int i=dfn[v];i<=dfn[v]+sz[v]-1;i++){
                add(node[i]);
            }
        }
        add(u);
        ans[u]=tol[maxn];
        if (!keep){
            for (int i=dfn[u];i<=dfn[u]+sz[u]-1;i++){
                del(node[i]);
            }
        }
    }
    void yrzr(){
        int n;
        std::cin>>n;
        for (int i=1;i<=n;i++){
            std::cin>>c[i];
        }
        for (int i=1;i<n;i++){
            int x,y;
            std::cin>>x>>y;
            e[x].push_back(y);
            e[y].push_back(x);
        }
    
        dfs1(1,0);
        dfs2(1,0,1);
        for (int i=1;i<=n;i++){
            std::cout<<ans[i]<<" ";
        }
    }
    int main(){
        std::ios::sync_with_stdio(false);
        std::cin.tie(nullptr);
        std::cout.tie(nullptr);
    
        int T=1;
        // std::cin>>T;
        while (T--){
            yrzr();
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
  • 相关阅读:
    AIE分子四(4,4′,4″,4′″-烯丙氧基)四苯基乙烯/萘酰亚胺及吡啶偶联三苯胺聚集诱导发光型分子探针的研究
    2023.11.20 关于 Spring MVC 详解
    C语言snprintf():将格式化字符串输出到数组中
    手把手教你使用LabVIEW OpenCV dnn实现物体识别(Object Detection)含源码
    unity基础3-数据持久化
    redis 分布式锁的实现原理
    多目标杜鹃搜索 (MOCS)优化算法(Matlab代码实现)
    函数式编程
    oracle数据库老是死 怎么处理?
    实战指南:使用 xUnit 和 ASP.NET Core 进行集成测试【完整教程】
  • 原文地址:https://blog.csdn.net/qq_41418557/article/details/133580552