<胡策day> 10.30 T2 树上的战争(倍增lca)

Java 处理地理信息数据[DEM TIF文件数据获取高程] EPSG 是一个国际标准,用于唯一标识地理坐标系和投影坐标系。 阅读详情

               b

                                         题目来源:zhx(侵删)

【问题描述】

                                     你是能看到第二题的 friends 呢。
                                                                  ——laekov

Hja 和 Yjq 为了抢男主角打了起来, 现在他们正在一棵树上决斗。 Hja 在 A点, Yjq 在 B 点, Hja 先发制人开始移动。 每次他们可以沿着一条边移动, 但一旦一条边被对方走过了自己就不能再走这条边了。 每条边上都有权值, 他们都希望自己的权值尽量多。 现在给你这棵树以及他们俩开始的位置, 问 Hja 能够获得的最大权值。

【输入格式】

第一行两个整数N, M, 代表树的点数和询问的个数。
接下来N− 1行每行三个整数a, b, c, 代表从a到b有一条权值为c的边。
接下来M行, 每行两个整数A, B代表一次询问。

【输出格式】

对于每次询问, 输出一个整数代表答案。

【样例输入 1】

2 1
1 2 3
1 2

【样例输出 1】

3

【样例输入 2】

3 2
1 2 3
1 3 1
2 3
1 3

【样例输出 2】

3
4

【数据范围与规定】

对于30%的数据, 1 ≤N,M ≤ 1000。
对于另外30%的数据, M= 1。
对于100%的数据, 1 ≤ N,M≤ 105, 0 ≤c≤ 103, 1 ≤a,b,A,B≤N。

思路:

因为他们都希望自己的权值尽量多,所以必定都会按照最优的方案走,也就是走他们之间的路径,尽可能快的堵住对方。

所以我们要求两个人之间的路径,再在中间找他们相遇的地方,这里注意hja是先手,他所经过的道路数为(L+1)/2,其中L表示路径长度。

找出路径和相遇点后就可以求他们现在各自所拥有的权值。令sum[i]表示以i为根节点的子树的权值和。

路径可以用倍增lca来求,sum数组可以在dfs时顺便处理出来。

但是还要注意一个问题:

两个人在一个节点相遇后,仍旧会朝着一个方向走,直到所有能走的边都被走过了为止。

所以我们要把相遇点所连接的各子树(除去两个人走来的子树)的答案记下来,从大到小排序,按照最优的原则和两个人的先后顺序进行分配。

解题步骤

  1. dfs处理fa和sum

  2. lca求路径

  3. 找相遇点

  4. 对相遇点的子树答案进行分配

特判:X等于Y

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;

int N,M,cnt,A,B,C,X,Y,ans;
int first[100010],next[200010],deep[100010];
int fa[100010][30],sum[100010],f[100010],v[100010];

struct maple{
    int f,t,d;
}Rode[200010];

void Build(int f,int t,int d)
{
   Rode[++cnt]=(maple){f,t,d};  
   next[cnt]=first[f];
   first[f]=cnt;
}

int Dfs(int f,int t)
{
    deep[t]=deep[f]+1;
    fa[t][0]=f;
    for(int i=first[t];i;i=next[i])
       if(Rode[i].t!=f)
       {
           sum[t]=sum[t]+Dfs(t,Rode[i].t)+Rode[i].d;
       }
    return sum[t];   
}

void Done()
{
    for(int i=1;i<=log2(N);++i)
       for(int j=1;j<=N;++j)
          fa[j][i]=fa[fa[j][i-1]][i-1];
}
int lca(int x,int y)
{
    if(deep[x]<deep[y]) swap(x,y);
    for(int i=log2(N);i>=0;--i)
    {
        if(deep[fa[x][i]]>=deep[y])
            x=fa[x][i];
    }   
    if(x==y) return x;
    for(int i=log2(N);i>=0;--i)
       if(fa[x][i]!=fa[y][i])
          x=fa[x][i],y=fa[y][i];
    return fa[x][0];
}

