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