NOIP2016普及组T3(海港)题解

题目信息

题目传送门

解题思路

  • 用队列存储时间。
  • 用cnt数组存储每个国籍有多少人。
  • 每次输入时判断:若没有这个国籍的人,就新建一个国籍。
  • 如果第一个人到达的时间比当前时间晚,就跳到下一个人。
  • 把这个人删掉。如果这个人是他的国籍的唯一一个人,则删除这个国籍。
  • 重复前两部操作,直到第一个人到达的时间小于等于当前时间。

代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5, T = 86400;
int cnt[N], t[N];
int n, res;
inline void add(int x) {
	res += (++cnt[x] == 1);
}
inline void del(int x) {
	res -= (--cnt[x] == 0);
}
vector<int> a[N];
int main() {
	cin >> n;
	int l = 1;
	for (int r = 1; r <= n; ++r) {
		int k, x;
		cin >> t[r] >> k;
		while (k--) {
			cin >> x;
			add(x);
			a[r].push_back(x);
		}
		while (t[r] - T >= t[l]) {
			for (int i = 0; i < a[l].size(); ++i) {
				del(a[l][i]);
			}
			++l;
		}
		cout << res << '\n';
	}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒟蒻一枚

谢谢鸭~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值