蓝桥杯--LCA1

树上前缀和+LCA

暴力做法:

我们先把不删的sum维护出来,然后遍历跳过的点,假如a1,a2,a3,跳过2,那么答案就是sum-cost(a1,a2)-cost(a2,a3)+cost(a1,a3).

DFS暴力,下面是代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int k,n;
typedef pair<int,int> pii;
int a[100010];
vector<pii> edge[100010];
map<pii,ll> st;
bool dfs(int s,int u,int fa,int v,ll sum)
{if(u==v){st[{s,v}]=sum;st[{v,s}]=sum;return 1;}for(int i=0;i<edge[u].size();i++){int son=edge[u][i].first;if(fa==son) continue;if(dfs(s,son,u,v,sum+edge[u][i].second)) return 1;}return 0;
}
int main()
{cin>>n>>k;for(int i=1;i<=n-1;i++){int u,v,t;cin>>u>>v>>t;edge[u].push_back({v,t});edge[v].push_back({u,t});}for(int i=1;i<=k;i++) cin>>a[i];ll ans=0;for(int i=1;i<=k;i++){dfs(a[i],a[i],-1,a[i+1],0);ans+=st[{a[i],a[i+1]}];}for(int i=1;i<=k;i++){ll tp=ans;if(i==1) tp-=st[{a[i],a[i+1]}];if(i==k) tp-=st[{a[i-1],a[i]}];if(i>1&&i<k){tp-=st[{a[i-1],a[i]}]+st[{a[i],a[i+1]}];dfs(a[i-1],a[i-1],-1,a[i+1],0);tp+=st[{a[i-1],a[i+1]}];}cout<<tp<<" ";}
}

正确做法:

我们先预处理出各个点到根节点的距离就是树上前缀和,答案就是sum[a1]+sum[a2]-2*sum[fa],fa为a1,a2的最近公共祖先,下面是LCA用倍增实现的板子:

https://www.luogu.com.cn/problem/P3379

#include<bits/stdc++.h>
using namespace std;
int n,m,s;
vector<int> edge[500010];
int dep[500010];
int fa[500010][22];
int maxd=21;
void dfs(int x,int fath)
{if(x!=s){fa[x][0]=fath;dep[x]=dep[fath]+1;for(int i=1;(1<<i)<=n;i++) fa[x][i]=fa[fa[x][i-1]][i-1];}for(int i=0;i<edge[x].size();i++){int ck=edge[x][i];if(ck==fath) continue;dfs(ck,x);}
}
int up(int x,int d){int ret=x;for(int i=0;(1<<i)<=n;i++){if(((1<<i)&d)!=0) ret=fa[ret][i];}return ret; 
}
int lca(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);x=up(x,dep[x]-dep[y]);if(x==y) return x;for(int i=maxd;i>=0;i--){if(fa[x][i]!=fa[y][i]){x=fa[x][i],y=fa[y][i];}}return fa[x][0];
}
int main()
{cin>>n>>m>>s;for(int i=1;i<=n-1;i++){int x,y;cin>>x>>y;edge[x].push_back(y);edge[y].push_back(x);}dep[s]=1;dfs(s,-1);while(m--){int a1,b1;cin>>a1>>b1;cout<<lca(a1,b1)<<endl;}
}

