Species Tree(HashTable实现)


题目再现

题目内容:
给定一个物种演化图,
关系的表示方式如下:
x y : 表示x为y的先祖。
一个物种只会有一个先祖,
一个先祖可以有很多个演化出来的物种,
请你找出每个问题询问物种的祖父物种(先祖的先祖),
每个物种会使用一个不重复的编号来表示,
如果该物种没有祖父物种的话或是不存在,
那么请将他的祖父物种当是0。(凭空而生)
保证所有物种间一定有所关连,
且不会有重复演化的现象发生,
即演化图只会是一棵树。输入格式:
只有一组测资。
第一行会有两个数字N、Q,代表总共有N个物种及Q个问题。
接下来N-1行,每一行有两个数字x、y,
意义如题目所述。
接下来的Q行,每一行有一个数字Z,
代表要询问的物种编号。
测资范围:
1 < N < 10000
0 < Q < 1000
0 < x, y, z < 1000000输出格式:
对于每一个询问的物种编号,将他们的祖父物种编号加总后再输出。输入样例:
6 3
1000 2000
1000 3000
2000 4000
3000 5000
5000 6000
5000
6000
1234输出样例:
4000时间限制:100ms内存限制:16000kb

算法实现

1. 简单数组下标查找法

  通过题目的要求,这里可以使用最简单的方法,因为输入的x , y中,y的值是确定不变的,所以这里可以定义一个y的取值范围那么大的数组,下标就是y的值,内容就是x的值,这样查找起来十分方便,时间复杂度是O(1),但是空间上就会浪费比较多了。

#include <stdio.h>
#include <string.h>int main(){int arrBucket[1000000];int N, Q;int x, y, z;long long sum = 0;memset(arrBucket, 0, sizeof(arrBucket));scanf("%d %d", &N, &Q);while(N -- > 1){scanf("%d %d", &x, &y);arrBucket[y] = x;}while(Q --){scanf("%d", &z);if(arrBucket[z] != 0){if(arrBucket[arrBucket[z]] != 0){sum += arrBucket[arrBucket[z]];}}}printf("%lld", sum);return 0;
}

2. Hash表实现

  因为方法1中,浪费空间严重,所以这里使用Hash表实现。

#include <stdio.h>
#include <stdlib.h>
#define NULLKEY -1typedef struct {int *elem; //元素 int *elemP; //父元素 int count;
}HashTable;int Hash(HashTable H, int k){return k % H.count;
}void InitHashTable(HashTable *H){int i;H->elem = (int *)malloc(sizeof(int) * H->count);H->elemP = (int *)malloc(sizeof(int) * H->count);for(i = 0; i < H->count; i ++){H->elem[i] = NULLKEY;H->elemP[i] = NULLKEY; }
}void InsertHash(HashTable *H, int key, int value){int addr;addr = Hash(*H, key);while(H->elem[addr] != NULLKEY){addr = (addr + 1) % H->count;}H->elem[addr] = key;H->elemP[addr] = value;
}int FindHash(HashTable *H, int key, int *addr){*addr = Hash(*H, key);while(H->elem[*addr] != key){*addr = (*addr + 1) % H->count;if(H->elem[*addr] == NULLKEY || *addr == Hash(*H, key)){return 0;}}return 1;
}int main(){int N, Q;int x, y, z, addr;long long sum = 0;HashTable H;scanf("%d %d", &N, &Q);H.count = N - 1;InitHashTable(&H);while(N -- > 1){scanf("%d %d", &x, &y);InsertHash(&H, y, x);}while(Q --){scanf("%d", &z);if(FindHash(&H, z, &addr)){if(FindHash(&H, H.elemP[addr], &addr)){sum += H.elemP[addr];}}}printf("%lld", sum);return 0;
}

3. 用C++的map来实现

  看着用C实现起来,相对来说实现的各个功能都要自己写,这里看一下用C++的STL里面的map来实现上面的题目,非常简单(不得不说STL真的很好用,但是不如HashTable速度快,空间上也不如HashTable占用的小)

