首页 > 其他分享 >CF685B Kay and Snowflake

CF685B Kay and Snowflake

时间:2024-08-08 10:29:05浏览次数:10  
标签:sz 结点 子树 int head CF685B ans Kay Snowflake

思路

  1. 从下往上处理每个子树的重心。
  2. 对于任意点 \(u\),其所在子树的中心一定在 \(u\) 和 \(ans[to]\) 之间,\(ans[to]\) 是重儿子 \(to\) 的重心结点。
  3. 对于任意一点 \(u\),其所在子树的重心深度一定不大于 \(ans[to]\)。

image

代码

假设一个结点 \(u\) 的子树大小为 \(sz[u]\)。

对于 \(u\),我们从它的重儿子结点的答案结点开始向上跳,直到跳到的点 \(p\) 的子树大小 \(sz[p]\) 的两倍大于 \(u\) 的子树大小,这时 \(sz[u] - sz[p] < \dfrac{sz[u]}{2}\), \(u\) 的每一个子树大小也不可能超过 \(\dfrac{sz[u]}{2}\)。

所以 \(p\) 就是 \(u\) 的重心结点。

#include <bits/stdc++.h>

using namespace std;

const int N = 300010;

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

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 n, q, sz[N], son[N], ans[N], fa[N];

void dfs(int u) {
    sz[u] = 1;                  // 子树大小
    for (int i = head[u]; i; i = e[i].next) {
        int to = e[i].to;
        fa[to] = u;             // 父亲结点
        dfs(to);
        sz[u] += sz[to];
        if (sz[son[u]] < sz[to]) son[u] = to;// 重儿子
    }

    if (!head[u]) {             // 叶子结点
        ans[u] = u;
        return;
    }

    int p = ans[son[u]];
    while (sz[p] * 2 <= sz[u]) p = fa[p];
    ans[u] = p;
}

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

    cin >> n >> q;
    for (int i = 2; i <= n; i++) {
        int fa;
        cin >> fa;
        add(fa, i);
    }

    dfs(1);

    while (q--) {
        int x;
        cin >> x;
        cout << ans[x] << '\n';
    }
    return 0;
}

标签:sz,结点,子树,int,head,CF685B,ans,Kay,Snowflake
From: https://www.cnblogs.com/Yuan-Jiawei/p/18348349

相关文章

  • 通过 python 连接到 Snowflake 时出错“UnpicklingError: invalid load key, '\x00'
    我在使用snowflake.connector.connect通过python连接到snowflake时遇到以下错误importsnowflake.connector#pipinstallsnowflake-connector-python#iamgettingtheenvfrom.envfileistoredlocallycnx=snowflake.connector.connect(user=os.getenv('USER'),pass......
  • 使用snowflake.connector 3.0.3上的密钥对从python连接到snowflake
    我正在尝试使用Snowflake.connector包从我的Python代码连接到Snowflake。不幸的是,由于遗留代码,我只能在python3.7.3上使用Snowflake连接器版本3.0.3,并且无法升级我确实设法从我自己的计算机进行连接,使用:con=Snowflake.connector。连接(...私有密钥文件=......
  • 分布式ID:SnowFlake 雪花算法 Go实现
    分布式ID特性:趋势有序性(作为数据库主键时,顺序IO相较随机IO更友好)较UUID更短(占用更小的存储,只占64bit)其它(略)64bit构成:时间偏移(42bit) |数据中心ID(5bit)|节点ID(5bit)|序号(12bit)可按需自定义调整某部分的bit长度,比如把节点ID改为3bit 时间偏移:当前时间-初......
  • Snowflake 分布式id生成器--生成唯一ID
    在Snowflake算法中,通常包含以下几个部分来构造一个唯一的ID:时间戳(Timestamp):占据了64位ID中的高41位,用来表示生成ID的时间。通过时间戳的递增,保证了生成的ID是递增且唯一的。数据中心ID(DataCenterID):用于标识不同的数据中心,通常占据了5位。机器ID(Worker......
  • snowflake算法时钟回拨问题: 基于逻辑时钟解决方案
    snowflake算法时钟回拨问题:基于逻辑时钟解决方案问题时间的生成完全依赖于本地时钟,在开启NTP协议的情况下,可能出现时钟回拨现象,此时服务不可用为了防止ID被顺序破解,通常自增值不会递增1,可以更加随机的添加递增值解决方案我们需要知道,时钟回拨问题是一个对......
  • snowflake算法时钟回拨问题: 基于逻辑时钟解决方案
    snowflake算法时钟回拨问题:基于逻辑时钟解决方案问题时间的生成完全依赖于本地时钟,在开启NTP协议的情况下,可能出现时钟回拨现象,此时服务不可用为了防止ID被顺序破解,通常自增值不会递增1,可以更加随机的添加递增值解决方案我们需要知道,时钟回拨问题是一个对......
  • snowflake算法时钟回拨问题: 基于逻辑时钟解决方案
    snowflake算法时钟回拨问题:基于逻辑时钟解决方案问题时间的生成完全依赖于本地时钟,在开启NTP协议的情况下,可能出现时钟回拨现象,此时服务不可用为了防止ID被顺序破解,通常自增值不会递增1,可以更加随机的添加递增值解决方案我们需要知道,时钟回拨问题是一个对......
  • nodejs雪花ID算法(SnowflakeID)
    前言项目中常使用的三种id类型,分别是自增id、uuid、雪花id,这三种各有优劣。本篇主要实现nodejs中snowflake算法的代码。一、Snowflake实现这里需要加入big-integer的模块,下载npminstall--save big-integervarSnowflake=(function(){functionSnowflake(_......
  • Snowflake算法生成Id
    网上大部分C#写的都有点乱糟糟,我简化了一下:usingSystem;namespacexxx{///<summary>///Id生成类///</summary>classSnowflake{privateconststringLOCK_OBJ="76003AEB-E3F9-460A-BD31-D9AE9E7684C0";privatecon......
  • CF1846E2 Rudolf and Snowflakes (hard version) 题解
    题意:\(T\)\((\)\(1\)\(\le\)\(T\)\(\le\)\(10^4\)\()\)组询问:是否存在一个满\(k\)(\(k\)\(\ge\)\(2\)\()\)叉树节点数恰好为\(n\)\((\)\(1\)\(\le\)\(n\)\(\le\)\(10^{18}\)\()\),且深度\(depth\)至少为\(2\)。思路:满$k$......