首页 > 其他分享 >P11324 【MX-S7-T2】「SMOI-R2」Speaker

P11324 【MX-S7-T2】「SMOI-R2」Speaker

时间:2024-11-24 14:55:34浏览次数:3  
标签:P11324 R2 int res max1 S7 fa max2 mak2

P11324 【MX-S7-T2】「SMOI-R2」Speaker - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

就是,复杂的分类讨论。最核心的就是树上倍增求链的最大值。不写多了。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

typedef long long LL;

const int N = 200010, M = N * 2, K = log2(N) + 2;

int n, m;
int h[N], e[M], ne[M], w[M], idx;
LL v[N];
LL depth[N], fa[N][K], maxv[N][K]; 
LL dist[N], max1[N], max2[N], max3[N];
LL mak1[N], mak2[N], mak3[N];
LL sum[N], res, kk;

void add(int a, int b, int c)
{
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++ ; 
}

void dfs1(int u, int fas)
{
    max1[u] = v[u];
    
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (fas == j) continue;
        dist[j] = dist[u] + w[i];
        dfs1(j, u);
        // cout << u << ' ' << max1[u] << endl;
        // cout << j << ' ' << max1[j] << endl; 
        if (max1[j] - 2 * w[i] >= max1[u])
        {
            max3[u] = max2[u], mak3[u] = mak2[u];
            max2[u] = max1[u]; mak2[u] = mak1[u];
            max1[u] = max1[j] - 2 * w[i], mak1[u] = j;
            // cout << max1[u] << endl;
        }
        else if (max1[j] - 2 * w[i] >= max2[u])
        {
            max3[u] = max2[u], mak3[u] = mak2[u];
            max2[u] = max1[j] - 2 * w[i], mak2[u] = j;
        }
        else if (max1[j] - 2 * w[i] >= max3[u]) 
        {
            max3[u] = max1[j] - 2 * w[i];
            mak3[u] = j;
        }
        // cout << 'a';
        
    }
}

void dfs2(int u, int fas)
{
    depth[u] = depth[fas] + 1;
    fa[u][0] = fas;
    if (mak1[fas] != u) maxv[u][0] = max(v[u], max1[fas]);
    else maxv[u][0] = max(v[u], max2[fas]);
    
    for (int j = 1; j < K; j ++ )
    {
        fa[u][j] = fa[fa[u][j - 1]][j - 1];
        maxv[u][j] = max(maxv[u][j - 1], maxv[fa[u][j - 1]][j - 1]);
    }

    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (j == fas) continue;
        if (mak1[u] != j) sum[j] = max(sum[u], max1[u]) - 2 * w[i];
        else sum[j] = max(sum[u], max2[u]) - 2 * w[i];
        dfs2(j, u);
    }
}

int lca(int a, int b)
{
    if (depth[a] < depth[b]) swap(a, b);

    for (int j = K - 1; j >= 0; j -- )
        if (depth[fa[a][j]] >= depth[b])
        {
            if (depth[fa[a][j]] == depth[b]) kk = a;
            res = max(res, maxv[a][j]);
            a = fa[a][j];
            
        }
        
    if (a == b) 
    {
        
        res = max(res, v[a]);
        return a;
    }
    
    for (int j = K - 1; j >= 0; j -- )
        if (fa[a][j] != fa[b][j])
        {
            res = max({res, maxv[a][j], maxv[b][j]});
            a = fa[a][j];
            b = fa[b][j];
        }
    kk = a;
    int u = fa[a][0];
    if (a != mak1[u] && b != mak1[u]) res = max(res, max1[u]);
    else if (a != mak2[u] && b != mak2[u]) res = max(res, max2[u]);
    else res = max(res, max3[u]);
    
    return u;
}

int main()
{
//  	freopen("speaker4.in", "r", stdin);
//  	freopen("speaker4.out", "w", stdout);
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) scanf("%lld", &v[i]);
    
    memset(h, -1, sizeof h);
    for (int i = 1; i < n; i ++ )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c);
        add(b, a, c);
        // cout << a << ' ' << b << ' ' <<  c << endl;
    }
    
    dfs1(1, 0);
    dfs2(1, 0);
    
    while (m -- )
    {
        int a, b;
        res = 0;
        scanf("%d%d", &a, &b);
        int p = lca(a, b);
        // printf("%d %d %d\n", a, b, p);     
        LL ans = max({sum[p], res});
        if (p == a) 
        {
            if (mak1[a] != kk) ans = max({ans, max1[b], max1[a]});
            else ans = max({ans, max1[b], max2[a]});
        }
        else if (p == b)
        {
            if (mak1[b] != kk) ans = max({ans, max1[a], max1[b]});
            else ans = max({ans, max1[a], max2[b]});
        }
        else 
        {
            ans = max({ans, max1[a], max1[b]});
        }
        printf("%lld\n", ans - (dist[a] + dist[b] - 2 * dist[p]) + v[a] + v[b]);
        // printf("%lld %lld %lld %lld %lld\n", sum[p], max1[a], max1[b], res, ans);
        
    }
    
    return 0;
}

