51,721
社区成员




P2058 [NOIP2016 普及组] 海港 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//1.43s.以船为整体
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#define MOD 10000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
int s,n,j=1,tt[300005];//j是用于定位到第几艘船,tt用于判定是否超过86400
int sum[300005];//a存船的到达时间,sum存国籍人数
queue<int> q;
struct node {
int t,k;//t到达时间,k顾客数
vector<int> h;//h存顾客的国籍
} a[100005];
int main() {
cin>>n;
cin>>a[1].t>>a[1].k;
tt[j]=a[1].t;//初始化tt[1](不能初始为0)
//一开始的船的人肯定都能算进去
for(int i=1; i<=a[j].k; i++) {
int x;
cin>>x;
a[j].h.push_back(x);
sum[x]++;
if(sum[x]==1) s++;//新来的国籍就加1
}
cout<<s<<endl;
//第二艘船开始要与初始的tt进行比对判定
for(int i=2; i<=n; i++) {
cin>>a[i].t>>a[i].k;
//1与86401之差恰好86400,所以要清除第一艘船
while(a[i].t - tt[j] >= 86400) {
for(int hh=0; hh<a[j].h.size(); hh++) {//这艘船的所有乘客都在数组sum中清空
int x=a[j].h[hh];
sum[x]--;
if(sum[x]==0) s--;//如果为0,该国籍倒闭了,就-
}
j++;//边界时间转到下一艘船的到达时间
tt[j]=a[j].t;//更新tt[]
}
//输入这艘船的顾客信息并进行录入
for(int hh=1; hh<=a[i].k; hh++) {
int x;
cin>>x;
a[i].h.push_back(x);
sum[x]++;
if(sum[x]==1) s++;
}
cout<<s<<endl;
}
return 0;
}