-
作为一道比较简单的第三题,这个题目的核心是对于每个地域的离散化判断,更新天数的时候根据新一天的风险地区的新增来进行离散化地区的风险区域
-
还有就是在多重循环之下,我们对于每一天还需要检查之前6天的情况,才能生成今日的风险用户,并且由于有多个用户存在的情况,用
set
进行去重
#include <bits/stdc++.h>
#define endl '\n'
typedef long long ll;
using namespace std;
const int N = 1e3 + 5;
map <int, pair<int, int>> zone;
int r[N], m[N], p[N][N], n;
int day[N][N], user[N][N], re[N][N];
void solve() {
cin >> n;
set<int> ans;
for (int i = 0; i < n; ++ i) {
ans.clear();
cin >> r[i] >> m[i];
for (int j = 0; j < r[i]; ++j) {
cin >> p[i][j];
int pre1 = zone[p[i][j]].first;
int pre2 = zone[p[i][j]].second;
int end = i + 6;
if (pre1 == pre2) {
zone[p[i][j]] = {i, end};
continue;
}
if (i > pre2 + 1) zone[p[i][j]] = {i, end};
else zone[p[i][j]] = {pre1, end};
}
for (int j = 0; j < m[i]; ++j) {
cin >> day[i][j] >> user[i][j] >> re[i][j];
}
// if (i == 2)
// cout << "Map" << zone[1].first << ":" << zone[1].second << endl;
for (int x = max(0, i-6); x <= i; ++x) {
for (int j = 0; j < m[x]; ++j) {
// if (i==2) cout << "re" << re[x][j] << " " <<endl;
if (day[x][j] <= i - 7) continue;
if (zone[re[x][j]].first != zone[re[x][j]].second && day[x][j] <= zone[re[x][j]].second
&& zone[re[x][j]].first <= day[x][j] && i >= zone[re[x][j]].first &&
i <= zone[re[x][j]].second) {
ans.insert(user[x][j]);
}
}
}
cout << i << " ";
for (auto x : ans) {
cout << x << " ";
} cout << endl;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
solve();
return 0;
}