标签:P11324,R2,int,res,max1,S7,fa,max2,mak2
From: https://www.cnblogs.com/blind5883/p/18565823

相关文章

  • YOLOv10改进,YOLOv10添加DynamicConv(动态卷积),CVPR2024,二次创新C2f结构
    摘要大规模视觉预训练显著提高了大规模视觉模型的性能。现有的低FLOPs模型无法从大规模预训练中受益。在本文中,作者提出了一种新的设计原则,称为ParameterNet,旨在通过最小化FLOPs的增加来增加大规模视觉预训练模型中的参数数量。利用DynamicConv动态卷积将额外的参......
  • Centos7 安装 mysql8.0 (RPM安装版)
    1.下载mysql8.0的rpm安装包     rpm的mysql包,安装起来简单,解压版的mysql还需要做许多配置,稍有不慎就会出错!!!下载页面:MySQL::DownloadMySQLCommunityServer文件下载地址: https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.28-1.el7.x86_64.rpm-bundle.tar......
  • CentOS7换yum源(出现yum下载不了东西)
    1.如果您的系统提示默认yum源无法使用,或者是安装yuminstall安装软件包失败,可以参考2.可以直接按顺序执行下面5句话,前提是您的服务器是默认使用的是官方yum。  验证:cd/etc/yum.repos.d,利用ls查看是否存在CentOS-Base.repo文件,存在即是的。 #切换到yum仓库配置目录......
  • Adobe Premiere(简称PR2024)视频编辑软件下载
    一、发展历史1.1早期版本AdobePremiere(简称PR)是Adobe公司推出的一款视频编辑软件,其历史可以追溯到1991年。当时,Adobe发布了Premiere1.0版本,仅支持MacOS系统。1993年9月,Adobe公司推出了首个针对Windows系统的Premiere版本,这使得更多用户能够接触和使用这款强大的视频编辑工......
  • 论文精读:多源域自适应目标检测中的目标相关知识保存(CVPR2022)
    原文标题:Target-RelevantKnowledgePreservationforMulti-SourceDomainAdaptiveObjectDetection中文标题:多源域自适应目标检测中的目标相关知识保存论文地址:https://arxiv.org/pdf/2204.07964代码地址:无官方实现?我有点纳闷难道顶会不公布代码的吗这篇文章是由北......
  • GOT-OCR2.0:本地部署基于QWen0.5B大模型的强大OCR服务
        这两天大佬团队开源了基于千问大模型OCR项目的视频多次被刷到,各博主对其识别能力也是给予充分的肯定, 作为CV工程师的小编平时工作中OCR的需求也是络绎不绝,如果真如各博主所说是跨时代的产品,那必须也要盘它一盘;github:GitHub-Ucas-HaoranWei/GOT-OCR2.0:Offici......
  • cisco nexus7000 基本系统配置及OTV
    cisconexus7000基本系统配置1.开启cdpcdpenablecdpformatdevice-idsystem-name默认是对端设备的设备名2.ntp开启普通vdc2下开启ntp同步,先在defaultvdc上打上clockprotocolntpvdc2DC1-N7K-2(config)#ntpserver10.1.1.1use-vrfmannagementDC1-N7K-2(config)#ntpso......
  • centos7 升级内核
    1.更新系统yumupdate-y2.添加elrepo软件源yuminstallvim-yvi/etc/yum.repos.d/elrepo.repo添加以下内容[elrepo]name=elrepobaseurl=https://mirrors.aliyun.com/elrepo/archive/kernel/el7/x86_64gpgcheck=0enabled=13.刷新源数据缓存yumcleanall&&yumm......
  • Python环境安装(Windows7—现今)
    这里进行python——保姆级安装说明:首先进行安装包的下载:输入:python.org(因为是外网,所以加载速度巨慢,不用怀疑是自身网络的问题)然后显示的界面是:(我这英文进行自动翻译了,无伤大雅)然后点击:进入后,再点击进行下载:然后就开始下载了:(你会发现巨慢,外网嘛,悠哉悠哉等会)然后下载......
  • centos7安装docker和docker-compose
    1.卸载已有Dockeryumremovedockerdocker-commondocker-selinuxdocker-engine 2.安装wget后面会用yuminstallwget 3.配置yum源注意,yum源文件在/etc/yum.repos.d,改源之前一定要备份原来的源cd/etc/yum.repos.dmkdirbackmv./*.repoback#下面配置的是阿......