直接暴力模拟。首先对于每一个地区,选择用 map 进行离散化,并直接存储其对应区间信息,使用 pair 即可。
在新输入一个疫情地区时,检查是否与原天数相连即可(同时注意判断 begin 和 end 是否相等,因为一个地区,要不然就是非疫情区域(相等),要不然就是至少 \(7\) 天的长度)。
之后,对于每天的列表,直接暴力查找前 \(7\) 天(是 \(now - 6\), 题目说的不是非常清楚)的所有人,判断那个人当天是否与现在处在同一个疫情区间,同时注意判断时效性(必须是 \(7\) 天以内的到访记录)。
最后考虑消息可能重复,而且输出时要排序,此处使用 set 即可满足要求。
#include <bits/stdc++.h>
using namespace std;
#define N 1001
#define ll long long
template <class T>
inline void read(T& a){
T x = 0, s = 1;
char c = getchar();
while(!isdigit(c)){ if(c == '-') s = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + (c ^ '0'); c = getchar(); }
a = x * s;
return ;
}
map <ll, pair<int, int> > G;
int n;
int r[N], m[N], p[N][N];
int d[N][N], u[N][N], reg[N][N];
bool vis[N];
set <int> s;
int main(){
// freopen("hh.txt", "r", stdin);
read(n);
for(int i = 0; i < n; i++){ // i: 当前日期
read(r[i]), read(m[i]);
s.clear();
for(int j = 1;j <= r[i]; j++){
read(p[i][j]);
int end = i + 6;
int pre1 = G[p[i][j]].first;
int pre2 = G[p[i][j]].second;
if(pre1 == pre2) G[p[i][j]] = make_pair(i, end);
else if(pre2 >= i - 1) G[p[i][j]] = make_pair(pre1, end);
else G[p[i][j]] = make_pair(i, end);
}
for(int j = 1; j <= m[i]; j++){
read(d[i][j]), read(u[i][j]), read(reg[i][j]); // u 用户
}
for(int day = max(i - 6, 0); day <= i; day++){
for(int j = 1; j <= m[day]; j++){
if(d[day][j] <= i - 7) continue ;
int pre = G[reg[day][j]].first;
int end = G[reg[day][j]].second;
if(i >= pre && i <= end && d[day][j] >= pre && d[day][j] <= end && end != pre) s.insert(u[day][j]);
}
}
printf("%d ", i);
for(set<int>::iterator it = s.begin(); it != s.end(); it++){
printf("%d ", *it);
}
cout << endl;
}
return 0;
}
标签:27,end,疫情,int,T3,read,pair,CSP,getchar
From: https://www.cnblogs.com/wondering-world/p/16773989.html