数据结构_Summary
问题描述
可怜的 Bibi 丢了好几台手机以后,看谁都像是小偷,他已经在小本本上记
下了他认为的各个地点的小偷数量。
现在我们将 Bibi 的家附近的地形抽象成一棵有根树。 每个地点都是树上的
一个节点,节点上都标注了 Bibi 心中该地点的小偷数量。现在 Bibi 告诉你一个
节点 k,请你求出以该节点为根的子树中小偷数量的总和,以及子树中小偷最多
的节点的小偷数量。
★数据输入
输入第一行为一个正整数 n(1≤n≤100000) 表示树的节点数目,树根的编号
总是为 1,且没有小偷。
接下来 n-1 行, 每行两个正整数 p, x(1≤x≤100)。 代表编号为 i 的节点的父
亲节点 p 和该节点的小偷数量 x。 数据保证输入的 p 小于当前的 i。 这里的 i 从 2
依次数到 n。
第 n+1 行一个整数 m(1≤m≤n), 表示询问组数。
第 n+2 行有 m 个整数,每个整数 ki(1≤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(),ans_sum(),ans_max(){}
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=;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+];//should not use malloc
for(i=;i<=n;i++)
{
scanf("%d %d",&p,&x);
arr[p].child.push_back(i);
arr[i].num = x;
}
dfs();
scanf("%d",&m);
for(i=;i<=m;i++)
{
scanf("%d",&k);
printf("%d %d\n",arr[k].ans_sum,arr[k].ans_max);
} delete[] arr;
return ;
}
(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+));
memset(p,,sizeof(Node)*(n+));
//-----------------------------------------------
int i,j,index;
for(i=;i<=n;i++)
{
scanf("%d %d",&p[i].fa,&p[i].sum);
p[i].max = p[i].sum;
}
for(i=n;i>;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=;i<=j;i++)
{
scanf("%d",&index);
printf("%d %d\n",p[index].sum,p[index].max);
}
//-----------------------------------------------
free(p);
return ;
}
数据结构_Summary的更多相关文章
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 深入浅出Redis-redis底层数据结构(上)
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- 算法与数据结构(八) AOV网的关键路径
上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
随机推荐
- android sdk国内服务器下载
推荐使用国内东软的服务器下载android sdk相关: 如果是android sdk manager: HTTP Proxy Server : mirrors.neusoft.edu.cn HTTP ...
- 快速构建一个 Springboot
快速构建一个 Springboot 官网:http://projects.spring.io/spring-boot/ Spring Boot可以轻松创建可以“运行”的独立的,生产级的基于Spring ...
- loj 6084.「美团 CodeM 资格赛」跳格子
题目: link 题解: 尽量走\(a\). 只要保证走\(a\)后到达的点一定可以到终点就可以走. 所以从终点开始\(dfs\)出所有能够到达终点的点. 然后再从起点开始\(dfs\)路径即可. 如 ...
- Kubernetes创建挂载共享存储的容器
原文链接:https://www.58jb.com/html/135.html 在上一次的Mysql容器中,已经使用过了配置宿主机目录挂载的方式,这样虽然方便但是不够安全:一般都是把数据存储在远程服务 ...
- MySQL的varchar类型注意事项
前几天就在工作中发现这样一个问题:当某个字段的类型为varchar时,字段保存的值类似'100,200,300' 和 '100' 或 '100,400'.写SQL语句的时候就会犯这样的错误,例如: ...
- ThreadPoolTaskExecutor异常收集
ThreadPoolTaskExecutor ipFinderThreads = new ThreadPoolTaskExecutor(); ipFinderThreads.setCorePoolSi ...
- web.xml中classpath表示什么样的路径
首先 classpath是指 WEB-INF文件夹下的classes目录 解释classes含义: 1.存放各种资源配置文件 eg.init.properties log4j.properties ...
- 关于无法解析的外部符号 _main
今天在写一段代码的时候,遇到了这个问题,一般遇到这种问题,都是找不到主函数,就是main函数,可是我写的代码是有入口地址main函数的呀.最后发现是自己源文件里,main函数是.c文件,.h文件对应的 ...
- linq to sql 类的使用
本文介绍linq to sql模型类的使用 EntityFramework是重量级的数据库模型,如果你想要一个简单轻量级的数据库模型,建议使用linq to sql类 创建模型类 在项目中添加linq ...
- hibernate 延长加载范围
1. 关闭延迟加载功能 lazy="false"2.修改抓取策略 fetch="join"直接查询关联数据,一个联接查询搞定3.使用Hibernate对象的in ...