Codeforces Gym - 101808K(倍增LCA最近公共祖先)

C# : 计算并输出这一天是这一年的第几天 C#之输入某年,然后输入某月,再输入某日,计算并输出这一天是这一年的第几天的功能算法 阅读详情

题目链接

题意:

给 n 个点,n 条边(3  <= n <= 100000),q 次询问,每次求 u 到 v 之间的最短路。没有重边和自环。

题解:

显然 O(n2logn) 是会超时的。由于只给了n条边,那么去掉一条边就是一棵树了。这时可以用LCA求解。我看这位大佬的代码学的。

用并查集即可将成环的一条边从图中除去。之后的每次查询只需要判断经过这条边和不经过这条边哪个更小即可。具体看代码。

代码:

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <bitset>
using namespace std;

typedef long long ll;
#define int ll
#define INF 0x3f3f3f3f3f3f3f3f
#define MAXM 32 + 10
#define MAXN 300000 + 10
const ll mod = 1e9 + 7;
#define P pair<int, int>
#define fir first
#define sec second

int t, n, q;
vector<P> G[MAXN];
int father[MAXN];
int dis[MAXN], dep[MAXN];
int gfa[MAXM][MAXN];

int get_root(int x)
{
    if(x == father[x]) return x;
    return father[x] = get_root(father[x]);
}

void dfs(int now, int fa, int d)
{
    gfa[0][now] = fa;
    dep[now] = d;
    for(int i = 0; i < G[now].size(); i ++) {
        if(G[now][i].sec != fa) {
            dis[G[now][i].sec] = dis[now] + G[now][i].fir;
            dfs(G[now][i].sec, now, d + 1);
        }
    }
}

void init()
{
    dfs(1, -1, 0);
    for(int k = 0; k + 1 < 32; k ++) {
        for(int v = 1; v <= n; v ++) {
            if(gfa[k][v] == -1) gfa[k+1][v] = -1;
            else gfa[k+1][v] = gfa[k][gfa[k][v]];
        }
    }
}

int LCA(int u, int v)
{
    if(dep[u] > dep[v]) swap(u, v);
    for(int k = 0; k < 32; k ++) {
        if((dep[v] - dep[u]) >> k & 1)
            v = gfa[k][v];
    }
    if(u == v) return u;
    for(int k = 31; k >= 0; k --) {
        if(gfa[k][u] != gfa[k][v]) {
            u = gfa[k][u];
            v = gfa[k][v];
        }
    }
    return gfa[0][u];
}

int get_dis(int u, int v)
{
    return dis[u] + dis[v] - 2 * dis[LCA(u, v)];
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> t;
    while(t --) {
        cin >> n >> q;
        int ru, rv, rx;
        for(int i = 1; i <= n; i ++) {
            father[i] = i;
            G[i].clear();
        }
        for(int i = 0; i < n; i ++) {
            int a, b, x; cin >> a >> b >> x;
            int ra = get_root(a);
            int rb = get_root(b);
            if(ra == rb) {
                ru = a, rv = b, rx = x;
                continue;
            }
            father[ra] = rb;
            G[a].push_back(P(x, b));
            G[b].push_back(P(x, a));
        }
        init();
        while(q --) {
            int u, v; cin >> u >> v;
            int ans = get_dis(u, v);
            ans = min(ans, get_dis(ru, u) + rx + get_dis(rv, v));
            ans = min(ans, get_dis(ru, v) + rx + get_dis(rv, u));
            cout << ans << endl;
        }
    }
}

/*

The WAM is F**KING interesting .

*/

 

个人信息保护合规审计人员(高级)能力考核试卷+面试模拟 《个人信息保护合规审计考试与面试指南》 摘要:本文提供个人信息保护合规审计考试及面试的全面指导。考试采用闭卷笔试形式,满分100分,合格线75分,时长120分钟,包含单选、多选、判断题及综合案例分析题。内容涵盖《个人信息保护法》核心条款、审计程序、风险评估等实务要点。面试环节采用情景模拟方式,重点考察应试者在压力下处理审计独立性、客户关系与监管要求的平衡能力,以及应对数据泄露等突发事件的处置流程。案例题聚焦大型互联网平台的数据收集、共享、跨境传输等高风险环节的合规审计,要求设计完整的审计方案框架。面试评分标 阅读详情

