【Codeforces-208E】Blood Cousins(dsu on tree+离线)

AltiumDesigner.zip 立即下载

Polycarpus got hold of a family relationship tree. The tree describes family relationships of n people, numbered 1 through n. Each person in the tree has no more than one parent.

Let’s call person a a 1-ancestor of person b, if a is the parent of b.

Let’s call person a a k-ancestor (k > 1) of person b, if person b has a 1-ancestor, and a is a (k - 1)-ancestor of b’s 1-ancestor.

Family relationships don’t form cycles in the found tree. In other words, there is no person who is his own ancestor, directly or indirectly (that is, who is an x-ancestor for himself, for some x, x > 0).

Let’s call two people x and y (x ≠ y) p-th cousins (p > 0), if there is person z, who is a p-ancestor of x and a p-ancestor of y.

Polycarpus wonders how many counsins and what kinds of them everybody has. He took a piece of paper and wrote m pairs of integers vi, pi. Help him to calculate the number of pi-th cousins that person vi has, for each pair vi, pi.

Input
The first input line contains a single integer n(1 ≤ n ≤ 105)n (1 ≤ n ≤ 10^5)n(1 ≤ n ≤ 105) — the number of people in the tree. The next line contains n space-separated integers r1, r2, …, rn, where ri(1 ≤ ri ≤ n)r_i (1 ≤ r_i ≤ n)ri​(1 ≤ ri​ ≤ n) is the number of person i’s parent or 0, if person i has no parent. It is guaranteed that family relationships don’t form cycles.

The third line contains a single number m(1 ≤ m ≤ 105)m (1 ≤ m ≤ 10^5)m(1 ≤ m ≤ 105) — the number of family relationship queries Polycarus has. Next m lines contain pairs of space-separated integers. The i-th line contains numbers vi,pi(1 ≤ vi, pi ≤ n)v_i, p_i (1 ≤ v_i, p_i ≤ n)vi​,pi​(1 ≤ vi​, pi​ ≤ n).

Output
Print m space-separated integers — the answers to Polycarpus’ queries. Print the answers to the queries in the order, in which the queries occur in the input.

Examples
input
6
0 1 1 0 4 4
7
1 1
1 2
2 1
2 2
4 1
5 1
6 1
output
0 0 1 0 0 1 1

这个题感觉挺绕的,就是给出的查询v和p,问的是以v的第p个祖先的这个子树下,有多少个和v一样深度的点。
所以实际上知道v以后,我们只需要知道他的祖先的是哪个点,直观上可以跑个暴力,显然超时,这里就用到了dsu on tree了,那么我们还需要知道附着在某个子树下的查询有多少个,开个vector就行了。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<set>
#define ll long long
#define maxx 100005
#define INF 0x7f7f7f7f
using namespace std;
int n,m;
int head[maxx],to[maxx],_next[maxx];
int edge;
void addEdge(int x,int y)
{
    to[++edge]=y,_next[edge]=head[x],head[x]=edge;
}
vector<pair<int ,int> >q[maxx];
vector<pair<int ,int> >_q[maxx];
int son[maxx];
int deep[maxx];
int _size[maxx];
int a[maxx],cnt;
void dfs1(int u)
{
    a[++cnt]=u;
    for(int i=0;i<q[u].size();i++)
    {
        if(q[u][i].first>=cnt)_q[0].push_back(q[u][i]);
        else _q[a[cnt-q[u][i].first]].push_back(q[u][i]);//附着到某个子树的查询
    }
    _size[u]=1;
    int maxson=-1;
    for(int i=head[u];i;i=_next[i])
    {
        int v=to[i];
        deep[v]=deep[u]+1;
        dfs1(v);
        cnt--;
        _size[u]+=_size[v];
        if(maxson<_size[v])
        {
            son[u]=v;
            maxson=_size[v];
        }
    }
}
int l[maxx],r[maxx],_index;
int b[maxx];
void dfs2(int u)
{
    l[u]=++_index;
    b[_index]=deep[u];
    for(int i=head[u];i;i=_next[i])
    {
        int v=to[i];
        dfs2(v);
    }r[u]=_index;
}
int ans[maxx];
int tot[maxx];
inline void del(int u)
{
    for(int i=l[u];i<=r[u];i++)tot[b[i]]=0;
}
inline void add(int u)
{
    for(int i=l[u];i<=r[u];i++)tot[b[i]]++;
}
void dfs(int u)
{
    for(int i=head[u];i;i=_next[i])
    {
        int v=to[i];
        if(v==son[u])continue;
        dfs(v);
        del(v);
    }
    if(son[u])
    {
        dfs(son[u]);
        for(int i=head[u];i;i=_next[i])
        {
            int v=to[i];
            if(v!=son[u])add(v);
        }
    }
    if(u)
    {
        for(int i=0;i<_q[u].size();i++)
            ans[_q[u][i].second]=tot[deep[u]+_q[u][i].first]-1;
    }
    else for(int i=0;i<_q[u].size();i++)
            ans[_q[u][i].second]=0;
    tot[deep[u]]++;
}
int main()
{
    cin>>n;
    int x,y;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        addEdge(x,i);
    }
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        q[x].push_back(make_pair(y,i));
    }
    dfs1(0);
    dfs2(0);
    dfs(0);
    for(int i=1;i<m;i++)
        printf("%d ",ans[i]);
    printf("%d\n",ans[m]);
    return 0;
}

