LUOGU P2058 海港

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目分析
经过的仔细阅读,我们可以将题意理解为:给出多组船的信息,求在一天的范围内的不同船的种类
我们可以很自然的想到队列的维护

这里,我们按船的信息来作为队列的元素的
对于前一天的无用信息,我们进行出队处理

在维护上面是比较容易写的,对于每一个进来的信息,给其相应的种类的计数的桶累加
当然,第一个元素的入队我们要特判一下,然后后面是出队,
最后是判断当前元素是不是第一次被加进来,累加一下当前不同的种类的个数就行了

但是,我在写的时候有一个地方出了一些问题,
对于这道题目,有可能出现的问题便是重复和边界了,
由于边界不是很大,所以并不需要过分考虑,所以我们来把焦点汇聚到重复上面
经过思考,我发现类似以下的数据,可以卡掉:
2
1 3 33 33 44
86401 1 33
正确的显然是:
2
1
但是如果像上面那样写的话,答案却是:
2
2
(vis表示当前种类的种族有多少人)
这是为什么呢?
下面我们把数据带进去看一下
在第一组时,是没有任何问题的
在第二组时,我们一边入队,一边出队也是没有什么问题的,真正卡掉的是判断的条件
在第二组时,我们首先将元素入队,可以发现vis[33]=3,之后把前面的扔出去,vis[33]=1——又符合了一种新物种的判断条件!GG
所以我们需要的调整是,把出队和入队分开
入队还是做入队的事情,出队还是考虑出队的事情,只是在入队时考虑好新的种类,再在出队时考虑上一船的人下完了,相应种族的灭绝再在上面累加的上面减,如果当前的种类上一次也有就不用加,当然出队时也只会留下一个

代码

#include <bits/stdc++.h>
using namespace std;

struct node {
	int k;   //种类
	long long t;   //上船时间
}p[1000009];

int m,n;
long long T;
int h = 1, w = 1;
long long s;
int vis[1000009];   //当前种类个数
int a[1000009];
bool jud = true;  //用于第一个的特判

int main() {
	scanf("%d",&m);
	
	while (m--) {
		scanf("%lld %d",&T,&n);
		for (int i = 1; i <= n; i++) scanf("%d",&a[i]);
		
		for (int i = 1; i <= n; i++) {
			if (jud) p[h].k = a[i], p[h].t = T, vis[a[i]]++, jud = false;   //第一个元素特判
				else
					w++, p[w].k = a[i], p[w].t = T, vis[a[i]]++;   //常规操作
			
			if (vis[a[i]] == 1) s++;		  //看看是不是新的种类
		}	
		
		while (p[w].t - p[h].t >= 86400) {   //出队
			vis[p[h].k]--;   //当前种族个数递减
			if (vis[p[h].k] == 0) s--;   //种族灭绝
			h++;   //队头后移
		}
					
		printf("%lld\n",s);
	}
	
	return 0;
}

crx CSP-J/S RP++

内容: 这个合成医疗保健数据集的创建是为了作为数据科学、机器学习和数据分析爱好者的宝贵资源。 灵感: 医疗保健数据通常很敏感,并受隐私法规的约束,因此难以访问以进行学习和实验。为了解决这一差距,我利用 Python 的 Faker 库生成了一个数据集,该数据集反映了医疗保健记录中常见的结构和属性。通过提供这些合成数据,我希望促进医疗保健分析领域的创新、学习和知识共享。 表格信息: 每列都提供有关患者、其入院情况和提供的医疗保健服务的特定信息,使此数据集适用于医疗保健领域的各种数据分析和建模任务。以下是数据集中每一列的简要说明 - 名字:此列表示与医疗保健记录关联的患者的姓名。 年龄:患者入院时的年龄,以年表示。 性:指示患者的性别,“男性”或“女性”。 血型:患者的血型,可以是常见的血型之一(例如,“A+”、“O-”等)。 医疗状况:此列指定了与患者相关的主要医疗状况或诊断,例如“糖尿病”、“高血压”、“哮喘”等。 入学日期:患者入住医疗机构的日期。 医生:在患者入院期间负责护理的医生的姓名。 医院:标识患者收治的医疗机构或医院。 保险提供商:此列指示患者的保险提供商,可以是多个选项之一,包括“Aetna”、“Blue Cross”、“Cigna”、“UnitedHealthcare”和“Medicare”。 账单金额:患者在入院期间为他们的医疗保健服务开具的账单金额。这表示为浮点数。 房间号:患者入院期间入住的房间号。 入场类型:指定入院类型,可以是“紧急”、“选择性”或“紧急”,以反映入院的情况。 出院日期:患者从医疗机构出院的日期,基于入院日期和实际范围内的随机天数。 药物:确定患者在入院期间开具或服用的药物。例子包括“阿司匹林”、“布洛芬”、“青霉素”、“扑热息痛”和“立普妥”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值