相关推荐

Kill5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题

Kill5-5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题 问题简要描述: 昨日更新了keil5软件的版本,从5.17更新到了5.37版本,然后编译STM32项目文件时,软件提示编译报错。报错问题如下: Build started: Project: QKsoftware *** Using Compiler 'V6.18', folder: 'E:\MDK-ARM\ARM\ARM\ARMCLANG\Bin' Build target 'QKsoftware' compiling

weixin_43644424的博客 1万+

Gym - 101808K Another Shortest Path Problem (LCA+思维)

K. Another Shortest Path Problem time limit per test 3.0 s memory limit per test 256 MB input standard input output standard output Shortest path problems have always been a part of competiti...

LSD20164388的博客 643

从零到一:手把手教你构建自定义ReaxFF力场参数

本文手把手教你从零构建自定义ReaxFF力场参数,详解反应力场的动态键序机制与参数化逻辑。通过LAMMPS实战演示,涵盖训练数据准备、参数优化算法选择及性能优化技巧,助力研究人员精准模拟化学反应过程。适用于材料科学、催化研究等领域,特别适合已掌握分子动力学基础的进阶用户提升力场开发能力。

weixin_28365523的博客 1056

Codeforces 609E LCA倍增

Codeforces 609E 题目链接: http://codeforces.com/contest/609/problem/E 题意: 给n个点(<=2e5),m条边(n-1 <= <= 2e5),问对于每条边,做一个最小生成树树的权值。 思路: 增量最小生成树,就是先构造一个最小生成树。然后对每条边找所在环上最大的边删去。 实现用LCA实现。关于LCA,刚开始用了RMQ来做,怎么

beihai2013 781

操作系统原理:【优麒麟】linux内核添加系统调用

在底端添加如下代码。

Joyce_zz的博客 2709

RK3588嵌入式开发实战:U-Boot设备树文件修改全指南(含常见踩坑点)

本文为RK3588嵌入式开发者提供了一份详尽的U-Boot设备树文件修改实战指南。文章深入解析了设备树的核心架构,从基础硬件适配到时钟、电源管理等进阶配置,并重点总结了内存节点、串口输出、电源时序等常见踩坑点与解决方案,旨在帮助开发者高效、稳健地完成U-Boot移植与定制工作。

yhn456789的博客 730

Codeforces-GYM(101808):Another Shortest Path Problem(思维+LCA)

K. Another Shortest Path Problemtime limit per test3.0 smemory limit per test256 MBinputstandard inputoutputstandard outputShortest path problems have always been a part of competitive programming, ap...

Mitsuha_的博客 1059

霍尔编码器 vs 磁编码器:如何为你的电机控制项目选择最佳传感器(附实战对比)

本文深入对比了霍尔编码器和磁编码器在电机控制项目中的应用,从技术原理、性能参数、成本效益到实际场景选择提供了全面分析。通过实验室测试和项目案例,帮助工程师根据精度、环境抗性和预算选择最佳传感器方案,特别适合机器人、伺服驱动等领域的开发者参考。

weixin_28312391的博客 349

CodeForces - 932D. Tree(书上倍增+LCA)

题目链接:http://codeforces.com/problemset/problem/932/D You are given a node of the tree with index 1 and with weight 0. Let cnt be the number of nodes in the tree at any instant (initially, cnt is set t...

永远鲜红の幼月的博客 297

YOLOv11改进-卷积-引入Upsampling by Dynamic DySample 解决传统上采样灵活性问题

现有的上采样方法如等,依赖于动态卷积来生成上采样的内容感知核,但这些方法需要额外的子网络生成动态卷积核计算量较大。尤其是 FADE 和 SAPA 需要高分辨率的特征图作为引导,进一步增加了计算负担,并限制了应用场景。DySample的核心思想是将上采样过程重新定义为点采样(Point Sampling)。通过学习输入特征图中的采样点坐标,DySample 生成内容感知的采样点来对特征图进行重新采样,而不是使用动态卷积核。具体实现步骤如下:​​1. 输入特征图:大小为 C×H×W的输入特征图。