YOLO26算法日历数字识别+训练好的模型+102张数据集+pyqt可视化界面.zip 附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[数字(number)] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 97 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9156** mAP50-95 | 0.7374 Precision | 0.8626 Recall | 0.8381 train/box_loss | 0.8790 train/cls_loss | 0.7499 val/box_loss | 0.7874 val/cls_loss | 0.6025 【训练过程分析】 训练开始后,我注意到前几轮的 loss 下降特别快,这让我有点兴奋,但随着训练的深入,loss 的降幅变得不那么明显了。在训练的第 30 轮左右,val_loss 开始趋于平稳,这让我稍微放心了一些,但同时也感觉压力倍增,因为一旦训练过早平稳,就容易陷入过拟合的泥沼。经过 97 轮的磨炼,最终 mAP50 达到了 0.9156,这让我松了一口气。不过,mAP50-95 仅有 0.7374,和 mAP50 之间有明显的差距,说明模型在低置信度的检测上还需要优化。从 loss 曲线来看,训练过程总体上比较平稳,没有明显的过拟合迹象,但也让人觉得有些枯燥。我心想,要是能早点找到一个陡峭上升的训练曲线该有多好,这样至少能让人心态更积极一些。 随着训练进行到后半段,模型开始逐渐收敛,但这个过程并不是一帆风顺的。在训... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。 立即下载

相关推荐

风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真

内容概要:本文介绍了“Plecs全桥LLC谐振变换器仿真模型”这一技术资源,聚焦于隔离型全桥LLC谐振变换器的建模、仿真与参数设计,涵盖其在电力电子系统中的关键应用,如软启动、闭环控制、变频控制及效率优化等。该模型支持对LLC变换器在不同工作模式下的动态响应与性能表现进行深入研究,适用于探究谐振拓扑结构、磁性元件设计、谐振参数匹配以及先进控制策略的科研与工程实践。同时,文档配套提供了仿真模型、设计报告与计算书等完整资料,强化了其实用性与教学价值。; 适合人群:具备电力电子、自动化或电气工程等相关专业背景,从事电力电子变换器研发、系统仿真与控制算法设计的科研人员、工程师及研究生。; 使用场景及目标:①用于全桥LLC谐振变换器的建模、仿真与动态性能分析;②支持对软启动过程、闭环稳压控制、变频调谐及效率优化等核心技术的研究与教学;③为电力电子电源系统的工程设计、参数优化与控制策略验证提供高精度仿真平台。; 阅读建议:建议结合Plecs或Simulink等仿真工具进行动手实践,重点理解电路拓扑构建、谐振参数计算、控制器设计与系统稳定性分析,并配合文档中的设计报告与计算书,系统掌握从理论到仿真的完整流程。

Codeforces 246E Blood Cousins Return 树上启发式合并

E. Blood Cousins Return time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Polycarpus got hold of a family tre

J. Cole 481

国央企创新负责人如何通过平台实现科技创新资源的系统集成与高效配置?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

codeforces 246 E. Blood Cousins Return (set+dsu on the tree)

E. Blood Cousins Return time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Polycarpus got hold of a family tre

clover_hxy的博客 681

独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)

