原题链接  https://www.luogu.org/problemnew/show/P2058

这道题昨天qyf大佬刚给我们讲了一下,所以今天就把它做啦!

qyf大佬的思路和我的是一样的(其实是借鉴了qyf大佬的思路),但是由于他是用的指针+动态数组来实现的,这搞得我有些懵,今天仔细一想(没看题解QwQ~)发现可以用队列来实现,所以为了记录这个思路,写了一篇队列的博客。

想看指针+动态数组实现的同学们戳这里,还送屠龙宝刀哦~ 传送门

首先这是一道模拟题,思路也很简单:

1. 题目中要求有多少个不同的国籍,所以我们先开一个 nat 数组类似于桶排那样来记录第 i 个国籍有多少人;

2. 对于当前到来的船,我们可以将这艘船的所有乘客全入队(注意是乘客!),他们维护两个信息:到来的时间 t 和国籍 nation;

3. 我们要统计 ( t- 86400,ti ] ,所以我们要有一个 delete 操作将队列里所有 t <= ti - 86400 的乘客弹出队列,同时注意对应的国籍人数减一;

4. 考虑到 nat 记录的是国籍的人数,那么我们可以想到:若 nat [ i ] 从一个大于0的数减到了0,那么不就说明这个国籍就没有了?此时的国籍数kind就要 -1;同理若 nat [ i ] 从0加了一个正数,说明该国籍出现了,那么此时的国籍数kind 就要 +1;

5. 然后我们输出kind 即可;

代码如下:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int read()
{
char ch=getchar();
int a=,x=;
while(ch<''||ch>'')
{
if(ch=='-') x=-x;
ch=getchar();
}
while(ch>=''&&ch<='')
{
a=(a<<)+(a<<)+(ch-'');
ch=getchar();
}
return a*x;
}
struct people
{
int t,nation;
}a[];
queue<people> q;
int n,num,guo,kind,t[],vis[];
void delet(int tim)
{
people f=q.front(); //因为我们是按照时间顺序来将乘客入队的,所以队首乘客的t一定最小
while(f.t<=tim)
{
q.pop();
vis[f.nation]--; //对应国籍人数减一
if(vis[f.nation]==) kind--; //国籍人数减到0,说明这种国籍消失,国籍数kind减一
f=q.front();
}
return ;
}
int main()
{
n=read(); //n艘船
for(int i=;i<=n;i++)
{
t[i]=read(); //这一艘船到来的时间
num=read(); //乘客人数
for(int j=;j<=num;j++)
{
guo=read(); //所属国籍
if(!vis[guo]) kind++; //如果之前这种国籍的人数为0,说明多了一种国籍
vis[guo]++;
q.push((people){t[i],guo});//入队,维护时间t 和国籍nation
}
delet(t[i]-); //删除t[i]-86400以前的船,注意要放在入队操作之后
printf("%d\n",kind);
}
return ;
}

P2058 海港的更多相关文章

  1. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  2. 洛谷 P2058 海港 题解

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  3. (寒假集训)洛谷 P2058 海港

    小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况:对于第i艘到达的船,他记录了 ...

  4. 洛谷P2058 海港

    题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况:对于第i艘到达的船 ...

  5. 洛谷 P2058 海港(模拟)

    题目链接:https://www.luogu.com.cn/problem/P2058 这是一道用手写队列模拟的一道题,没有什么细节,只是注意因为数不会很大,所以直接用数作为数组下标即可,不用用map ...

  6. 洛谷——P2058 海港

    题目传送 由于于题目保证输入的ti是递增的,所以发现当我们统计完一艘船的答案后,这个答案多少会对下一艘船的答案有贡献.同时还发现如果对每个艘船都记录他的乘客在整个数据出现的所有国籍中相应出现的次数,在 ...

  7. P2058 海港 (洛谷)

    这个题复制过来真的有点恶心,懒得手打,以后再搬题面吧. 今天我双更了,AC这个题我就完成某谷春令营第一课的作业了(假的) 这个题是个双指针.非常友善.一直往里读入就可以了,遇见不是一条船的乘客输出这一 ...

  8. [P2058][NOIP2015]海港 (模拟)

    %%%ADMAN #include<cstdio> using namespace std; int n,tot,now,ans,h; ],k[],a[],sum[]; int main( ...

  9. noip2016海港

    题目描述 Description 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只 ...

随机推荐

  1. ASP.NET Core 3.0 入门

    原文:ASP.NET Core 3.0 入门 课程简介 与2.x相比发生的一些变化,项目结构.Blazor.SignalR.gRPC等 课程预计结构 ASP.NET Core 3.0项目架构简介 AS ...

  2. JDBC 学习复习9 配置Tomcat数据源

    在实际开发中,我们有时候还会使用服务器提供给我们的数据库连接池,比如我们希望Tomcat服务器在启动的时候可以帮我们创建一个数据库连接池,那么我们在应用程序中就不需要手动去创建数据库连接池,直接使用T ...

  3. 【原创】大叔经验分享(85)ssh秘钥之创建和使用

    一 创建秘钥 1 Macbook $ ssh-keygen -t rsaGenerating public/private rsa key pair.Enter file in which to sa ...

  4. TCP协议和UDP协议的对比【转】

    原文:https://blog.csdn.net/lzj2504476514/article/details/81454754 一.TCP协议的主要特点(1)TCP是面向连接的运输层协议:(2)每一条 ...

  5. 用Altium Designer16 绘制STM32开发板PCB 笔记

    第一部分 Altium designer 软件概括 一.安装:要安装英文版,只安装pcb design和importers/exporters 二.设置:dxp-preferences我们关心的是sy ...

  6. Java中的ThreadLocal详解

    一.ThreadLocal简介 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线 ...

  7. # URL异常检测

    (Isolation Forest无监督)这个算法是随机森林的推广. iTree树构造:随机选一个属性,再随机选该特征的一个值,对样本进行二叉划分,重复以上操作. iTree构建好了后,就可以对数据进 ...

  8. HashMap、HashTable差异详解

    HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案. 代码版本 JDK每一版本都在改进.本文讨论的Has ...

  9. 初识cv

    验证码识别的一般套路: 灰度化.图像处理.二值化.选算法.训练.评估调整参数.预测,当然,我在这里二值化与处理的顺序换了一下,灵活处理哈 1 显示图片轮廓 img = cv2.Canny(img,25 ...

  10. Netty UDP 使用采坑

    使用Netty搭建UDP服务收集日志,使用过程中发现,部分日志接收不到,排查发现,都是大日志记录不到,后查询相关文档进行如下修改 EventLoopGroup workerGroup = new Ni ...