qq_64693987的博客 4660

智能制造——解读AI+工业设备预测性维护解决方案【附全文阅读】

摘要:本方案面向设备密集型制造企业,提供基于AI的预测性维护解决方案。通过工业物联网、大数据和AI算法,整合传感器数据与专家知识库,构建异常检测、故障诊断等模型,实现设备台账管理、智能点检等核心功能。方案配套软硬件工具矩阵,已在锂电子等行业落地应用,可降低维护成本30%以上,减少非计划停机50%,助力企业智能化转型。

cdfunlove的博客 138

Gym - 101808K Another Shortest Path Problem (Damascus University Collegiate)【并查集+LCA】

传送门:http://codeforces.com/gym/101808/problem/K Shortest path problems have always been a part of competitive programming, appearing in many contests all around the world. In order to keep that tradit...

智熄 470

学Simulink——基于高渗透率可再生能源微电网的逆变器系统场景实例:含高比例逆变型电源的微电网暂态稳定性分析

本文详细介绍了基于MATLAB/Simulink的高渗透率可再生能源微电网建模方法,重点分析含高比例逆变型电源的微电网暂态稳定性问题。通过构建包含光伏、风电、逆变器和电网等模块的系统模型,展示了从项目创建、模块搭建到控制策略实现的完整过程。文章特别提供了逆变器PQ控制算法和故障处理逻辑的代码示例,并介绍了仿真参数设置与结果分析方法。该模型能有效评估微电网在故障条件下的动态响应特性,为优化逆变器控制策略提供依据,对现代智能电网研究具有重要意义。

xiaoheshang_123的博客 140

GYM101808 K LCA

(有任何问题欢迎留言或私聊 &amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp; 欢迎交流讨论哦 题目:传送门  大概是这个意思,给你一个n个节点的树和额外一条边,每条边都有权值,m次询问,问节点a和b的最短距离。 思路:  首先不算额外的那条边,树上任意两点的权值是固定的。  那么额外的一条边可以带来什么呢? 假设额外的一条边为XY,权值为Z。 对于一颗树,我们可以dfs预处理处每个节点 i

打过ICPC/CCPC,学习ACM算法,Linux内核,Openharmony,加油努力开心珍惜 400

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Gym - 101808K Another Shortest Path Problem LCA+思维

http://codeforces.com/gym/101808/problem/K Shortest path problems have always been a part of competitive programming, appearing in many contests all around the world. In order to keep that tradition, ...

xiji333的博客 309

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Codeforces 1051F The Shortest Statement 最近公共祖先,最短路,瞎搞

文章目录题意思路 题目链接 题意 一张连通无向图,有边权,边数-点数不超过20,回答q对点对间最短路. 思路 听说这题比E题A的人多就去做了一下. 由于数据性质,如果构造这张无向图的任何一棵生成树,非树边最多只有202020条. 这有什么用呢? 对于每一对询问的两个点的最短路,只有两种可能. 第一种是全部经过树上的路径.这种只要用d[u]+d[v]−d[lca(u,v)]×2d[u]+d[v]-d...

Fuko_Ibuki的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

牛客网暑期ACM多校训练营(第一场)比赛总结

虽然只做出了两道题,但是感觉总结还是非常有必要写的。 1、针对J题,区间查询问题要先往线段树、树状数组这方面想,最后再想其他的,不要贪,还有思维灵活一些,早就该想到把区间转化为连续的一段了。这样再离线处理就很简单了。据说还可以用主席树或者莫队。。。针对树状数组离线处理的题目还有很多,这需要我们熟练掌握。 离线树状数组:HDU 4417 HDU 3874 LightOJ 1118 BZOJ 27...

LSD20164388的博客 460

【CodeForces】827 D. Best Edge Weight 最小生成树+倍增LCA+并查集

【题目】D. Best Edge Weight 【题意】给定n个点m条边的带边权无向连通图,对每条边求最大边权,满足其他边权不变的前提下图的任意最小生成树都经过它。n,m<=2*10^5,1<=wi<=10^9。 【算法】最小生成树+倍增LCA+并查集 【题解】首先求出图的一个最小生成树M,则所有边分成树边和非树边。 一、对于非树边(u,v),假设u和v在最小生成树M上的...

weixin_33711641的博客 219

Codeforces-425 (Div. 2)-D(最近公共祖先->倍增)

题目链接:http://codeforces.com/contest/832/problem/D 题目大意:n个点,n-1条边,然后q次查询,每次查询给你三个数a,b,c,从这三个数中选择两个数 作为起点,剩下一个数作为终点,问你两个起点到终点的路线中能够重合的点最多有多少个。 题目思路:乍一看感觉像是树形DP 或者 树链刨分之类的随便搞搞,但是仔细想想,求经过的点数和 求

信仰.的博客 640

Codeforces-Gadget Hackwrench-LCA最近公共祖先

题目链接:http://codeforces.com/gym/100685/problem/G Gadget Hackwrench time limit per test 2 seconds memory limit per test 64 megabytes input standard input output standard

Blue_Ghost_的博客 775

Codeforces Round #378 (Div. 2) F. Drivers Dissatisfaction图论 树链剖分 最小生成树+最近公共祖先+倍增法或树链剖分 模板

题目链接:F. Drivers Dissatisfaction 题目大意 无向图有n个节点,m条边,每条边有wiwiw_i(边的权值),cicic_i(让wiwiw_i减少1需要花费ci)ci)c_i)两个属性 现在有预算S,可以用这些钱让一些边的权值减小(边的权值可以减少到0甚至负数) 设计一个方案,减小某些边的权值,使得这张图的最小生成树的权重和最小 输出最小生成树的权值和,以及最小...