内容概要:本文介绍了“Plecs全桥LLC谐振变换器仿真模型”这一技术资源,聚焦于全桥LLC谐振变换器在电力电子系统中的建模与仿真研究。该资源提供了基于Plecs平台的高精度仿真模型,完整呈现了变换器的主电路拓扑、谐振参数设计、软开关实现机制及变频控制策略,能够有效支持对系统效率、动态响应与稳态性能的深入分析。模型充分体现了LLC谐振变换器在实现零电压开关(ZVS)、降低开关损耗和提升能量转换效率方面的优势,适用于新能源发电、储能系统及高效率电源设计等应用场景。; 适合人群:具备电力电子、自动控制及电路理论基础知识,从事电力电子变换器设计、新能源系统开发或相关领域研究的研究生、高校教师及工程技术人员。; 使用场景及目标:①用于全桥LLC谐振变换器的工作原理教学与参数设计实践;②支撑软开关特性、变频控制策略、效率优化等关键技术的仿真验证与性能评估;③作为科研项目、课程设计或毕业设计中电力电子系统仿真的核心参考模型,促进理论与工程实践的结合。; 阅读建议:建议使用者在掌握LLC谐振变换器基本工作原理的基础上,结合相关电力电子教材与Plecs软件操作指南,通过调整谐振元件参数、负载条件及控制策略进行多工况仿真,深入理解其工作机理与优化方法,并结合实验数据对比验证仿真结果的准确性。

Quartus的Signal Tap II的使用技巧

Signal Tap II全称Signal Tap II Logic Analyzer,是第二代系统级调试工具,它集成在Quartus II软件中,可以捕获和显示实时信号,是一款功能强大、极具实用性的FPGA片上调试工具软件。传统的FPGA板级调试是由外接的逻辑分析仪连接到FPGA的控制引脚,将内部引号引出至引脚I/O上,接着进行板级调试。

qq_37624854的博客 5899

Codeforces Round #130 (Div. 2) E 树上倍增 + 两次二分

E. Blood Cousins time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Polycarpus got hold of a family relationship tree. The tree desc...

OlaMins 301

CF208 E.Blood Cousins(树上启发式合并)

题目链接:CF208E Polycarpus got hold of a family relationship tree. The tree describes family relationships of n people, numbered 1 through n. Each person in the tree has no more than one parent. Let’s cal...

Gee_Zer的博客 568

【CubeMX】STM32G474 HRTIM 死区时间与互补PWM实战解析

本文深入解析STM32G474的HRTIM高分辨率定时器在互补PWM生成与死区时间配置中的应用。通过CubeMX工具详细演示时钟配置、单路PWM基础、互补输出与死区时间设置,并结合逆变器等电力电子实战案例,帮助开发者避免直通风险,优化系统性能。

efc12345678的博客 746

【VMware篇】7-通过ISO镜像升级VMware Esxi

本文主要介绍Dell服务器上安装的ESXi升级的方法之一(采用ISO升级)。

chen_yunan的博客 5516

codeforces 208 E. Blood Cousins (dsu on the tree)

E. Blood Cousins time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Polycarpus got hold of a family relationsh

clover_hxy的博客 665

想学嵌入式但没开发板?试试这个免费的STM32虚拟仿真平台(含LVGL界面教程)

本文介绍如何利用免费的STM32虚拟仿真平台学习嵌入式开发,特别适合预算有限或零硬件基础的学习者。通过详细的LVGL界面开发教程,展示虚拟仿真在嵌入式学习中的高效性和实用性,涵盖环境搭建、代码实现到实机迁移的全流程,助力快速掌握嵌入式开发核心技能。

weixin_29266647的博客 306

codeforces208E Blood Cousins

题目链接:codeforces208E 正解:$dsu$ $on$ $tree$ 解题报告:   又是一波$dsu$ $on$ $tree$咯…   $p$级$cousin$其实就是对于$x$的$p$级祖先统计一下和$x$深度相同的点的个数,链剖$+dsu$ $on$ $tree$就好咯。 //It is made by ljh2000 //有志者,事竟成,破...

dgoh41514的博客 173

前言:为什么要学习爬虫和逆向,该如何学习?

学习爬虫和逆向技术是当今数字化时代的重要技能,尤其在数据分析、安全研究、自动化工具开发等领域有广泛应用。以下是详细的学习理由、路径和方法:

数据知道的博客 1万+

【LLC快速上手系列】LLC轻载时,死区时间怎么调才对?别再傻傻乱搞了!

死区时间,就是指。如果你死区设得好,就能让开通前 ( V_DS to 0 ),完美实现!

weixin_43199439的博客 1856

【Codeforces 208E】 Blood Cousins | 倍增、dsu on a tree

题目连接:https://codeforces.com/contest/208/problem/E 题目大意: 刚开始题目读错了 真实题意: 定义一个点的第p级父亲为它的第p个父亲,每次询问一个x,有多少个点的y级父亲与x的y级父亲相同 题目思路: 其实稍微改变一下题意就好了 假设对x进行询问,首先把x的第p个父亲求出,如果没有第p个父亲,那么肯定是不可以的 如果存在第p个父亲A,那么节点就转换为了A的子树下,有多少个深度是deep[A]+p的点,这些点的个数-1就成了答案 这时候就可以静

