hdoj 5044 LCA

代码参考

hdoj 5044

题意:给一棵树,进行若干次操作,每次操作可以增加点u到点v路径上各边或各点的权值。

思路:树链剖分lca什么的。。。并不会

这题加了数据,所以网上很多以前ac的代码都过不了,学习了上面那份代码。

简单思路就是在要修改的范围的边界节点上更新值,每个节点的值是它所有的子节点值的累加。


点的权值就记录在点上,而边的权值可以记录在叶子方向的点上。

所谓叶子方向,就是沿着边走距离根更远的方向。。虽然是无向边,但是记录下来的边是有向的。

若想更新4-5上所有的边,就要更新边2-3、3-4、2-5,也就是更新点3、4、5,但是在累加的时候,子节点的值会全部累加到父节点上,所以点2(最近公共祖先)应该再减去2倍的更新值;

若想更新4-5上所有的点,就要更新点2、3、4、5,这样点2(最近公共祖先)就会被多更新一次,而它的父节点也会被多更新一次,所以这两个节点需要减去1倍的更新值。

#include <cstdio>
#include <cstring>
const int M = 1e5 + 10;
struct Edge {
    int v, id, next;
}edge[M * 4];
int a[M], b[M], k[M], to[M], lca[M], head[M], opr[M], cnt, fa[M], father[M];
long long valnode[M], valedge[M];
bool type[M], vis[M];
void init(){
    memset(valnode, 0, sizeof valnode);
    memset(valedge, 0, sizeof valedge);
    memset(opr, -1, sizeof opr);
    memset(head, -1, sizeof head);
    memset(vis, 0, sizeof vis);
    cnt = 0;
}
int findfa(int a){
    return father[a] == a ? a : findfa(father[a]);
}
void addedge(int u, int v, int id){//邻接表
    edge[cnt].v = v;
    edge[cnt].next = head[u];
    edge[cnt].id = id;
    head[u] = cnt++;
}
void addopr(int u, int v, int id){
    edge[cnt].v = v;
    edge[cnt].next = opr[u];
    edge[cnt].id = id;
    opr[u] = cnt++;
}
void LCA(int now, int f){
    father[now] = now;//这样做每个分支节点都将作为其子孙节点的最近公共祖先,遍历完后它的真实祖先会修改为其父节点
    fa[now] = f;
    vis[now] = true;
    for(int i = opr[now]; i != -1; i = edge[i].next){
        int v = edge[i].v, id = edge[i].id;
        if(vis[v]) lca[id] = findfa(v);
    }
    for(int i = head[now]; i != -1; i = edge[i].next){
        int v = edge[i].v, id = edge[i].id;
        if(v == f) continue;
        LCA(v, now);
        to[id] = v;
        father[v] = now;
    }
}
void getans(int now, int fa){
    for(int i = head[now]; i != -1; i = edge[i].next) {
        int v = edge[i].v, id = edge[i].id;
        if(v == fa) continue;
        getans(v, now);
        valnode[now] += valnode[v];
        valedge[now] += valedge[v];
    }
}
main() {
    int n, m, t;
    scanf("%d", &t);
    for(int cas = 1; cas <= t; cas++){
        init();
        scanf("%d %d", &n, &m);
        for(int i = 0; i < n - 1; i++){
            int u, v;
            scanf("%d %d", &u, &v);
            addedge(u, v, i);
            addedge(v, u, i);
        }
        for(int i = 0; i < m; i++) {
            char str[10];
            scanf("%s %d %d %d", str, &a[i], &b[i], &k[i]);
            type[i] = str[3] == '1';
            addopr(a[i], b[i], i);
            addopr(b[i], a[i], i);
        }
        LCA(1, -1);
        fa[1] = 0;
        for(int i = 0; i < m; i++){
            if(type[i]){
                valnode[a[i]] += k[i];
                valnode[b[i]] += k[i];
                valnode[lca[i]] -= k[i];
                valnode[fa[lca[i]]] -= k[i];
            }
            else {
                valedge[a[i]] += k[i];
                valedge[b[i]] += k[i];
                valedge[lca[i]] -= k[i] * 2;
            }
        }
        getans(1, -1);
        printf("Case #%d:\n", cas);
        for(int i = 1; i <= n; i++){
            if(i != 1) putchar(' ');
            printf("%I64d", valnode[i]);
        }
        putchar('\n');
        for(int i = 0; i < n - 1; i++){
            if(i) putchar(' ');
            printf("%I64d", valedge[to[i]]);
        }
        putchar('\n');
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值