litmxs的博客 339

Gym - 100283K K. Cubes Shuffling —— 贪心

题目链接:http://codeforces.com/gym/100283/problem/K 题解: 要使其相邻两项的差值之和最小,那么越靠中间,其数值越小。 那么剩下的问题就是如何放数字了。一开始的想法是从中间开始放,然后:左右左右……, 后来发现当为偶数个时,这种放法的字典序并非最小,应该右左右左地放。所以从中间向两边扩散的放法需要分奇偶讨论...

weixin_30341745的博客 180

codeforces 208 E 时间戳 倍增法求LCA

链接:http://www.codeforces.com/problemset/problem/208/E 题意:给你一个森林,m个询问:v,p 求有多少个点(除v外) 与 v的第p个祖先相同 这个题首先要解决找某个点的第p个祖先的问题,可以采用倍增法 记录一个二维数组p[u][i]表示u的第2^i个祖先,那么通过这个数组我们就可以知道u的上面任意深度(相对于u)祖先是谁(巧妙的利用二进制

努力奋斗才能梦想成真 4193

Codeforces Round #294 (Div. 2) E 树上倍增lca

链接:戳这里 E. A and B and Lecture Rooms time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output A and B are preparing themselves for programmi

Cross 988

Codeforces Round #425 (Div. 2) D. Misha, Grisha and Underground 最近公共祖先

D. Misha, Grisha and Underground time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Misha and Grisha are funny boys, so

Dave_lzw的博客 609

倍增LCA(带修改),codeforce#535F,codeforce#827D

F. MST Unification https://codeforces.com/contest/1108/problem/F 题意 n个点,m条边,每条边都有一个权值,每次操作可以使得一条边的权值减1,问最小需要几次操作,使得最小生成树唯一。 题解 对于最小生成树不唯一的情况就是,添加一条非树边后(u,v,w)后构成的环中的最小值(除非树边的最小值)等于非树边,这样就可以用非树边去替代这条边使...

Link_Ray的博客 758
上一篇: Codeforces Round #551 (Div. 2)D. Serval and Rooted Tree (树形dp 思维)
下一篇: 南昌网络赛 Max answer(单调栈 + 线段树维护前缀和最大最小值)
ttoobne
博客等级 码龄9年 13粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值