首页 > 其他分享 >P4320 道路相遇

P4320 道路相遇

时间:2024-04-22 16:55:36浏览次数:22  
标签:int ll 相遇 maxn low P4320 道路 now mod

链接:https://www.luogu.com.cn/problem/P4320

圆方树基础题

实际上就是问给定起点和终点的一条路径上的割点数量。那么建立好圆方树以后,割点的相邻两个点一定是方点,圆点到圆点之间的距离一定是偶数,于是可以知道一条路径中的割点数量= 路径总长度/2 向下取整。那么这道题就转化成建立圆方树之后求路径长度即可。

注意几个细节:因为题目要求起点和终点也要算进去,不要忘了+2.
代码中求LCA用的是树剖。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define mp make_pair
#define ull unsigned long long
#define all(x) x.begin(), x.end()
//__builtin_count()
typedef array<int,2> pr;
const unsigned int mask =  (chrono::steady_clock::now().time_since_epoch().count());
inline int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}//gcd(a,b)=gcd(a,b-a)(b>a);
inline int lcm(int a, int b){return a / gcd(a, b) * b;}//lcm(n,m)=n*m/gcd(n,m)
const ll mod = 998244353;
const int inv2 = (mod+1)/2;
#define lson rt<<1
#define rson rt<<1|1
int addmod(int &x, int y) {x = (x + y >= mod ? x + y - mod : x + y);return 1;}
ll qpow(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll inv(int x){return qpow(x,mod-2);}
inline void read(__int128 &x)
{
    char c; while(!((c=getchar())>='0'&&c<='9'));
    x=c-'0';
    while((c=getchar())>='0'&&c<='9') (x*=10)+=c-'0';
}
int o[200010],on;
inline void output(__int128 x)
{
    on=0;
    while(x) o[++on]=x%10,x/=10;
    for(int i=on;i>=1;i--) cout<<o[i];
}
const int maxn = 1000010;
vector<int> vec[maxn],H[maxn];
int n,m;
int dfn[maxn],low[maxn],idx,fa[maxn];
int dep[maxn],siz[maxn],son[maxn],top[maxn];
int tot;
stack<int> st;
void tarjan(int u)
{
    dfn[u]=low[u]=++idx;
    st.push(u);
    for(auto v:vec[u])
    {
        if(!dfn[v])
        {
            tarjan(v);
            low[u]=min(low[u],low[v]);
            if(dfn[u]==low[v])
            {
                tot++;
                while(1)
                {
                    int x=st.top();
                    st.pop();
                    H[tot].push_back(x);
                    fa[x]=tot;
                    if(x==v) break;
                }
                H[u].push_back(tot);
                fa[tot]=u;
            }
        }
        else low[u]=min(low[u],dfn[v]);
    }
}
void dfs1(int now)
{
    dep[now]=dep[fa[now]]+1;
    siz[now]=1;
    int maxx=-1;
    for(auto to:H[now])
    {
        if(to!=fa[now])
        {
            fa[to]=now;
            dfs1(to);
            siz[now]+=siz[to];
            if(siz[to]>maxx)
            {
                maxx=siz[to];
                son[now]=to;
            }
        }
    }
}
void dfs2(int now,int t)
{
    top[now]=t;
    if(!son[now]) return ;
    dfs2(son[now],t);
    for(auto to:H[now])
    {
        if(to==fa[now]||to==son[now])
        {
            continue;
        }
        dfs2(to,to);
    }
}
int lca(int x,int y)
{
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]])
        {
            swap(x,y);
        }
        x=fa[top[x]];
    }
    if(dep[x]>dep[y])
    {
        swap(x,y);
    }
    return x;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        vec[u].push_back(v);
        vec[v].push_back(u);
    }
    tot=n;
    // for(int i=1;i<=n;i++)
    // {
    //     if(!dfn[i]) tarjan(i);
    // }//这样写也是可以的
    tarjan(1);
    dfs1(1);
    dfs2(1,1);
    int q;
    cin>>q;
    while(q--)
    {
        int u,v;
        cin>>u>>v;
        cout<<(dep[u]+dep[v]-2*dep[lca(u,v)]+2)/2<<'\n';
    }
}

