大模拟题的注意事项合集

P2058 [NOIP2016 普及组] 海港

坑点:

  • 一开始的思路是直接建一个队列,如果队里有这个国家的人那么就不进队,根据时间不断删除队首,查询队列的 size。
    很容易看出这个思路不可行。
    因为这个时刻队列中有这个国籍的人,下一次就不一定是这一个了
  • 那我们记录此时队列中有几个此国籍的人,根据时间删除时就是这个编号-1,如果减成0,size-1。如果队列里一开始没有,就让 size+1。

一定要先减后加!!!降低时间复杂度

代码:

#include<bits/stdc++.h>
using namespace std;
queue<pair<int,int> >qt;//记录people的队列
//pair的first存储这个人进入海港的时间,second存储这个人的国籍
int cnt[5000100];
int sizeq=0;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int t,k;
cin>>t>>k;
while(!qt.empty()&&t-qt.front().first>=86400) {
int se=qt.front().second;
cnt[se]--;
if(cnt[se]==0) sizeq--;
qt.pop();
}
for(int j=1;j<=k;j++)
{
int cn;
cin>>cn;
cnt[cn]++;
if(cnt[cn]==1)
sizeq++;
qt.push({t,cn});
}
cout<<sizeq<<endl;
}
return 0;
}
posted @   lazy_ZJY  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示