本题的AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int k,n;
typedef pair<int,ll> pii;
int a[100010];
vector<pii> edge[100010];
map<pii,ll> st;
ll sum[100010];
int dep[100010];
int fa[100010][22];
int maxd=21;
void dfss(int x,int fath)
{if(x!=1){fa[x][0]=fath;dep[x]=dep[fath]+1;for(int i=1;(1<<i)<=n;i++) fa[x][i]=fa[fa[x][i-1]][i-1];}for(int i=0;i<edge[x].size();i++){int ck=edge[x][i].first;if(ck==fath) continue;dfss(ck,x);}
}
int up(int x,int d){int ret=x;for(int i=0;(1<<i)<=n;i++){if(((1<<i)&d)!=0) ret=fa[ret][i];}return ret; 
}
int lca(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);x=up(x,dep[x]-dep[y]);if(x==y) return x;for(int i=maxd;i>=0;i--){if(fa[x][i]!=fa[y][i]){x=fa[x][i],y=fa[y][i];}}return fa[x][0];
}
void dfs(int x,int fa)
{for(int i=0;i<edge[x].size();i++){int ck=edge[x][i].first;if(ck==fa) continue;ll num=edge[x][i].second;sum[ck]=sum[x]+num;dfs(ck,x);}
}
ll dis(int x,int y)
{ll zhi=sum[x]+sum[y];zhi-=2*sum[lca(x,y)];return zhi;
}
int main()
{cin>>n>>k;for(int i=1;i<=n-1;i++){int u,v,t;cin>>u>>v>>t;edge[u].push_back({v,t});edge[v].push_back({u,t});}for(int i=1;i<=k;i++) cin>>a[i];dep[1]=1;sum[1]=0;dfs(1,-1);dfss(1,-1);ll summ=0;for(int i=1;i<=k-1;i++) summ+=dis(a[i],a[i+1]);for(int i=1;i<=k;i++){ll ans=summ;if(i>1&&i<k){ans-=dis(a[i-1],a[i])+dis(a[i],a[i+1]);ans+=dis(a[i-1],a[i+1]);}if(i==1) ans-=dis(a[1],a[2]);if(i==k) ans-=dis(a[k-1],a[k]);cout<<ans<<" ";}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端使用jar包部署完成后,前端访问不了,可以试试这个方法

这个项目我在部署完之后发现系统前端页面能出来&#xff0c;但是接口不通。报错404&#xff0c;那么这个时候你就要考虑你后端使用的端口是否开放&#xff0c;因为我这里是遇到了这个问题&#xff1a;我后端用的是5400端口&#xff0c;但是我检查后发现5400端口没有被开放&…

【Unity脚本】使用脚本操作游戏对象的组件

【知识链】Unity -> Unity脚本 -> 游戏对象 -> 组件 【知识链】Unity -> Unity界面 -> Inspector【摘要】本文介绍如何使用脚本添加、删除组件&#xff0c;以及如何访问组件 文章目录 引言第一章 游戏对象与组件1.1什么是组件&#xff1f;1.2 场景、游戏对象与组…

php使用openssl返回false报错0308010C

本地php使用openssl返回false, 但是在服务器上测试正常openssl_encrypt($jsonStr, DES-ECB, $key, OPENSSL_RAW_DATA, ); 查看错误 openssl_error_string(); error:0308010C:digital envelope routines::unsupported 原因是: 服务器上的openssl是1.1版本, 本地是3.0版本 通…

Imgs,GT,Edge,Gradient_all,Gradient_Foreground

保存一下&#xff1a; 做个记录&#xff1a; import cv2 import os import numpy as np# 对整张图片做canny检测 得到纹理图 def canny_all(input_path, output_path):# 遍历文件夹中的所有文件for filename in os.listdir(input_path):# 构造完整的文件路径image_path os.p…

GB-T 42929-2023 互联网金融智能风险防控技术要求

GB-T 42929-2023 互联网金融智能风险防控技术要求 互联网金融作为金融创新的重要领域&#xff0c;近年来发展迅猛&#xff0c;但同时也带来了诸多风险和挑战。为了规范互联网金融行业的健康发展&#xff0c;提高风险防控能力&#xff0c;中国国家标准委员会制定了《GB-T 42929…

C++回调函数

#include <iostream> #include <functional> // 为了使用 std::function // 声明一个回调函数类型 typedef std::function<void()> Callback11;// 调用函数&#xff0c;它接受一个回调函数作为参数 void process(Callback11 callback123) {// 在这里执…

直播领域新宠—第三代大模型无人直播系统:提升销售业绩的秘密武器

随着科技的飞速发展和人们对智能化生活的追求&#xff0c;直播领域也迎来了革新性的突破。第三代大模型无人直播系统&#xff0c;作为直播领域的新宠&#xff0c;正以其独特的魅力和优势&#xff0c;成为提升销售业绩的秘密武器。 首先&#xff0c;第三代大模型无人直播系统具…

2024山软创新实训:软件系统架构

软件架构 本文着重介绍本应用&#xff1a;基于开源LLM的易学大模型软件系统的架构。在经过2个月的探索、选型、实验、开发后&#xff0c;我们团队终于把整个系统的各块拼图搭建了起来&#xff0c;现在剩下的是集成、评测、优化和部署的工作。 1. Distributed System 整个项目…

5月31日,每日信息差

第一、小米汽车官方宣布&#xff0c;5 月新增 9 家门店&#xff0c;目前已在全国 30 城开业 70 家门店&#xff0c;6 月计划新增 19 家 第二、科技巨头谷歌、Meta、微软、AMD、英特尔、博通、思科和惠普成立了一个名为 「超级加速链路」 的联盟&#xff08;UALink&#xff09;…

【Android】

hint在text显示提示内容 设置主键&#xff0c;在mainactivity // 获取SharedPreferences对象存放的用户名和密码&#xff0c;并设为相应组件的值 //指定key的值&#xff0c;及获取不到值时使用的默认值 String sName sp.getString("name", "unknown")…

媲美苹果、三星uwb芯片,飞睿智能UWB SIP芯片方案,创新无线传输、测距、精准定位新纪元

超宽带&#xff08;UWB&#xff09;技术作为一种新兴的无线通信技术&#xff0c;以其高精度定位、低功耗、高安全性和强抗干扰能力等优势&#xff0c;在全球范围内得到了广泛关注和快速应用。 2019 年&#xff0c;苹果iPhone11搭载UWB芯片&#xff0c;火极一时的AirDrop隔空投…

MODIS L1B数据规格介绍

1.MODIS 仪器概述 MODIS是EOS AM-1系列卫星的主要探测仪器&#xff0c;也是EOS Terra平台上唯一进行直接广播的对地观测仪器。MODIS是当前世界上新一代“图谱合一”的光学遥感仪器&#xff0c;具有36个光谱通道&#xff0c;分布在0.4-14um的电磁波谱范围内&#xff0c;波段范围…

Docker Hub 国内镜像源配置

Docker Hub 国内镜像源配置 Docker Hub 国内镜像源是指在国内境内提供 Docker 镜像服务的镜像源。由于国际网络带宽等问题&#xff0c;国内用户下载 Docker 镜像通常速度较慢。因此&#xff0c;为了解决这个问题&#xff0c;一些国内的公司和组织提供了 Docker 镜像的国内镜像…

MySQL--MHA高可用及读写分离

一、什么是高可用 1.企业级高可用标准&#xff1a;全年无故障时间 全年无故障时间全年故障时间具体时间99.9%0.1%525.6 minkeeplive双主 &#xff08;切换需要人为干预&#xff09;99.99%0.01%52.56 minMHA &#xff08;半自动化&#xff09;99.999%0.001%5.256 minPXC、MGR、…

android Seekbar当点击的时候有一个圆圈

最近项目中Seekbar的时候遇到一个问题&#xff1a;点击进度条或者拖动进度条的时候&#xff0c;seekbar出现一个圆形的半透阴影/白色圆圈&#xff1a; <xxxxxxxxxSeekBarandroid:layout_width"wrap_content"android:layout_height"40dp"android:backgro…

解决3D模型变黑及贴图不显示的问题---模大狮模型网

在3D建模和渲染过程中&#xff0c;模型变黑或贴图不显示是常见的挑战之一。这不仅影响了模型的视觉效果&#xff0c;还可能导致后续的工作流程受阻。本文将针对这两个问题&#xff0c;提供详细的解决方法和步骤&#xff0c;帮助读者快速有效地解决问题。 一、检查并调整光照设置…

Day 8:1461. 检查一个字符串是否包含所有长度为 K 的二进制子串

Leetcode 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 给你一个二进制字符串 s 和一个整数 k 。如果所有长度为 k 的二进制字符串都是 s 的子串&#xff0c;请返回 true &#xff0c;否则请返回 false 。 截取每个长度为 k 的字符串&#xff0c;加入 Set 中&#x…

分布式数据库的扩容思路

分布式数据库的扩容是一项复杂的工程&#xff0c;它要求数据库能够在不中断服务的情况下增加更多的存储资源和计算能力。扩容通常涉及增加节点&#xff08;服务器实例&#xff09;和重新分配数据。这个过程需要谨慎进行&#xff0c;以确保数据的一致性、可用性和性能不受影响。…

根据状态转移图实现时序电路 (三段式状态机)

看图编程 * ** 代码 module seq_circuit(input C ,input clk ,input rst_n,output wire Y ); reg [1:0] current_stage ; reg [1:0] next_stage ; reg Y_reg; //输出//第一段 &#xff1a; 初始化当前状态和…

自学动态规划——最长重复子数组(子序列问题)

最长重复子数组 718. 最长重复子数组 - 力扣&#xff08;LeetCode&#xff09; 第一次接触&#xff0c;确实会有些懵&#xff0c;但是看了题解&#xff0c;仔细想想&#xff0c;确实是这么回事。要点如下&#xff1a; dp数组含义——dp[i][j]表示当num1取i个&#xff0c;num…