数据结构_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 ...
随机推荐
- Maven环境下多模块项目构建
Maven环境下多模块项目构建 一.新建项目 1.建立我们的父模块par 2.建立我们的子模块dao层 3.建立我们的子模块service层 4.建立我们的子模块web层 5.全部配置完成后,怎么把我 ...
- 前端用户输入校验--基于JQ
<!DOCTYPE html> <html> <head> <title>用户输入校验</title> </head> < ...
- win8.1系统相关
win8.1系统相关 信息时代,系统更新速度非常快,十一月初,同事在网上花5元买了一个win8.1系统激活码,之后两周,我电脑由于系统故障,准备重装系统,借助他的系统,但无法激活,借用他购买的账号也不 ...
- 常用Kerberos指令
1. 以超管身份进入kadminkadmin.local addprinc -randkey root/master1@JENKIN.COM //生成随机key的principal addprin ...
- CentOS7中配置基于Nginx+Supervisor+Gunicorn的Flask项目
配置Nginx 1.安装nginx yum install nginx 2.安装好后在/etc/nginx/default.d中添加location的配置,并指向8001端口,以后Gunicorn会监 ...
- 蓝桥杯 历届试题 PREV-2 打印十字图
历届试题 打印十字图 时间限制:1.0s 内存限制:256.0MB 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示: 对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并 ...
- Python:函数变量的使用
1.上层函数不能直接使用其嵌套函数的变量: def func1(x, y): z = x + y def func2(): m = 3 z += m return z print(func1(1, 2 ...
- mybatis association表关联与rowbounds共同使用时的异常及其解决方案
按照mybatis手册中所说的,association有两种实现方式,嵌套查询和嵌套结果映射.如手册中所述,select方式会带来N+1次查询的问题,考虑到效率问题的话建议使用嵌套结果映射.但是在结合 ...
- Lib之过?Java反序列化漏洞通用利用分析
转http://blog.chaitin.com/ 1 背景 2 Java反序列化漏洞简介 3 利用Apache Commons Collections实现远程代码执行 4 漏洞利用实例 4.1 利用 ...
- Java-API-POI-Excel:XSSFWorkbook Documentation
ylbtech-Java-API-POI:XSSFWorkbook Documentation 1.返回顶部 1. org.apache.poi.xssf.usermodel Class XSSFWo ...