当前位置:首页 > 数据结构 > 队列 > 正文
SSOJ2273海港(NOIP2016)
3866+

题目大意:现有n艘船,已知每艘船到达时间以及乘客人数和每个乘客的国际,请统计各艘船到达时24小时内乘客的不同国籍数量?

题目描述

小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。

小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第i艘到达的船,他记录了这艘船到达的时间ti (单位:秒),船上的乘 客数量ki,以及每名乘客的国籍 x(i,1), x(i,2),…,x(i,k);。

小K统计了n艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时(24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。

形式化地讲,你需要计算n条信息。对于输出的第i条信息,你需要统计满足 ti – 86400 < tp <= ti的船只p,在所有的x(p,j)中,总共有多少个不同的数。

输入

第一行输入一个正整数n,表示小K统计了 n艘船的信息。

接下来n行,每行描述一艘船的信息:前两个整数ti和ki分别表示这艘船到达海港的时间和船上的乘客数量,接下来ki个整数x(i,j)表示船上乘客的国籍。

保证输入的ti是递增的,单位是秒;表示从小K第一次上班开始计时,这艘船在第 ti 秒到达海港。

输出

输出n行,第i行输出一个整数表示第i艘船到达后的统计信息。

样例输入

输入样例#1:
3
1 4 4 1 2 2
2 2 2 3
10 1 3

输入样例#2:
4
1 4 1 2 2 3
3 2 2 3
86401 2 3 4
86402 1 5

样例输出

输出样例#1:
3
4
4

输出样例#2:
3
3
3
4

提示

到达的船是第一艘船、第二艘船和第 三艘船,共有4+ 2+1=7个乘客,分别是来自国家4,1,2,2,2,3,3,共来自4个不同 的国家。

【样例解释2】

第一艘船在第1秒到达海港,最近24小时到达的船是第一艘船,共有4个乘客,分别是来自国家1,2,2,3,共来自3个不同的国家。

第二艘船在第3秒到达海港,最近24小时到达的船是第一艘船和第二艘船,共有4+2=6个乘客,分别是来自国家1,2,2,3,2,3,共来自3个不同的国家。

第三艘船在第86401秒到达海港,最近24小时到达的船是第二艘船和第三艘船,共有2+2=4个乘客,分别是来自国家2,3,3,4,共来自3个不同的国家。

第四艘船在第86402秒到达海港,最近24小时到达的船是第二艘船、第三艘船和第四艘船,共有2+2+1=5个乘客,分别是来自国家2,3,3,4,5,共来自4个不同的国家。

NOIP2016普及组第三题

解题思路

把n艘船的乘客依次读入结构体数组d中,并记录他们的到达时间和国籍。为了避免重复扫描乘客和方便统计,我们用一个f数组记录各国籍乘客数。当一艘船来的时候,一个一个人统计国籍,如果该人的国籍原来人数为0,那么当前国籍的数量比之前多1;在输出统计好的国籍数量之前,需要去掉那些24小时之前的乘客(“下船”):一个一个看,如果乘客到达时间加上24小时不大于当前时间,那么他就是要排除在外的,减少该国国籍人数,如果减为0,国籍数量减1。

时间复杂度:O(n+∑ki),因为每条船只扫描一次,每个人最多扫描2次。

程序实现

骗分代码

首先读入所有乘客,记录每个乘客的达到时间和国籍到结构体d中,m是乘客总数。一个一个时间点输出,对于每个时间点,从m个乘客里面找在24小时内的且不比当前时间点晚的乘客,如果满足条件,且他是新国籍,ans加1,统计完后输出ans。时间复杂度O(n*m),n*m在1e7以内可以轻松过,拿70分绝对没问题!

时间戳版本:不用每次memset,原来f[x]记录x国是否统计(出现)过,现在f[x]记录x国是否在第i次统计过(如果f[x]等于i则表示在第i次统计过)。

【数据范围】

表示所有的ki的和。

About

坚决不Copy代码!

本文标签:,,,,,,,,

SSOJ2273海港(NOIP2016):等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!