#include <bits/stdc++.h>
using namespace std;
constexpr int N = 3e5 + 10;
constexpr int D = 86400;
vector<pair<int, int>> a; // 模拟队列(也可以理解为把所有人加入其中,后面的代码像双指针),first是每一个人到达的时间,second是每一个人的国籍
// pair可以看做有两个元素的结构体(应该都学了吧)
int flag[N]; // 有哪些国籍的人,模拟桶
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr); // 不会直接忽略,加速用的
int n;
cin >> n;
int ans = 0; // 当前时段拥有几个国籍的人
int h = 0; // 在前面的指针,用于得知一个时间的有效时间(就是当前t的前24h能管到哪里)
while (n--) {
int t, k;
cin >> t >> k;
for (int u = 1; u <= k; u++) {
int x;
cin >> x;
a.push_back({t, x}); // 入队
int len = a.size(); // 读取长度
int i = len - 1; // 刚刚入队点的位置
flag[a[i].second]++; // 该国籍拥有的人数+1
if (flag[a[i].second] == 1) { // 如果此时为1,说明有效时段内不存在这个国籍
ans++;
}
while (t - a[h].first >= D) { // 如果对比队头超过了当前t的24h前
flag[a[h].second]--; // 该国籍少一个人
if (flag[a[h].second] == 0) ans--; // 没人了
h++; // 队头右移
}
}
cout << ans << '\n';
}
return 0;
}
如果觉得对你有用的话,点个赞再走吧!

京公网安备 11010502036488号