#include <iostream>
#include <map>
using namespace std;int main() {int n, q;cin >> n >> q;map<int,int> mp; map<int,int>::iterator it;int x, y, z;for (int i=1; i<n; ++i) {    cin >> x >> y;mp.insert(pair<int,int>(y,x));    }int sum = 0;for (int i=0; i<q; ++i) {cin >> z;it = mp.find(z);    if (it != mp.end()) {it = mp.find(it->second);    if (it != mp.end())sum += it->second;    }}cout << sum;return 0;
}

博客名称:王乐平博客
博客地址:http://blog.lepingde.com
CSDN博客地址:http://blog.csdn.net/lecepin


这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adjacent Node Sum(邻接表处理)

题目再现 题目内容&#xff1a; 给定一个节点有权重的图&#xff0c; 请你计算与一个节点相邻的所有节点的权重和。 节点编号为1~N。 每个节点的编号即为他的权重。输入格式: 只有一组测资。 第一行有三个数字&#xff0c;N、M、Q。 N表示这张图有多少节点&#xff0c; M表示这…

Maze(BFS处理)

题目再现 题目内容&#xff1a; 给你一个迷宫&#xff0c; S为起点&#xff0c;E为终点。 请你找出走出迷宫所需要花费的最短步数。 你只能往上下左右四个方向移动。输入格式: 第一行有一个数字T&#xff0c;代表有T组测资。 每组测资的第一行有两个数字R、C&#xff0c; 代表…

Lotto(DFS处理)

题目再现 题目内容&#xff1a; 给定N个数字&#xff0c;再从中选定M个数字出来。 将每一种组合内的数字由小到大排列之后&#xff0c; 将所有组合按照字典序排列&#xff0c; 请你找出第X组的第Y个数字。 给定的数字为1~N。 范例1 (N,M,X,Y) (5,2,8,2) 所有组合按顺序排列为…

2016第七届蓝桥杯省赛C/C++ B组试题解析整理

引言 今天是蓝桥杯省赛举办的日子&#xff0c;是一个很激动人心的时刻&#xff0c;也是我第一次参加蓝桥杯&#xff0c;从上午9点到下午1点&#xff0c;做题时间历经4个小时&#xff0c;想想就过瘾。 下面整理一下这次比赛的题目。 *注&#xff1a;此处为了省事儿&#xff…

Linux 小知识翻译 - 「邮件服务器」

这次聊聊「邮件服务器」。 邮件服务器上通常会运行2个服务端软件&#xff0c;「SMTP服务器」和「POP服务器或者IMAP服务器」。 这2个东西&#xff0c;也许使用邮件客户端的人立马就明白了。因为设置邮件客户端的时候&#xff0c;需要指定「发信服务器」和「收信服务器」。 这2个…

终极结束进程方法API

引言 最近在机房里上课的时候&#xff0c;学生的电脑上都安装了相应的学生端软件&#xff0c;而这些软件并没法正常关闭&#xff0c;用任务管理器也无法关闭&#xff0c;下面我说一下如何用Windows API对这类顽固程序进行终结。 福利方法 由于相关方面的规定&#xff0c;这里…

Android Fragments 详细使用

2019独角兽企业重金招聘Python工程师标准>>> Fragments 诞生初衷 自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片、片段。其上的是为了解决不同屏幕分辩率的动态和灵活UI设计。大屏幕如平板小屏幕如手机&#xff0c;平板电脑的设计使得其有更多…

安卓UI适配限定符

引言 对于程序在不同尺寸的Android机器上运行&#xff0c;对UI的适用性造成了额外的开销&#xff0c;不过限定符的出现&#xff0c;很方便的解决了这个问题。通过创建限定符相关的文件夹来解决资源的加载。 限定符用处 限定符(mdpi,tvdpi,hdpi)可以帮助我们判断屏幕密度 限定…

docker install on centos 6.x

2019独角兽企业重金招聘Python工程师标准>>> 参考文档:http://docs.docker.com/installation/centos/ 安装epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo 安装docker服务端 yum install docker-io 启动docker /etc/init.…

安卓活动(Activity)和碎片(Fragment)的生命周期

