原題連結:https://www.luogu.com.cn/problem/P2058
題意解讀:計算24小時時間視窗內不同國家的數量,是佇列的典型應用。
解題思路:
本題需要用到兩個關鍵的資料結構:佇列、陣列
佇列用來儲存24小時內到達的船的時間,陣列用來儲存24小時內每個國家有多少人
每到一隻船,需要把時間放入佇列,如果距離隊首時間超過24小時,則要出隊,一直到不超過24小時
每一次入隊、出隊,都需要更新陣列中每個國家的人數
考慮到總人數在
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;
}