• 2120 -- 预警系统题解


    Description

    OiersOiers 国的预警系统是一棵树,树中有 �n 个结点,编号 1∼�1∼n,树中每条边的长度均为 11。预警系统中只有一个预警信号发射站,就是树的根结点 11 号结点,其它 �−1n−1 个结点是接收中转站
    每当有险情发生时,11 号结点就会向 �x 号结点发送预警信号,然后由 �x 号结点将预警信号传送到离 11 号结点距离为 �y 的所有结点,注意:所有传送是单向的,都是由根结点向叶子结点方向传送,请参考样例。
    你的任务是计算每次发送预警时,�x 号结点需要将预警信号传送到离 11 号结点距离为 �y 的结点个数。

    Input

    第一行一个整数 �n。
    第二行 �−1n−1 个整数 ��2,��3,⋯,���fa2​,fa3​,⋯,fan​ 描述树,整数 ���fai​ 表示结点 �i 的父亲结点为 ���(2≤�≤�)fai​(2≤i≤n)。
    第三行一个整数 �m,表示有 �m 次险情发生,需要发送 �m 次预警信号,即有 �m 次询问。
    接下来 �m 行,每行两个整数 �,�x,y。

    Output

    输出 m 行,每行一个整数,表示�x 号结点需要将预警信号传送到离 11 号结点距离为 �y 的结点个数。

    Sample Input

    7
    1 2 2 2 1 3
    4
    1 2
    5 2
    4 1
    3 5

    Sample Output

    3
    1
    0
    0

    Sample Explanation

    在第一个询问中,由 11 号结点传送到距 11 号结点距离为 22 的结点有 3,4,53,4,5 三个结点。
    在第二个询问中,由 55 号结点传送到距 11 号结点距离为 22 的结点只有 55 号自身一个结点。
    在第三个询问中,由 44 号结点传送到距 11 号结点距离为 11 的结点不存在,因为传送只能往下进行。
    在第四个询问中,由 33 号结点传送到距 11 号结点距离为 55 的结点不存在。

    Hint

    本题共 2525 个测试点,其中:
    20%20% 的数据:1≤�≤1001≤n≤100,1≤�≤101≤m≤10;
    另有 12%12% 的数据:1≤�≤1001≤n≤100,1≤�≤101≤m≤10,树为一条链;
    100%100% 的数据:2≤�≤2×1052≤n≤2×105,1≤���<�1≤fai​

    AC代码:

    1. #include
    2. using namespace std;
    3. int n,m,u,y,id,time_id,d[200009],tim_in[200009],tim_out[200009],head[200009];
    4. vector<int> v[200009];
    5. struct edge{
    6. int u,v,next;
    7. }e[400009];
    8. void add(int u,int v){
    9. e[++id]=edge{u,v,head[u]};
    10. head[u]=id;
    11. }
    12. void dfs(int u,int fa){
    13. d[u]=d[fa]+1;
    14. tim_in[u]=++time_id;
    15. v[d[u]].push_back(tim_in[u]);
    16. for(int i=head[u];i;i=e[i].next) dfs(e[i].v,u);
    17. tim_out[u]=time_id;
    18. }
    19. int main(){
    20. ios::sync_with_stdio(false);
    21. cin.tie(0);
    22. cout.tie(0);
    23. cin>>n;
    24. for(int i=2;i<=n;i++){
    25. cin>>u;
    26. add(u,i);
    27. }
    28. d[0]=-1;
    29. dfs(1,0);
    30. cin>>m;
    31. for(int i=1;i<=m;i++){
    32. cin>>u>>y;
    33. cout<<upper_bound(v[y].begin(),v[y].end(),tim_out[u]) - lower_bound(v[y].begin(),v[y].end(),tim_in[u])<<'\n';
    34. }
    35. return 0;
    36. }

    总结:

    这题得用一种叫DFS序的东西,二分求最值

  • 相关阅读:
    Win11 安装 Jira_8.0.2
    【ESP8266+TM1650时钟数码管+DS3231模块】制作网络时钟
    ubuntu下添加硬盘,分区以及自动挂载
    数据挖掘与机器学习:循环结构
    All in One SEO 插件提取中文描述过短解决方法
    《白话强化学习与python》笔记——第六章深度学习(二)
    13 套接字Socket
    一个简单的HTML网页——传统节日春节网页(HTML+CSS)
    论文解读(GSAT)《Interpretable and Generalizable Graph Learning via Stochastic Attention Mechanism》
    【Homography Estimation】《Deep Image Homography Estimation》
  • 原文地址:https://blog.csdn.net/m0_74486855/article/details/133543113