CSP第27次认证 T3:防疫大数据

题目

直接暴力模拟。首先对于每一个地区,选择用 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;
}


posted @ 2022-10-09 22:39  雪之下,树之旁  阅读(630)  评论(0编辑  收藏  举报