每日一题——海港(结构体+vector)

_谦言万语 2022-04-19 17:12:19
加精

P2058 [NOIP2016 普及组] 海港 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

//1.43s.以船为整体
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#define MOD 10000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;

int s,n,j=1,tt[300005];//j是用于定位到第几艘船,tt用于判定是否超过86400
int sum[300005];//a存船的到达时间,sum存国籍人数
queue<int> q;

struct node {
	int t,k;//t到达时间,k顾客数
	vector<int> h;//h存顾客的国籍
} a[100005];

int main() {
	cin>>n;
	cin>>a[1].t>>a[1].k;
	tt[j]=a[1].t;//初始化tt[1](不能初始为0)
	//一开始的船的人肯定都能算进去
	for(int i=1; i<=a[j].k; i++) {
		int x;
		cin>>x;
		a[j].h.push_back(x);
		sum[x]++;
		if(sum[x]==1) s++;//新来的国籍就加1
	}
	cout<<s<<endl;
    //第二艘船开始要与初始的tt进行比对判定
	for(int i=2; i<=n; i++) {
		cin>>a[i].t>>a[i].k;
		//1与86401之差恰好86400,所以要清除第一艘船
		while(a[i].t - tt[j] >= 86400) {
			for(int hh=0; hh<a[j].h.size(); hh++) {//这艘船的所有乘客都在数组sum中清空
				int x=a[j].h[hh];
				sum[x]--;
				if(sum[x]==0) s--;//如果为0,该国籍倒闭了,就-
			} 
			j++;//边界时间转到下一艘船的到达时间
			tt[j]=a[j].t;//更新tt[]
		}
		//输入这艘船的顾客信息并进行录入
		for(int hh=1; hh<=a[i].k; hh++) {
			int x;
			cin>>x;
			a[i].h.push_back(x);
			sum[x]++;
			if(sum[x]==1) s++;
		}
		cout<<s<<endl;
	}
	return 0;
}

 

...全文
77 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

51,721

社区成员

发帖
与我相关
我的任务
社区描述
和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
算法数据结构leetcode 个人社区
社区管理员
  • 执 梗
  • Dream-Y.ocean
  • ღCauchyོꦿ࿐
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

 刷题!

试试用AI创作助手写篇文章吧