CSP-防疫大数据

文章介绍了一个C++程序,用于处理每日风险地区的消息。程序接收每日更新的风险地区和用户活动信息,判断用户是否在特定日期内处于危险地区,如果满足条件,则将用户列入危险名单。程序通过存储每天的地区风险状态和消息,然后进行检查和处理。
摘要由CSDN通过智能技术生成

是不是最简单的!60行AC!

解题思路

首先:每日的风险地区是实时更新,所以直接将该region放到Today~Today+7之内;
然后:咱采取的思路就是将每条message给他存到每天去。比如<0,1,1>这条message是第0天发来的,那么它被存到0~6天的Msg中。比如<5,4,1>是第7天来的,那么存到7~(5+7-1)天之中。

虽然这样会增加计算判断的message量,但反正这个题也不在乎性能()

代码

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

struct msg {
	int day;
	int user;
	int region;
};
int Day_n;
const int N = 1005;
set<int> Rgn[N];
set<int> Usr[N];
vector<msg> Msg[N];

bool check(const int &TD, msg ms) { //检查是否满足可被列入危险名单
	if (ms.day > (TD - 7) && ms.day <= TD) {
		for (int k = ms.day; k <= TD; k++) { //该地址在今天是危险地区
			if (k < 0 || Rgn[k].find(ms.region) == Rgn[k].end())
				return false;//不是危险地区
		}
		return true;
	} else {
		return false;
	}
}

void deal(const int &TD) { //Today
	printf("%d ", TD);
	for (int i = 0; i < Msg[TD].size(); i++) { //遍历TD的每一条msg
		if (check(TD, Msg[TD][i])) { //该条消息符合
			Usr[TD].insert(Msg[TD][i].user);
		}
	}
	for (auto iter = Usr[TD].begin(); iter != Usr[TD].end(); iter++) {
		cout << *iter << " ";
	}
	if (TD != (Day_n - 1))
		printf("\n");

}

int main() {
	//freopen("in.txt", "r", stdin);
	int r_n, m_n, r;
	msg ms;

	cin >> Day_n;
	for (int i = 0; i < Day_n; i++) {
		cin >> r_n >> m_n;
		for (int j = 0; j < r_n; j++) { //每天都会收到region
			cin >> r;
			for (int k = 0; k < 7; k++) {
				//表示需要唯一,且由于每天都会发送当天的region信息,所以就是0*-7
				Rgn[i + k].insert(r);
			}
		}
		for (int j = 0; j < m_n; j++) { //每天收到的msg
			cin >> ms.day >> ms.user >> ms.region;
			for (int k = 0; i + k < ms.day + 7; k++)
				Msg[i + k].push_back(ms);
		}
		deal(i);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值