原题链接
    与其说入港的是船,不如说入港的是不同的“国家”。
    那么题目就很简单了:维护一个关于不同进港国家的时间队列。
    qt保存进港时间,qc保存的是对应时间进港的国家编号。两个队列中的元素一一对应。
    每当有若干元素要进队时(元素数量取决于新进港船只上人数),首先看看队首元素还是不是在待入队元素的“24h内”。如果不在了,那么对应的若干元素就得出队。qt中的元素直接出队即可,直到qt队首元素在待入队元素的“24h内”;qc中的元素出队时,记得在cnt计数数组中将对应下标的元素-1,如果-1之后相应元素变成了0,那么相应的答案也要-1。
    之后待入队元素可以入队了。入队时记得cnt中对应元素+1。如果cnt中的对应元素原来是0,别忘了答案也要+1。

    1. #include <iostream>
    2. #include <deque>
    3. using namespace std;
    4. const int N = 100010, DAY_SEC = 86400;
    5. int cnt[N] = {0, }, n, ans = 0;
    6. deque<int> qt, qc;
    7. int main(void)
    8. {
    9. scanf("%d", &n);
    10. for (int i = 0; i < n; i++)
    11. {
    12. int t, k;
    13. scanf("%d%d", &t, &k);
    14. while (!qt.empty() && t - DAY_SEC >= qt.front())
    15. {
    16. int x = qc.front();
    17. if (--cnt[x] == 0) ans--;
    18. qt.pop_front();
    19. qc.pop_front();
    20. }
    21. for (int j = 0; j < k; j++)
    22. {
    23. int x;
    24. scanf("%d", &x);
    25. qt.push_back(t);
    26. qc.push_back(x);
    27. if(++cnt[x] == 1) ans++;
    28. }
    29. printf("%d\n", ans);
    30. }
    31. return 0;
    32. }