首页 > 其他分享 >P3398 仓鼠找 sugar

P3398 仓鼠找 sugar

时间:2024-08-09 09:16:21浏览次数:6  
标签:dep idx int sugar fa lca P3398 仓鼠 dis

题意

判断树上两条路径是否相交。

思路

可以根据距离进行判断。

如果 \(dis(u, v) = dis(lca(g, t), u) + dis(lca(g, t), v)\),说明 \(g\) 和 \(t\) 的 \(lca\) 在 \(u\) 到 \(v\) 的路径上,两条路径相交。

如果 \(dis(g, t) = dis(lca(u, v), g) + dis(lca(u, v), t)\),说明 \(u\) 和 \(v\) 的 \(lca\) 在 \(u\) 到 \(v\) 的路径上,两条路径相交。

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

struct edge {
    int to, next;
} e[N * 2];

int head[N], idx = 1;

void add(int u, int v) {
    idx++, e[idx].to = v, e[idx].next = head[u], head[u] = idx;
}

int fa[20][N], dep[N];
int n, q;

void dfs(int u, int f) {
    fa[0][u] = f;
    dep[u] = dep[f] + 1;
    for (int i = head[u]; i; i = e[i].next) {
        int to = e[i].to;
        if (to == f) continue;
        dfs(to, u);
    }
}

void initf() {
    for (int j = 1; j < 20; j++) {
        for (int i = 1; i <= n; i++) {
            fa[j][i] = fa[j - 1][fa[j - 1][i]];
        }
    }
}

int lca(int u, int v) {
    if (dep[u] < dep[v]) swap(u, v);

    for (int i = 19; i >= 0; i--) {
        if (dep[fa[i][u]] >= dep[v]) u = fa[i][u];
    }

    if (u == v) return u;

    for (int i = 19; i >= 0; i--) {
        if (fa[i][u]!= fa[i][v]) u = fa[i][u], v = fa[i][v];
    }
    return fa[0][u];
}

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> q;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        add(u, v), add(v, u);
    }

    dfs(1, 0);
    initf();

    while (q--) {
        int u, v, g, t;
        cin >> u >> v >> g >> t;
        if (dis(u, v) == dis(lca(g, t), u) + dis(lca(g, t), v)) cout << "Y\n";
        else if (dis(g, t) == dis(lca(u, v), g) + dis(lca(u, v), t)) cout << "Y\n";
        else cout << "N\n";
    }
    return 0;
}

标签:dep,idx,int,sugar,fa,lca,P3398,仓鼠,dis
From: https://www.cnblogs.com/Yuan-Jiawei/p/18350139

相关文章

  • 【LCA 树上两点的距离 判定点是否在某条边中】洛谷P3398 仓鼠找sugar
    题目链接:P3398仓鼠找sugar-洛谷|(luogu.com.cn)题目大意:判定一棵树上的两条边是否相交Tag:[LCA][树上两点间距离的计算][如何判断与点在某条路径上]思路:\[\begin{align}&1.建图\\&2.\text{dfs}然后\计算出每个点的深度和计\text{anc}(i,j)\\&3.根据树上路径......
  • ORM之SqlSugar简单示例
    示例结构 下面给出示例代码,安装编码框架可扩展IDal接口定义namespaceORMRepository{///<summary>///数据库访问接口///</summary>///<typeparamname="T"></typeparam>publicinterfaceIDal<T>{///<summary&......
  • SqlSugar 多数据源的简单封装
    参考SqlSugar的官网文档,我自己封装了一个支持多数据库的UnitOfWork的SqlSugar封装类,直接使用SqlSugar的仓储操作如下:///<summary>///数据库实例基类///</summary>publicabstractclassBaseDbClient{///<summary>///获取数据库客户端实例......
  • Happy Sugar Life,but 2.73 kb
    \(\text{polylog}\)的感觉太难写了,那么考虑分块,先记询问的序列限制为\([l,r]\),值域限制为\([x,y]\),一个支配对为两个部分。散块内部。散块对散块。整块内部。整块对整块。散块对整块。同样是\(5\)种贡献。可以发现贡献\(2,5\)的序列不交,且两个部分一定有一个的长......
  • luoguP3398 仓鼠找 sugar
    思路图论,最简单的解法:LCA加路径长度判断不等式代码#include<bits/stdc++.h>usingnamespacestd;constintN=100010;intf[N][25],d[N],dis[N],T,n,m,tot,t,ver[2*N],next1[2*N],head[N];queueq;voidadd(intx,inty){ver[++tot]=y;next1[tot]......
  • 使用SqlSugar操作MySQL/SQL Server数据库
    一、框架简介SqlSugar 是一款老牌.NET开源ORM框架,由果糖大数据科技团队维护和更新,开箱即用最易上手的ORM 优点:【生态丰富】【高性能】【超简单】【功能全面】【多库兼容】【适合产品】 二.SqlSugar连接MySQL数据库publicclassMySqlCNHelper:Singleton......
  • SQLSugar 基本语法+数据库读写分离
    面向对象的操作数据库,相比EFCore、Dapper等其他ORM框架性能支持性能轻便快捷,数据库的读写分离能大大减轻数据库的压力一、NuGet下载安装SqlSugarCore二、实例化SqlSugarCore---包含数据库链接---指定数据库类型---增删改查,上代码这里演示使用控制台程序usingSqlSugar;......
  • ORM - SqlSugar
    //SqlSugarHelper.DemoDbContext.GenerateModels();varlist=SqlSugarHelper.DemoDbContext.Query<ORMClsLib.dbo.DemoEntity>();varitem=newORMClsLib.dbo.DemoEntity(){operatorName="test",};SqlSugarHelper.DemoDbContext.InsertOrUpdat......
  • sqlsugar 分表
    一、首字母分表安装hyjiacan.pinyin4net>dotnetaddpackagehyjiacan.pinyin4net--version4.1.1创建分表服务///<summary>///Apricot分表///</summary>publicclassApricotSplitTableService:ISplitTableService{///<summary>///sqlsugar......
  • SqlSugar操作Sqlite数据库
    SqlSugar操作Sqlite数据库SqlSugar官网.netcore和.net5/.net6/.net7/.net8/.net9/.net10  安装SqlSugarCore。netframework4.6+   安装SqlSugar。以下代码都在一个SqlSugarMethod类中。获得数据库对象:  这里要注意的是FilePath路径为生成程序的目录\bin\Debug\ne......