今日题目:海港
题目描述
小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。
小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第i艘到达的船,他记录了这艘船到达的时间ti (单位:秒),船上的乘 客数k_iki,以及每名乘客的国籍 xi,1,xi,2,…,xi,k。
小K统计了nn艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时(24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。
形式化地讲,你需要计算nn条信息。对于输出的第ii条信息,你需要统计满足ti−86400
输入格式
第一行输入一个正整数nn,表示小K统计了nn艘船的信息。
接下来nn行,每行描述一艘船的信息:前两个整数t_iti和k_iki分别表示这艘船到达海港的时间和船上的乘客数量,接下来k_iki个整数x_{i,j}xi,j表示船上乘客的国籍。
保证输入的t_iti是递增的,单位是秒;表示从小K第一次上班开始计时,这艘船在第t_iti秒到达海港。
保证 1≤n≤105 ∑ki≤3∗105 ,10^51≤xi,j≤105,1≤ti−1≤ti≤109。
其中∑ki表示所有的ki的和。
输出格式
输出n行,第ii行输出一个整数表示第ii艘船到达后的统计信息。
题目分析
题目难度:⭐️⭐️⭐️
题目涉及算法:队列,模拟。
ps:有能力的小伙伴可以尝试优化自己的代码或者一题多解,这样能综合提升自己的算法能力
题解报告:
1.思路
直接队列模拟情况,再循环里面特殊判断一下时间的情况即可。
2.代码
#include<bits/stdc++.h> using namespace std; int n,t,m,x; const int N = 1000005; int a[N]; int ans; struct node{ int s,t; }; int main() { queue<node>q; node h; cin>>n; for(int i=1;i<=n;i++) { cin>>t>>m; while(q.size()) { h = q.front(); if(h.t+86400<=t) { a[h.s]--; if(a[h.s]==0) { ans--; } q.pop(); continue; } break; } for(int j=1;j<=m;j++) { cin>>x; h.s = x,h.t = t; q.push(h); a[x]++; if(a[x]==1) { ans++; } } cout<<ans; } return 0; }