数据结构_Summary

问题描述

可怜的 Bibi 丢了好几台手机以后,看谁都像是小偷,他已经在小本本上记
下了他认为的各个地点的小偷数量。
现在我们将 Bibi 的家附近的地形抽象成一棵有根树。 每个地点都是树上的
一个节点,节点上都标注了 Bibi 心中该地点的小偷数量。现在 Bibi 告诉你一个
节点 k,请你求出以该节点为根的子树中小偷数量的总和,以及子树中小偷最多
的节点的小偷数量。


★数据输入
输入第一行为一个正整数 n1≤n≤100000) 表示树的节点数目,树根的编号
总是为 1,且没有小偷。
接下来 n-1 行, 每行两个正整数 px1≤x≤100)。 代表编号为 i 的节点的父
亲节点 p 和该节点的小偷数量 x。 数据保证输入的 p 小于当前的 i。 这里的 i 2
依次数到 n
n+1 行一个整数 m1≤m≤n), 表示询问组数。
n+2 行有 m 个整数,每个整数 ki1≤ki≤n) 代表该组询问中的节点 k


★数据输出
输出 m 行, 每行两个整数,代表以询问节点为根的子树中小偷数量的总和,
以及子树中小偷最多的节点的小偷数量。

输入示例 输出示例
3
1 56
1 82
1 1
138 82



思路

  (1)这题可以用数来暴力做,用vector<>来存子节点的位置。

    因为vector每次满都在开双倍空间,可能会占用较多空间,在移动数据上也会消耗更多时间

    理论上因该是可行的,但是不知道是OJ使用vc6的原因还是vector开了过大空间,测试时有一个点RE

  (2)用结构体数组,存好数据够从右向左遍历,将值加到对应父节点上

 

code

  (1)使用vector,一个RE(不知道怎么死的)

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#include <vector>

struct Node
{
    Node():num(0),ans_sum(0),ans_max(0){}
    int num;
    int ans_sum;
    int ans_max;
    vector<int> child;    
};

Node *arr = NULL;

int dfs(int index) // return sum of children
{
    arr[index].ans_sum = arr[index].num;
    arr[index].ans_max = arr[index].num;
    if(arr[index].child.empty())
    {
        
    }
    else
    {
        int i,tmp;
        for(i=0;i<arr[index].child.size();i++)
        {
            arr[index].ans_sum += dfs(arr[index].child[i]);
            tmp = arr[arr[index].child[i]].ans_max;
            if(tmp>arr[index].ans_max) arr[index].ans_max = tmp;
        }
    }
    return arr[index].ans_sum;
}

int main()
{
    int i,j;
    int n,p,x,m,k;
    scanf("%d",&n);
    arr = new Node[n+1];//should not use malloc
    for(i=2;i<=n;i++)
    {
        scanf("%d %d",&p,&x);
        arr[p].child.push_back(i);
        arr[i].num = x;
    }
    dfs(1);
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d",&k);
        printf("%d %d\n",arr[k].ans_sum,arr[k].ans_max);
    }
    
    delete[] arr;
    return 0;
}

 

  (2)使用结构体数组,AC

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Node
{
    int sum;
    int max;
    int fa;//father 
};

int main()
{
    int n;
    scanf("%d",&n);
    Node *p = (Node *)malloc(sizeof(Node)*(n+1));
    memset(p,0,sizeof(Node)*(n+1));
    //-----------------------------------------------
    int i,j,index;
    for(i=2;i<=n;i++)
    {
        scanf("%d %d",&p[i].fa,&p[i].sum);
        p[i].max = p[i].sum;
    }
    for(i=n;i>1;i--)
    {
        p[p[i].fa].sum+=p[i].sum;
        p[p[i].fa].max = p[i].max > p[p[i].fa].max ? p[i].max : p[p[i].fa].max;
    }
    scanf("%d",&j);
    for(i=1;i<=j;i++)
    {
        scanf("%d",&index);
        printf("%d %d\n",p[index].sum,p[index].max);
    }
    //-----------------------------------------------
    free(p);
    return 0;
}

 

