数据结构_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 ...
随机推荐
- mysql定时任务备份bat命令-记录一下待日后使用
最近有个任务,需要每日备份数据库到某个磁盘,使用window定时任务调用bat文件实现. %Date:~0,2%获取星期几,这个要根据系统进行尝试, 有 星期几 7/25/2018 有 2018/ ...
- Aixs2发布webservice服务
http://www.blogjava.net/pzxsheng/archive/2012/12/21/393319.html 开发前准备: 1.Eclipse Java EE IDE(Juno ...
- [ZOJ2587]Unique Attack
vjudge sol 最小割判定唯一性. 只要做完一个任意最小割后,判断一下是不是所有点都要么和\(S\)相连,要么和\(T\)相连. 只要两边各一次\(dfs\)就行了. code #include ...
- 调整 WiFi 驱动设置让 WiFi 信号更稳定
调整 WiFi 驱动设置让 WiFi 信号更稳定 修改 WiFi 驱动中 的设置,将 Power Saving Mode 的值改为 CAM.
- windbg调试实例(4)--句柄泄露
同事介绍了一篇调试句柄泄露的blog文章,今天有空看了一下,这家伙用视频的方式录下整个调试的过程,学习一目了然,真是有心.鉴于学习的过程总结一下能加深记忆,所以我这里做个记录,感兴趣的朋友可以看这里: ...
- 5、Selenium+Python自动登录163邮箱发送邮件
1.Selenium实现自动化,需要定位元素,以下查看163邮箱的登录元素 (1)登录(定位到登录框,登录框是一个iframe,如果没有定位到iframe,是无法定位到账号框与密码框) 定位到邮箱框( ...
- Boost.Asio基本原理(CSDN也有Markdown了,好开森)
Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...
- WINDOWS 7下的记事本程序目录
这是win7的目录 系统所在分区:\Windows\system32\notepad.exe
- paramiko 堡垒机
用paramiko写堡垒机 paramiko paramiko模块,基于SSH用于连接远程服务器并执行相关操作. 基本用法 SSHClient 基于用户名密码连接: 基础用法: import para ...
- C#在线预览文档(word,excel,pdf,txt,png)
C#在线预览文档(word,excel,pdf,txt,png) 1.预览方式:将word文件转换成html文件然后预览html文件2.预览word文件:需要引入Interop.Microsoft.O ...