int ask(int x,int d)
{
    for(int i=log2(N);i>=0;--i)
        if(deep[fa[x][i]]>=d)
           x=fa[x][i];
    return x;
}
bool cmp(int a,int b)
{
    return a>b;
}
void ask_ans(int kx,int ky,int Lca,int L)
{
    if(kx!=ky)
    {   
        if(deep[kx]>=deep[ky]) ans=sum[kx];  
        else ans=sum[1]-sum[Lca];
    }
    else ans=0;
    int n=0;
    for(int i=first[Lca];i;i=next[i])
    {
         if(Rode[i].t!=kx&&Rode[i].t!=ky)
         {
              ++n;
              if(Rode[i].t!=fa[Lca][0])
                   v[n]=sum[Rode[i].t]+Rode[i].d;
              else v[n]=sum[1]-sum[Lca];
         }
         if(Rode[i].t==kx&&deep[kx]>=deep[ky]) ans+=Rode[i].d; 
    }
    int k=1;
    if(L%2!=0) ++k;
    sort(v+1,v+n+1,cmp); 
    for(int i=k;i<=n;i+=2)  ans+=v[i];
    return ;
}
int main()
{
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<N;++i)
    {
        scanf("%d%d%d",&A,&B,&C);
        Build(A,B,C);
        Build(B,A,C);
    }
    sum[1]=Dfs(1,1);
    Done();
    while(M--)
    {
        scanf("%d%d",&X,&Y);
        int Lca=lca(X,Y),kx,ky,k;
        int L=deep[X]+deep[Y]-2*deep[Lca];
        int ll=L;
        if(L%2==0) L/=2;
        else L=L/2+1;
        if(deep[X]-deep[Lca]==L) 
        {
            kx=ask(X,deep[Lca]+1);
            ky=ask(Y,deep[Lca]+1);
            ask_ans(kx,ky,Lca,ll);
            //cout<<"*";
        }
        else
        {
            if(X==fa[Y][0]) ask_ans(X,Y,Y,1);//printf("****");
            else if(deep[X]-deep[Lca]>L) 
            {
                k=ask(X,deep[X]-L+1);
                ask_ans(k,fa[k][1],fa[k][0],ll);
                //cout<<"**";
            } 
            else if(deep[X]-deep[Lca]<L)
            {
                L=L-deep[X]+deep[Lca];
                int l=deep[Lca]+L+1;
                k=ask(Y,l);
                ask_ans(fa[k][1],k,fa[k][0],ll);
                //cout<<"***";
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

打的比较丑QAQ

另 附上陪我调了一下午的数据,X,Y请自己出

15 100
1 2 1
2 4 1
2 5 0
5 9 1
5 10 3
2 6 2
6 11 4
11 12 6
11 13 5
1 3 2
3 7 2
3 8 4
8 14 5
14 15 7
RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之BswM模块配置详解(上) 阅读详情

相关推荐

拯救者R7000P(2021)装双系统Ubuntu20.04 解决联发科MT7921无线网卡在Ubuntu中不能联网

拯救者R7000P(2021)装双系统Ubuntu20.04/Ubuntu18.04 电脑配置:联想拯救者R7000P CPU:AMD R7-5800H GPU:RTX3060-6G 内存:16GB 固态:500G(原装)+500(加装) 1.做系统盘(本文以Ubuntu20.04为例) 1.下载Ubuntu20.04镜像 直接去Ubuntu官网或者一些国内的镜像去下载都可以,这里给出一个网址https://ubuntu.com/download/desktop,根据需要下载自己学要的Ubuntu版本,后缀

qq_41108639的博客 1万+

HDU2545:树上战争

Problem Description 给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜   Input 输入包含多组数据 每组第一行包含两个数N,M(N,M 接下来N-1行,每行2个整数A,B(1 接下来M行,每行有2个数,表示lxh和pfz的初始位置的编号X,Y

ACM!荣耀之路! 1790

【论文精度】生成式预训练模型——BART(Bidirectional and Auto-Regressive Transformers)

​ BART是一个预训练的seq2seq的去噪自编码(denoising autoencoder)模型,BART以下方式进行训练①用任意的噪声函数(noising function)去破坏文本;②学习一个模型来重建原始文本。它使用一个标准的基于transformer的神经机器翻译架构,可以看作是BERT(双向编码器)、GPT(left-to-right解码器)以及其他预训练方案的推广。

weixin_45828972的博客 7447

【10.30 P98】

有一种做题的感觉叫做“诶,好巧啊你也是只T1暴力是吧?” 嗯。。。烦啊。。。T1同时给定a*b≤n(a,b不保证小于n) 【输入格式】 一行一个整数n。 【输出格式】 一行一个整数代表答案。 【样例输入】 6 【样例输出】 25 【数据范围与规定】 对于30%的数据, 1 ≤ n ≤ 100。 对于60%的数据, 1 ≤ n ≤ 1000。 对于100%的数据, 1 ≤

Loi_Chairmanの博客 446

显著性算法 + 伪彩变换

利用opencv得到显著图和伪彩图

正在挣扎中的人 2298

(04730)半导体器件之基本放大器工作原理(一)

放大器是构成各种电子线路的基本单元电路。所谓“放大”,就是将输入的微弱信号(微弱变化的电压或电流等)去控制直流电源提供的能量,并使输出按照输入的小信号变化规律而变化的过程。所以放大器的本质是能量转换器。本节重点学习基本放大电路的工作原理和基本分析方法及主要性能指标。

黄先生的博客 3005

【HDU4822】Tri-war(树上倍增)

红色,黄色和蓝色三个国家处于战争之中。战场地图是一棵树,这意味着有N个节点和(N – 1)条边连接所有节点。每个国家在一个节点上都有一个基站。这三个国家都不会将其站点放置在同一节点中。每个国家将从其基站开始占领其他节点。对于每个节点,如果其他两个国家的基站到该节点的距离比国家A大,则国家A将占据该位置。请注意,每个边缘的长度相同。 给定三个国家/地区的基站,您的任务是计算每个国家/地区占用的节点数...

ezoi_ly的博客 329

GB/T 27930-2023协议升级与CANoe仿真测试实践

本文深入解析GB/T 27930-2023协议的核心升级,包括A/B类系统分类与EVIN码引入,并详细指导如何使用CANoe搭建仿真测试环境、编写CAPL脚本及利用DLL库进行一致性验证与故障注入测试,助力开发人员确保电动汽车充电通信的合规性与稳定性。

y7z8a的博客 540

洛谷 P2495:[模板] 虚树 / [SDOI2011] 消耗战 ← 虚树 + 树形DP + 倍增

虚树是一种在树形结构问题中用于压缩规模、降低时间复杂度的数据结构,核心思想是只保留问题相关的关键节点,以及这些节点之间的路径关系,从而忽略大量无关节点,让原本无法在大数据范围下运行的算法变得可行。

hnjzsyjyj的专栏 656

从零开始:用7353张VOC/YOLO格式混凝土缺陷数据集训练你的第一个检测模型

本文详细介绍了如何使用7353张VOC/YOLO格式的混凝土缺陷数据集训练首个目标检测模型。从环境配置、数据解析到YOLOv5模型训练与优化,提供了完整的实战指南,特别针对数据不平衡问题给出了解决方案,助力开发者快速掌握混凝土缺陷识别技术。

weixin_42651281的博客 255

YOLOv8【第二章:卷积创新篇·第23节】一文搞懂,Transformer与卷积混合架构!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 1387

数据结构专题 - 解题报告 - 目录

A - 方差 - 解题报告 线段树区间内乘法加法和推平 B - 吞吐量 - 解题报告 倍增LCA C - 人在地上走,锅从天上来 - 解题报告 set的用法,不过我只用线段树过了 D - 密码 - 解题报告 维护区间的RMQ问题,也可以看作栈 E - 冬马和纱天下第一 - 解题报告 在线分块 F - 我永远喜欢冬马和纱 - 解题报告 莫队 G - 线段树教做人 - 解题报告 线段树+数学公式推导 ...

fatdog_jo的博客 252

uniapp - 实现苹果App打包上架App Store应用商店详细教程,详解Hbuilder打包编译ipa发布上传到苹果ios软件商店全流程,提供云打包/离线本地打包ios、申请IOS苹果证书方法

uni-app,苹果ios,苹果app,打包编译,appstore应用商店,ipa发布到软件商店,uniapp的app苹果应用商店上架,上架苹果APPStore,uniApp打包的ipa文件上传到商店,上架苹果商城,审核失败,被拒绝,UniApp打包ipa文件,上架iOSAppStore流程指南,最新详细教程最全,Hbuilder打包发布iosapp,苹果云打包上线全过程,云打包IPA并上传到商店,打包iOSipa文件后怎么发布到应用商店,苹果证书申请教程,ios证书申请,mac电脑,审核很久

🏆 前端领域优质创作者 1万+

[SDOI2011][BZOJ2286] 消耗战|虚树|树型dp|树上倍增LCA

2286: [Sdoi2011]消耗战 Time Limit:20 SecMemory Limit:512 MBSubmit:1040Solved:363[Submit][Status][Discuss] Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,...

weixin_30412167的博客 91

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

UVALive 6712(2013长春区域赛)

Three countries, Red, Yellow, and Blue are in war. The map of battlefield is a tree, which means that there are N nodes and (N −1) edges that connect all the nodes. Each country has a base station loc

cq_phqg 771

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据结构专题——虚树

虚树(virtual tree)的概念 虚树 是将一个树的点集的某一个子集,以及该子集中点的 LCALCALCA 的集合,一起所重构出来的一棵树 虚树的用途 在树型dp中,有时候没必要对整颗树进行dp,只用对某个子集构成的虚树进行dp,大大降低了时空复杂度 例题:P2495 [SDOI2011] 消耗战 [SDOI2011] 消耗战 题目描述 在一场战争中,战场由 nnn 个岛屿和 n−1n-1n−1 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为 111 的岛屿,

m0_52766855的博客 3074

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

虚树(Virtual Tree)学习笔记

虚树(Virtual Tree)学习笔记 一道题目(BZOJ-2286消耗战) Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他k个岛屿上有丰富能源,为了防止敌军获取能源,我军的任务是炸毁一些桥梁,使得敌军不能到达任何能源丰...

weixin_30915951的博客 307

BZOJ2286: [Sdoi2011]消耗战(虚树)

BZOJ2286: [Sdoi2011]消耗战   Time Limit: 20 Sec   Memory Limit: 512 MB Description   在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他k个岛屿上有丰富能源,为了防止敌军获...

weixin_30445169的博客 103

算法学习——从bzoj2286开始的虚树学习生活

【原创】转载请标明原作者~ http://www.cnblogs.com/Acheing/ 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2286 Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,而...

JK15233的博客 160

<胡策day> 10.26 T1 最大子串权值

*PS:一上来第一题就是一个思维题qwq,emmm…考场上只打了个暴力,果断60分滚粗。%%那些在考场上打出正解的dalao。                          题目来源:钟长者(侵删)                【问题描述】 你是能看到第一题的 friends 呢。

Loi_Mapleleaf的小池 822

<队内胡策> 2017.10.24 求逆序对+表达式计算+贪心+Bfs+最短路、exgcd

*PS:为什么我t5死活都调不出来呢(눈‸눈) T1:原创,参考noip火柴排队。 T2: codevs 2178 表达式运算Cuties (我自己找的) T3:Codeforce867E(865D) Buy Low Sell High T4: USACO 2015 DEC Gold  不明链接1   不明链接2 ( 该网站不提供在线测评,仅提供数据下载。考试使用原数据。) T5

Loi_Mapleleaf的小池 594

<考试题> codevs 5251 WYW的数字金字塔

*PS:原来暴力优化优化是可以过的么qwq,ljoj 数据手动测并没有T。。。最后默默的吐槽一句,附上一个金字塔的图是因为怕我们没有见过吗。。。go to the problem题目描述 Descriptionwyw有一个数字n,他要用这个数字写出一个数字金字塔。wyw用随机数生成器生成了一个小于n且大于1的正整数k。wyw找来一张白纸,他在白纸的最低端写下了这个数字n。wyw在n的上面紧挨着写下了

Loi_Mapleleaf的小池 545

<学习笔记?>考试与做题的注意事项总结。

数组:1.数组一定不要开太大,int 型 128MB~3200万,256MB~6400万,注意char 占1字节,long int 占4字节,long long 占8字节 ,double 占8字节 2.数组下标中有减法的话一定要注意判边界,不能访问负数下标(windows下不会报错)

Loi_Mapleleaf的小池 533

<互测 day> 11.6 T1 谜团 (mituan)

*PS: 没开long long被卡掉45分,果然出题人的话都不可信QAQ。。(学傻了)与zqsz的互测题 T1 原题 POJ 1845【题目描述】谜团,是夜魇军团一名强大的战士。他来自远古,是一种不可思议的重力生命体,是来自原始黑暗的扭曲声音,在宇宙中的第一丝光线诞生前就存在的深渊化身。他能动用深渊之力将生物的身体污染,使之转化为自身的碎片“虚灵”。 “虚灵”为谜团所控,拥有一定的战斗力。更为恐

Loi_Mapleleaf的小池 532

<胡策day> 10.30 T1 小学数学

*PS:突然被小学数学弄得怀疑人生(⊙_⊙)…老师等等我ヾ(>Д<;))))….. 先科普一下 (百度百科) 整除 [zhěng chú] 若整数a除以非零整数b,商为整数,且余数[1] 为零, 我们就说a能被b整除(或说b能整除a),a为被除数,b为除数,即b|a(“|”是整除符号),读作“b整除a”或“a能被b整除”。a叫做b的倍数,b叫做a的约数(或因数)。整除属于除尽的

Loi_Mapleleaf的小池 518

<队内胡策>2017.10.18 (DP+tarjan、SPFA+字符串+脑洞、数学)

*这可是我们组自己从网上找题出的一套考试题,虽然有些水,但是个人认为还是很不错啦(〃’▽’〃)!!尤其是我的题面(≖ᴗ≖๑) 多图预警!!

Loi_Mapleleaf的小池 499
上一篇: codevs 1019 集合论与图论
下一篇: <胡策day> 10.30 T1 小学数学
Loi_Mapleleaf
博客等级 码龄10年 17粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值