cpp
#include<iostream>
#include<unordered_map>
#include<unordered_set>
#include<bits/stdc++.h>
using namespace std;
int n;
unordered_map<int, vector<vector<int>>> datas;
unordered_map<int, vector<int>> risks;//value代表每个地区的风险时间
bool check(int r,int d1,int d) {
//r为地区 d1-d必须位于r的风险区域内
vector<vector<int>> result;
for (int num : risks[r]) {
if (result.size() == 0) {
result.push_back({ num,num + 6 });
}
else {
if (result[result.size() - 1][1] >= num-1) {
int start = result[result.size() - 1][0];
int end = result[result.size() - 1][1];
result.pop_back();
result.push_back({ min(start,num),max(end,num+6) });
}
else {//不重合
result.push_back({num,num+6});
}
}
}
//现在每一个区域之间都是离散的
for (vector<int> qj : result) {
if (qj[0] <= d1 && d <= qj[1]) {
return true;
}
}
return false;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
int r, m;
cin >> r >> m;
while (r--) {
int p;
cin >> p;
//加入风险时间
risks[p].push_back(i);
}
while (m--) {
int d, u, r;
cin >> d >> u >> r;
datas[i].push_back(vector<int>({ d,u,r }));
}
//处理当天信息
unordered_set<int> res;
//遍历七日的漫游数据
for (int j = i-6; j <=i; j++) {
if (j < 0) continue;
for (vector<int> message : datas[j]) {
int d1 = message[0];//到达日期
int d = i;
int u = message[1];//用户
int r = message[2];//地区
if (d1 <= i && d1 > i - 7) {
if (check(r, d1, d)) {
res.insert(u);
}
}
}
}
vector<int> result = vector<int>(res.begin(), res.end());
sort(result.begin(), result.end());
cout << i << " ";
for (int num : result) {
cout << num << " ";
}
cout << endl;
}
}
70代码:超时原因为区间不需要保存所有 只保存最新的就可以 因为过7天之后 前面的区间一定不再是风险区间了不需要保存 ,只需要保存最新的信息即可;