前言:
本题为作业
题目描述
查看题目信息
小 K 是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。
小 K 对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第 ii 艘到达的船,他记录了这艘船到达的时间 t_iti (单位:秒),船上的乘客数 k_iki,以及每名乘客的国籍 x_{i,1}, x_{i,2},\dots,x_{i,k}xi,1,xi,2,…,xi,k。
小K统计了 n 艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的 24 小时(24 小时 =86400=86400 秒)内所有乘船到达的乘客来自多少个不同的国家。
形式化地讲,你需要计算 nn 条信息。对于输出的第 ii 条信息,你需要统计满足 t_i-86400<t_p \le t_iti−86400<tp≤ti 的船只 p,在所有的 x_{p,j}
中,总共有多少个不同的数
输入格式
第一行输入一个正整数 n,表示小 K 统计了 n 艘船的信息。
接下来 n 行,每行描述一艘船的信息:前两个整数 ti 和 ki 分别表示这艘船到达海港的时间和船上的乘客数量,接下来 ki 个整数 x_{i,j} 表示船上乘客的国籍。
保证输入的 ti 是递增的,单位是秒;表示从小K第一次上班开始计时,这艘船在第 ti 秒到达海港。
其中 \sum{k_i}∑ki 表示所有的 ki 的和。
输出格式
输出n行,第i行输出一个整数表示第i艘船到达后的统计信息。
样例输入
3 1 4 4 1 2 2 2 2 2 3 10 1 3
样例输出
3 4 4
样例输入
4 1 4 1 2 2 3 3 2 2 3 86401 2 3 4 86402 1 5
样例输出
3 3 3 4
问题提示
【样例1说明】
第一艘船在第1秒到达海港,最近24小时到达的船是第一艘船,共有4个乘客,分别是来自国家4、1、2、2,共来自3个不同的国家;
第二艘船在第2秒到达海港,最近24小时到达的船是第一艘船和第二艘船,共有4+2=6个乘客,分别是来自国家4、1、2、2、2、3,共来自4个不同的国家;
第三艘船在第10秒到达海港,最近24小时到达的船是第一艘船、第二艘船和第三艘船,共有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个不同的国家。
思路
用尺取法,
求24小时内所有不同的国家
AC完整代码:
#include<bits/stdc++.h>
using namespace std;
int cnt[100005];
int n,t,k,x;
struct node
//结构体 存储时间与国籍
{
int t,x;
};
queue<node> q;
//队列记录符合条件的时间与国籍
node a[300005];
int main()
{
int ans=0;
cin>>n;
int L=1,R=0;
for(int i=1;i<=n;i++)
{//从一到遍历第i艘船24小时内所有乘船到达的乘客来自多少个不同的国家
cin>>t>>k;
for(int j=1;j<=k;j++)
{
cin>>x;
cnt[x]++;
if(cnt[x]==1) ans++;//如果新国籍 ans加一
a[++R]=node{t,x};
}
while(L<R && a[L].t+86400<=t)
{
cnt[a[L].x]--;//将此国籍的数量减少一
if(cnt[a[L].x]==0) ans--;
L++;
}
cout<<ans<<endl;//输出
}
return 0;
}