引言 对于安卓中生命周期的过程以及相应的事件的了解是非常重要的。 活动&#xff08;Activity&#xff09;的生命周期 Activity 类中定义了七个事件回调方法&#xff0c;与Activity生命周期的每一个环节对应。 1. onCreate() 这个方法你已经看到过很多次了&#xff0c;每个…

又开始写博了

2019独角兽企业重金招聘Python工程师标准>>> 因为太多东西需要记录&#xff0c;所以重新开博。脚印一把 转载于:https://my.oschina.net/junfrank/blog/286348

Android 代码实现查看SQLite数据库中的表

前言 以前写PHP的时候&#xff0c;内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构&#xff0c;现在做Android的开发&#xff0c;发现并没有这种类似的函数&#xff0c;对于数据库的查看很不方便&#xff0c;于是就写了一下查看数据库表的方法代码。 …

Android 代码执行Linux Shell小记

引言 Android系统是基于Linux内核运行的&#xff0c;而做为一名Linux粉&#xff0c;不在Android上面运行一下Linux Shell怎么行呢&#xff1f; 最近发现了一个很好的Android Shell工具代码&#xff0c;在这里分享一下。 Shell核心代码 import java.io.BufferedReader; impor…

【iHMI43 4.3寸液晶模块】demo例程(版本1.02)发布

技术论坛&#xff1a;http://www.eeschool.org 博客地址&#xff1a;http://xiaomagee.cnblogs.com 官方网店&#xff1a;http://i-board.taobao.com 银杏科技 GINGKO TECH. 保留权利&#xff0c;转载请注明出处 一、简介&#xff1a; 1、iHMI43 演示程序(版本号&#xff1a;1…

Android 数据存储之文件存储小记

前言 Android操作文件的方式和JAVA I/O操作是十分类似的&#xff0c;在这个我小谈一下。 Android写入文件 在Android中Context类提供了openFileOutput()方法&#xff0c;用于文件写入。默认存储路径为/data/data/<package name>/files/中。 openFileOutput原型&#x…

Android 数据存储之SharedPreferences存储小记

前言 Android的数据存储机制中还提供了SharedPreferences&#xff0c;SharedPreferences是这其中最容易理解的数据存储技术&#xff0c;采用键值对的方式进行存储&#xff0c;而且支持存储多中数据类型。 获取SharedPreferences对象 SharedPreferences文件存放在/data/data/&…

Jackson、JSON-lib、Gson性能对比

2019独角兽企业重金招聘Python工程师标准>>> 近日做一些性能优化工作&#xff0c;在挑选JSON类库时&#xff0c;发现除了一般常用的JSON-lib外&#xff0c;还有一款号称性能最快的JSON处理器Jackson&#xff0c;于是用上了刚学会的JMeter&#xff0c;对这两个类库进…

IP地址定位器

软件截图 软件说明 软件名称&#xff1a;IP地址定位器 软件版本&#xff1a; 1.0 软件说明&#xff1a;当我们想通过IP具体到街道甚至门牌号&#xff0c;该怎么办&#xff1f;&#xff1f;&#xff1f;特开发IP地址定位器&#xff0c;结合高精度IP定位&#xff0c;可以通过I…

[题解]RQNOJ PID85 三个袋子

链接&#xff1a;http://www.rqnoj.cn/problem/85 思路&#xff1a;一个排列问题&#xff0c;递推式很简单&#xff0c;f(n1)3*f(n)-1 &#xff0c;由此可以推出通项公式&#xff0c;f(n)0.5*3^(n-1)0.5 。 但是这个数太大了&#xff0c;我们需要求的是f(n) mod K 。那么就必须…

CSS3媒体查询(@media)详细总结和Responsive浅谈

引言 一直想对CSS3的媒体查询和Responsive进行一下记录和总结&#xff0c;今天拿出点时间来做一下。 媒体查询的历史 随着浏览器终端的多样化&#xff0c;无法保证一个网页在不同的设备上呈现出想同的结果&#xff0c;所以Media Query诞生了&#xff0c;让一个页面适用不同的终…