一:题目
afeng是一个港口的海关工作人员,每天都有许多船只到达港口,船上通常有很多来自不同国家的乘客。
afeng对这些到达港口的船只非常感兴趣,他按照时间记录下了到达港口的每一艘船只情况;对于第i艘到达的船,他记录了这艘船到达的时间ti (单位:秒),船上的乘客数ki,以及每名乘客的国籍 xi,1,xi,2,…,xi,k。
afeng统计了n艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时(24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。
形式化地讲,你需要计算n条信息。对于输出的第i条信息,你需要统计满足ti−86400<tp≤ti的船只p,在所有的xp,j中,总共有多少个不同的数。
输入格式:
第一行输入一个正整数n,表示小K统计了n艘船的信息。
接下来n行,每行描述一艘船的信息:前两个整数ti和ki分别表示这艘船到达海港的时间和船上的乘客数量,接下来ki个整数表示船上乘客的国籍。
保证输入的ti是递增的,单位是秒;表示从afeng第一次上班开始计时,这艘船在第ti秒到达海港。
保证 1≤n≤10^5,∑ki ≤ 3∗105,1≤xi,j≤105,1≤t(i-1)≤ti≤10^9
其中∑ki表示所有的ki的和。
输出格式:
输出n行,第i行输出一个整数表示第i艘船到达后的统计信息。
输入样例1:
3
1 4 4 1 2 2
2 2 2 3
10 1 3
结尾无空行
输出样例1:
3
4
4
结尾无空行
输入样例2:
4
1 4 1 2 2 3
3 2 2 3
86401 2 3 4
86402 1 5
结尾无空行
输出样例2:
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个不同的国家。
二:上码(这个码有问题 测试点第二个超时 分享出来 希望可以指错 )
/**思路:1.题目写的挺复杂,所以我们就要精简题目,也就是只看输入和输出分析数据和末尾给出的解释。 2.因为我们是要统计24小时以内的数据,所以我们需要判断每次的到达时间和前面的时间的关系。如果与其做减法小于86400,那么说明在24小时以内,这时我们统计不同的国籍个数,需要从前面的时间有多少个不同国籍数进行统计,那么这时我们就需要用到一对多的容器map<int,vector<int> >; 在用set容器装下每个时间对应的国籍数(用set主要目的是为了去重) 31 4 4 1 2 22 2 2 310 1 341 4 1 2 2 33 2 2 386401 2 3 486402 1 5 */
#include<iostream>
#include<map>
#include<vector>
#include<set>
using namespace std;int main(){vector<int> v1;//统计24小时以内的不同的国籍个数 vector<int> v2;//记录时间 vector<int> v3;//处理每个时间所对应的国籍号码 map<int,vector<int> > m; //统计每个时间不同的国籍个数 map<int,vector<int> >:: iterator mt;int N;//cin >> N;scanf("%d",&N);for(int i = 0; i < N; i++) {int time,M;//cin >> time >> M;scanf("%d%d",&time,&M);v2.push_back(time);set<int> s_one;for(int j = 0; j < M; j++) { int num;//cin >> num;scanf("%d",&num);v3.push_back(num); s_one.insert(num);//这里主要是处理第一个时间对应的国籍个数 }m[time] = v3;v3.clear();if(i != 0){for(int j = 0; j < v2.size()-1; j++){if(time - v2[j] < 86400){//说明在24小时以内 v2[j]往后的所有时间均是在24小时以内的 set<int> s; for(mt = m.begin(); mt != m.end(); mt++){if(mt->first >= v2[j]){//这里表示的是我们选择的是所有在24小时以内 vector<int>:: iterator vt;for(vt = mt->second.begin(); vt != mt->second.end(); vt++){//遍历每个时间对应的国籍号 s.insert(*vt); // cout << *vt << ' '; } } } // cout << endl; v1.push_back(s.size()); break;//跳出这个循环,因为我们已经统计完了24小时以内的不同的国籍的个数 } } } else{v1.push_back(s_one.size());//记录首个时间的国籍个数 } }for(int i = 0; i < v1.size(); i++) {//cout << v1[i] << endl;printf("%d\n",v1[i]);}