转载于:https://www.cnblogs.com/cbattle/p/7790381.html

### stat_summary 函数概述 `stat_summary()` 是 `ggplot2` 中的一个重要函数,用于对数据进行汇总并将其结果显示在图形中。它允许用户通过指定不同的汇总函数来计算统计数据,并将这些统计数据显示为几何对象(如点、线条或文本)。该函数的主要用途是对分组后的数据应用自定义的统计摘要。 其基本语法如下: ```r stat_summary(mapping = NULL, data = NULL, geom = "pointrange", fun.data = NULL, fun.y = NULL, fun.ymax = NULL, fun.ymin = NULL, fun.args = list(), ...) ``` #### 参数说明 - **mapping**: 定义 aesthetic 映射。 - **data**: 数据框,默认继承父级 ggplot 的数据。 - **geom**: 指定使用的几何对象类型(默认为 `"pointrange"`)。 - **fun.data**: 提供一个返回多个值的函数,通常是一个列表结构的数据摘要函数。 - **fun.y**, **fun.ymax**, **fun.ymin**: 单独提供最小值、最大值和中间值的函数。 - **fun.args**: 向上述函数传递额外参数的列表。 - **...**: 其他传递给层的参数。 --- ### 示例代码解析 以下是一些常见的 `stat_summary()` 使用场景及其对应的代码实现。 #### 场景一:显示每组的样本数量 此功能可以通过设置 `fun.data = "n"` 来实现,其中 `n` 表示样本的数量[^1]。 ```r library(ggplot2) data(mtcars) p <- ggplot(mtcars, aes(x = factor(cyl), y = mpg)) p <- p + geom_point() p <- p + stat_summary( fun.data = "n", geom = "text", vjust = -1, aes(label = ..n..), size = 3 ) print(p) ``` 在此例子中,`factor(cyl)` 将 `cyl` 转换为因子变量以便按组分类,而 `aes(label = ..n..)` 则动态生成标签以展示每组中的样本数目。 --- #### 场景二:添加均值标记到箱线图 可以利用 `stat_summary()` 添加平均值或其他统计量作为附加信息到现有图表上[^4]。 ```r # 创建数据集 names <- c(rep("A", 20), rep("B", 8), rep("C", 30), rep("D", 80)) value <- c(sample(2:5, 20, replace = TRUE), sample(4:10, 8, replace = TRUE), sample(1:7, 30, replace = TRUE), sample(3:8, 80, replace = TRUE)) data <- data.frame(names, value) # 绘制带有均值点的箱线图 p <- ggplot(data, aes(x = names, y = value, fill = names)) + geom_boxplot(alpha = 0.7) + stat_summary(fun = "mean", geom = "point", shape = 20, size = 2.5, color = "red", fill = "red", alpha = 0.7) + theme(legend.position = "none") + scale_fill_brewer(palette = "Accent") print(p) ``` 这里使用了 `stat_summary()` 配合 `fun = "mean"` 计算各组的均值,并用红色圆圈表示出来。 --- #### 场景三:绘制误差棒 (Error Bars) 当需要表现数据分布的同时加入置信区间或者标准差时,可采用 `stat_summary()` 结合特定的几何对象完成这一目标[^3]。 ```r set.seed(123) df <- data.frame(group = rep(c("G1", "G2"), each = 10), values = rnorm(20, mean = 50, sd = 10)) p <- ggplot(df, aes(x = group, y = values)) + stat_summary(fun.data = mean_sdl, fun.args = list(mult = 1), geom = "crossbar", width = 0.5) + stat_summary(fun.y = mean, geom = "point", color = "blue", size = 3) print(p) ``` 在这个案例里,`mean_sdl` 自动计算均值以及上下限的标准偏差范围;随后分别用交叉条 (`crossbar`) 和蓝点标注结果。 --- ### 总结 `stat_summary()` 是一种灵活且强大的工具,在数据分析可视化的流程中有广泛的应用价值。无论是简单的计数还是复杂的统计推断,都可以借助这个函数轻松达成目的。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值