CSP-防疫大数据

是不是最简单的!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 
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);
	}
}

你可能感兴趣的:(刷题,c++,开发语言)