原题链接:https://www.luogu.com.cn/problem/P2058
题意解读:计算24小时时间窗口内不同国家的数量,是队列的典型应用。
解题思路:
本题需要用到两个关键的数据结构:队列、数组
队列用来保存24小时内到达的船的时间,数组用来保存24小时内每个国家有多少人
每到一只船,需要把时间放入队列,如果距离队首时间超过24小时,则要出队,一直到不超过24小时
每一次入队、出队,都需要更新数组中每个国家的人数
考虑到总人数在3×10^5,队列中可以存{时间,国家},即把一艘船的人拆成多条记录来入队,更便于处理
在更新数组中不同国家的人数过程中,就可以同时更新答案ans变量,比如某个国家的人数从0变1时ans++,从1变0时ans--
100分代码:
#include <bits/stdc++.h>
using namespace std;
struct node
{
int t, x;
};
queue<node> q;
int p[100005]; //不同国家的人数
int ans;
int main()
{
int n, t, k, x;
cin >> n;
while(n--)
{
cin >> t >> k;
while(k--)
{
cin >> x;
while(q.size() && t - q.front().t >= 86400) //如果队列不空且与队首时间超过24小时,注意>=
{
p[q.front().x]--; //减少队首国家的人数
if(p[q.front().x] == 0) ans--; //更新ans
q.pop(); //队首出队
}
q.push({t, x}); //当前国家的人入队
p[x]++; //增加x国家的人数
if(p[x] == 1) ans++; //更新答案
}
cout << ans << endl;;
}
return 0;
}
标签:24,NOIP2016,队列,线性表,--,洛谷题,int,ans,人数 From: https://www.cnblogs.com/jcwy/p/18067746