标签:int,ll,相遇,maxn,low,P4320,道路,now,mod
From: https://www.cnblogs.com/captainfly/p/18150970

相关文章

  • C++奇迹之旅:我与类和对象相遇
    文章目录......
  • [附源码]JAVA计算机毕业设计道路桥梁工程知识文库系统(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息化技术的快速发展,传统的道路桥梁工程知识管理方式已经无法满足现代工程领域的实际需求。传统的知识管理多依赖于纸质文档和人工整理,这种方式......
  • [数据集][目标检测]道路行人车辆坑洞锥形桶检测数据集VOC+YOLO格式6275张4类别
    数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):6275标注数量(xml文件个数):6275标注数量(txt文件个数):6275标注类别数:4标注类别名称:["car","person","pothole","trafficcone......
  • [集训队互测 2023] R9T2 道路建设
    为什么QOJ上其他人都爆标还原了整颗树,而只有我傻傻改标算。是不是做这道题的除了我都有脑子。感觉像是完全对着硬idea出的,所以正常人做题想法根标方向完全不一样,但是涉及到的技巧都还是挺有用的哈!题意大概是有一颗\(2n\)个点的树,你得知了前\(n\)个点构成的虚树形态,然......
  • lc2940 找到Alice和Bob可以相遇的建筑
    给出数组H[n]和多组询问Q[m],其中Q[i]={a[i],b[i]}表示查询最靠左的下标j,使得a[i]和b[i]都可以移到j处。从x处能移到y处的前提是x<y并且H[x]<H[y]。1<=n<=5e4;1<=H[i]<=1e9;1<=m<=5e4;0<=a[i],b[i]<=n-1相当于找最靠左的上限,可以用st表或线段树来维护区间最大值,然后二分找最左......
  • 自动驾驶建图--道路边缘生成方案探讨
    自动驾驶建图--道路边缘生成方案探讨一、背景对于自动驾驶来说,建图是必不可少的,目前主流厂商技术都在从HD到"无图"进行过渡筹备中,不过想要最终实现真正的"无图"还是有很长的一段路要走。对于建图来说,包含了很多的道路元素,车道线,停止线,斑马线,导流属性,道路边缘以及中心线(包含引......
  • JAVA实战开源项目:城市桥梁道路管理系统(Vue+SpringBoot)
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块三、系统展示四、核心代码4.1查询城市桥梁4.2新增城市桥梁4.3编辑城市桥梁4.4删除城市桥梁4.5查询单个城市桥梁五、免责说明一、摘要1.1项目介绍基于Vue+SpringBoot+MySQL的城市桥梁道路管理系统,支持管......
  • Python 分析— 使用 LeuvenMapMatching 包进行地图匹配用于道路导航
        在道路导航中,我们有了街道网络地图。轨迹/GPS数据必须与街道相匹配才能进行导航,因为GPS读数提供纯粹的纬度和经度坐标,但我们想知道车辆行驶的具体道路。        我首先尝试了一种简单的方法来匹配点,将每个点独立地匹配到最近的路段。如果没有道路,只需......
  • 道路交通安全法实施条例-学习笔记
    1.初次申领机动车号牌、行驶证的,应当向机动车所有人住所地的公安机关交通管理部门申请注册登记。 申请机动车注册登记,应当交验机动车,并提交以下证明、凭证: (一)机动车所有人的身份证明; (二)购车发票等机动车来历证明; (三)机动车整车出厂合格证明或者进口机动车进口凭证;......
  • 2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系, “y下“和“y上“表示一条无限延伸
    2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系,"y下"和"y上"表示一条无限延伸的道路,"y下"表示这个道路的下限,"y上"表示这个道路的上限,给定一批长方形,每一个长方形有(x1,x2,y1,y2),4个坐标可以表示一个长方形,判断这条道路整体是不是可以走通的。以下为正式题目:图片在计算......