首页 > 其他分享 >P8805 [蓝桥杯 2022 国 B] 机房

P8805 [蓝桥杯 2022 国 B] 机房

时间:2023-12-12 11:34:18浏览次数:28  
标签:P8805 100005 int len 蓝桥 fa depth 2022 lca

原题链接

前情提要

题目不难看懂,即求a->b过程中的所有点的延迟和。显然可以暴力遍历一遍完成,但是时间复杂度太高了。

改进算法

想象这个图是由点和线组成的,把其中一个点提起来,这样就变成了一个树(n叉树),任意两点(a,b)间的延迟和等于a->lca->b,其中lca为ab两点的最近公共祖先

这样一来,只要在求lca时顺便求一下和就行了。

定值区间求和我们可以考虑用前缀和求解(前缀和太diao了)

代码

#include<bits/stdc++.h>
using namespace std;
vector<int> G[100005];
void add(int x,int y)
{
    G[x].push_back(y);
    G[y].push_back(x);
}
int fa[100005][16]={0};
int vis[100005]={0};
int depth[100005]={0};
int len[100005]={0};
int main()
{
    int n,m;
    cin>>n>>m;

    for(int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        add(x,y);
    }

    queue<int> q;
    q.push(1);
    vis[1]=1;
    depth[1]=1;
    len[1]=G[1].size();
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        for(int i=0;i<G[now].size();i++)
        {
            int next=G[now][i];
            if(!vis[next])
            {
                fa[next][0]=now;
                vis[next]=1;
                depth[next]=depth[now]+1;
                len[next]=len[now]+G[next].size();
                q.push(next);
            }
        }
    }

    for(int k=1;k<=15;k++)
        for(int i=1;i<=n;i++)
            fa[i][k]=fa[fa[i][k-1]][k-1];




    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        if(depth[x]>depth[y])swap(x,y);

        int ans=len[x]+len[y];
        for(int i=15;i>=0;i--)
            if(depth[fa[y][i]]>=depth[x])y=fa[y][i];

        for(int i=15;i>=0;i--)
            if(fa[y][i]!=fa[x][i])
            {
                y=fa[y][i];
                x=fa[x][i];
            }

        int f=x==y?x:fa[x][0];
        cout<<ans-2*len[f]+G[f].size()<<endl;
    }
    return 0;
}

标签:P8805,100005,int,len,蓝桥,fa,depth,2022,lca
From: https://www.cnblogs.com/pure4knowledge/p/17896406.html

相关文章

  • visual Studio 2022 C++ 配置PCL库
    理论上来说,配置过程跟其他库没有什么区别,可以参考如下几篇博文1. https://blog.csdn.net/yellow_hill/article/details/1264586922. https://blog.csdn.net/syz201558503103/article/details/103892364但有个比较坑的一个点是:由于PCL第三方库的debug和Release文件都放置在一......
  • VS2022中ArcGIS Pro SDK for .NET安装和卸载指南
    VS2022中ArcGISProSDKfor.NET安装和卸载指南下载:资源下载安裝ArcGISProSDKfor.NET升级ArcGISProSDKfor.NET卸载ArcGISProSDKfor.NET使用专用图库分发适用于.NET的ArcGISProSDK概述ArcGISProSDKfor.NET提供以下3个VisualStudio扩展......
  • 解决Visual Studio 2022升级到17.8之后,Visual AssistX功能OpenCorespondingFile快捷键
    冲突的命令是:Edit.IntelliCode.APIUsageExamples,这是v17.7的:  这是17.8的:  所以,解决方法就是在新版本中,将Edit.IntelliCode.APIUsageExamples的快捷键移除,并重新为VAssistX.OpenCorespondingFile添加Alt+O的全局快捷键即可。改好后可以在VAX的菜单中看到,如果没生效,......
  • Visual Studio 2022 搞定
    第一次装这个是好久好久以前,好怀念哪个时候。。。。没什么条条框框的限制,需要啥就去电脑城买个碟就行,4块钱。今天折腾半天,终于搞定。留个记号吧。附带了专业版激活密钥,激活后即可永久免费使用,喜欢的小伙伴千万不要错过哦。(从这里低调的拿走,https://kdocs.cn/l/cixbRhgzh1pv)VisualS......
  • VS2022 拿去用吧
    还是大二的时候就开始用这个,但居然是为了用PB,-_-||用了段时间换成了C#,依稀还记得大佬们纠正我的读法,别读C井,应该读C夏普。。。安装过程其实也没啥,就是关键Key得花时间找,我好不容易搞定了,留个记号(从这里默默拿走,低调使用 https://kdocs.cn/l/cixbRhgzh1pv)界面也和原来不太一样。中......
  • Visual Studio2022激活教程
    Visual Studio2022激活教程Microsoft Visual Studio 2022(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包......
  • 12.9 蓝桥杯 huffuman树c语言
    今天学习了蓝桥杯的huffuman树,总结如下:问题描述Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。给出一列数{pi}={p0,p1,…,pn-1},用这列数构造Huffman树的过程如下:1.找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加......
  • CSP-J2022逻辑表达式(expr)
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintMAXN=1e6;structnode{   charv;   intl,r;};vector<node>g(MAXN);intbuild_tree(stringsl){   intlast=1;   stack<int>st;   for(inti=0;i<......
  • Ubuntu 2022 安装asp.net core
    首先明确,我们不需要安装SDK,而是只安装runtime就够了。而如果是runtime,则又分为几种情况:1. ASP.NETCore运行时8.0.0(最终实际安装的)ASP.NET核心运行时使你能够运行现有的Web/服务器应用程序。在Windows上,我们建议安装托管捆绑包,其中包括.NET运行......
  • P8614 [蓝桥杯 2014 省 A] 波动数列
    这道题的精髓在于DP公式的推理#include<iostream>#include<stdio.h>#include<algorithm>#include<cstring>usingnamespacestd;constintN=1005,mod=100000007;intn,s,a,b;intdp[N*N];intmain(){cin>>n>>s......