我现在爱死树链剖分了

题目

具体分析的话在洛谷blog

这里只是想放一下改完之后的代码

多了一个son数组少了一个for

少了找size最大的儿子的for

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = ;
int n, q, head[N], cnt, dad[N], top[N], size[N], deep[N], son[N];
struct edge{
int next, to;
}e[N << ];
int read() {
int s = , w = ;
char ch = getchar();
while(!isdigit(ch)) {if(ch == '-') w = -;ch = getchar();}
while(isdigit(ch)) {s = s * + ch - '';ch = getchar();}
return s * w;
}
void add(int x, int y) {
e[++cnt].next = head[x];
e[cnt].to = y;
head[x] = cnt;
}
void dfs(int now) {
size[now] = ;
deep[now] = deep[dad[now]] + ;
for(int i = head[now]; i; i = e[i].next)
if(e[i].to != dad[now]) {
dad[e[i].to] = now, dfs(e[i].to), size[now] += size[e[i].to];
if(size[e[i].to] > size[son[now]]) son[now] = e[i].to;
}
}
void dfs1(int now) {
if(!top[now]) top[now] = now;
if(son[now]) top[son[now]] = top[now], dfs1(son[now]);
for(int i = head[now]; i; i = e[i].next)
if(e[i].to != dad[now] && e[i].to != son[now])
dfs1(e[i].to);
}
int lca(int x, int y) {
while(top[x] != top[y]) {
if(deep[top[x]] < deep[top[y]]) swap(x, y);
x = dad[top[x]];
}
return deep[x] > deep[y] ? y : x;
}
int main () {
n = read();q = read();
for(int i = , u, v; i < n; i++) {
u = read();v = read();
add(u, v), add(v, u);
}
dfs();
dfs1();
for(int i = , a, b, c, d; i <= q; i++) {
a = read(), b = read(), c = read(), d = read();
int fir = max(deep[lca(a, b)], deep[lca(c, d)]);
int sec = max(max(deep[lca(a, c)], deep[lca(a, d)]), max(deep[lca(b, c)], deep[lca(b, d)]));
if(sec >= fir) puts("Y");
else puts("N");
}
return ;
}

谢谢收看, 祝身体健康!

洛谷p3398仓鼠找suger题解的更多相关文章

  1. 洛谷 P3398 仓鼠找sugar 题解

    每日一题 day44 打卡 Analysis 首先有一个结论:先找 p1=(a,b),p2=(c,d) 的LCA的深度,在与(a,c),(a,d),(b,c),(b,d)中最深的LCA n的深度比较, ...

  2. 洛谷P3398 仓鼠找suger

    传送门啦 思路: 那么从 $ A $ 到 $ B $ 可以分解成 先从 $ A $ 到 $ X $ 再从 $ X $ 到 $ B $ ... 另一个同理 假设能相遇 那么 要么在 $ A $ 到 $ ...

  3. 洛谷 P3398 仓鼠找sugar 解题报告

    P3398 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  4. 洛谷P3398 仓鼠找sugar [LCA]

    题目传送门 仓鼠找sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而 ...

  5. 洛谷P3398 仓鼠找sugar

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  6. 洛谷 P3398 仓鼠找sugar —— 树链剖分

    题目:https://www.luogu.org/problemnew/show/P3398 树链剖分一下,路径就变成线段树上的几个区间: 两条路径相交就是线段树上有区间相交,所以在相应位置打个标记, ...

  7. 洛谷——P3398 仓鼠找sugar

    https://www.luogu.org/problem/show?pid=3398#sub 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴 ...

  8. 洛谷 [P3398] 仓鼠找sugar

    树剖求LCA 我们可以发现,两条路径ab,cd相交,当且仅当 dep[lca(a,b)]>=dep[lca(c,d)]&(lca(lca(a,b),c)==lca(a,b)||lca(l ...

  9. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

随机推荐

  1. Stopwatch 类用于计算程序运行时间

    Stopwatch 类 命名空间:System.Diagnostics.Stopwatch 实例化:Stopwatch getTime=new Stopwatch(); 开始计时:getTime.St ...

  2. js组件

    最近学习了一下js组件相关知识,但找到的资料比较少,一知半解,先做个简单的笔记吧. 首先定义一个类,可以在里面添加方法: //这是个下拉框组件,放在select.js里 var tree = { tr ...

  3. DevExpress之GridControl控件小知识

    DevExpress之GridControl控件小知识 一.当代码中的DataTable中有建数据关系时,DevExpress 的 GridControl 会自动增加一个子视图 .列名也就是子表的字段 ...

  4. Elasticsearch DSL 常用语法介绍

    课程环境 CentOS 7.3 x64 JDK 版本:1.8(最低要求),主推:JDK 1.8.0_121 Elasticsearch 版本:5.2.0 相关软件包百度云下载地址(密码:0yzd):h ...

  5. Java自学-接口与继承 重写

    Java 重写方法 子类可以继承父类的对象方法 在继承后,重复提供该方法,就叫做方法的重写 又叫覆盖 Override 步骤 1 : 父类Item 父类Item有一个方法,叫做effect packa ...

  6. 看年薪50W的架构师如何手写一个SpringMVC框架

    前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...

  7. Objective-C之深浅拷贝

    深拷贝(指针和指向都改变) , 浅拷贝(指针改变,指向不变) NSString *s1 = @"string"; NSLog(@"s1 : %p, %p, %@" ...

  8. CRM BP函数

    REPORT ZCRM_BP_TEST. """""""""""""& ...

  9. 024:Java流实现Shell:cat 1.log | grep a | sort | uniq -c | sort -rn

    本文阅读时间大约13分钟(本文实践性很强,建议pc端阅读,最好亲自实践). 参考答案 这个问题考察的是对Linux命令的熟悉程度,以及对Java中集合操作的综合运用,自从转到Java 8以后,我就一直 ...

  10. csv、json 文件读取

    1.CSV 文件存储 1.1 写入 简单示例 import csv with open('data.csv', 'a') as csvfile: writer = csv.writer(csvfile ...