洛谷題單指南-線性表-P2058 [NOIP2016 普及組] 海港

江城伍月發表於2024-03-12

原題連結: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;
}

相關文章