一只酷酷光儿的博客 405

DDR5中的On-Die Termination(ODT)详解:电阻值支持及其背后的秘密

DDR5支持多档ODT电阻值,范围从40Ω到480Ω,均基于240Ω标准参考电阻RZQR_{ZQ}RZQ​。不同电阻档位对应不同的信号负载和功耗需求。校准电压点关键,常用0.8×VDD进行精准调校。CA信号间ODT匹配必须严格控制,保证命令总线稳定。选择合适的ODT值是高速内存设计中不可忽视的细节。

weixin_43199439的博客 2099

CodeForces 208 E.Blood Cousins (树上倍增+dsu on tree)

题意: 给n个点的树,定义从x点向上走k步到达的节点为x的 k层祖先。 m次查询,给出x k,问有多少个点与x具有相同的 k层祖先。 思路: 先求出x的k层祖先fa,题目转化为求以fa为根的子树下深度与x相同的节点个数,减去x本身的一个就是答案了 x的k层祖先可以用树上倍增解决 离线储存询问,问题就变成离线子树问题,用dsu on tree解决, 询问储存的方式是:二元组存储问题id和x的层数, ...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 233

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

CodeForces 246 E.Blood Cousins Return (dsu on tree+set去重)

题意: 给n个点的树,每个点有一个名字,不同的点名字可能相同 m次查询,给出x k,求以x为根的子树,深度为d[x]+k的点中有多少种不同的名字 思路: 和cf 208e差不多 离线储存询问,问题就变成离线子树问题,用dsu on tree解决, 询问储存的方式是:二元组存储问题id和x的层数, 每当统计完根为fa的子树之后,遍历以fa为根的询问,然后更新答案,具体看代码 cal函数计算的是以当前...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 292

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Blood Cousins 【CodeForces - 208E】【Dsu on Tree】

题目链接 在一个森林中,如果两个节点a和b向上的第p个祖先相同,就称他们为p代表亲。(跟日常生活中有所不同,p不一定是他们的最近公共祖先)。 给出一些询问,问v的p代表亲的数量。 我们肯定是要想办法把节点推到子树的根结点上面去,这样问题一转,就变成了求子结点的问题了,我们可以用倍增的方法,找到对应的祖先节点,然后就是我们将询问放到该节点上面来查询这棵子树即可。 时间复杂度 ...

既然弱小,就只顾变强就是了 198

Codeforces Round #130 (Div. 2) E. Blood Cousins

树上启发式合并

ACoder 195

[Codeforces208E]Blood Cousins(dsu on the tree+倍增)

题目描述传送门 题意:给出一棵家谱树,定义向上走k步到达的节点为该点的k-ancestor。每次询问与v同P-ancestor的节点有多少个。题解题目可以转化为在v的P-ancestor的子树里和v同一深度的有多少个点 用dsu on the tree搞一搞。。 倍增求出v的P-ancestor,然后对于每一个询问加一个链表,一遍dfs就行了。 注意这是一个森林 时间复杂度O(nlogn)

zyf2000 964

Codeforces208E Blood Cousins

dsu on tree 题目链接 点我跳转 题目大意 给你一片森林,每次询问一个点与多少个点拥有共同的\(K\)级祖先 解题思路 询问一个点有多少个共同的\(K\)级祖先 可以等价于问它的\(K\)级祖先有多少个深度为 \(dep + K\) 的子节点 (\(dep\)为\(K\)级祖先的深度) 那么对于每个询问要先倍增或者树链剖分求出它的\(K\)级祖先,再将询问保存在\(K\)级祖先的...

qq_38227632的博客 166

codeforces 208E Blood Cousins (dsu on tree + 倍增 )

链接:http://codeforces.com/problemset/problem/208/E 题意: 现在有若干棵树,对于每次一询问,都有一个节点 u 和一个 k  你要求出在这棵树上与u 同为k 级兄弟的节点个数,也就是与u的k级父亲是同一个父亲的,节点个数。 思路: 对于每一个节点u和k ,如果他的深度&lt;k  那么肯定是找不到的,答案为0 ,否则,我先找到的他的k级父亲,也就是...

yjt9299的博客 397

[codeforces208E]Blood Cousins(dsu on the tree+倍增)

中午有肉肉吃

薇小薇 438
上一篇: 【Codeforces-741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
下一篇: 【洛谷P3809】 【模板】后缀排序(倍增)
coldfresh
博客等级 码龄10年 107粉丝 405原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值