疫情的人员管理
in Algorithm Pageviews
现在有一套人员流动风险管理系统,需要实现如下接口:
RiskMonitor(vector<int> people):系统初始化,people[i]
的下标表示人员编号,值表示所在区域的编号,初始时所有的地区(包括没有人的地区)都为低风险,系统初始为第 0 天。
Travel(int date, int peopleId, int regionId):在第date
天,人员 peopleId
前往目的地 regionId
旅行。
- 如果该人员已经在地区
regionId
则停留在原地,并返回 1 - 如果该人员已经被隔离,或目的地此时为高风险,则停留在原地,返回 -1
- 否则旅行成功,该人员从
date
天(含) 开始位于新地区,返回 0
IncreaseRisk(int date, int regionId):在第 date
天(含)时,地区 regionId
变为高风险。当前该区域人员立即被隔离。
DecreaseRisk(int date, int regionId):在第 date
天(含)时,地区 regionId
变为低风险。
- 如果该地区从
date
天开始连续 14 天处于低风险,则第date + 14
天(含),所有该地区的被隔离人员立即解除隔离。
Query(int date):在第 date
天(含)时,按照人员编号进行升序,依次返回每个人被隔离的天数。
输入保证
- 所有接口调用按照
date
非严格递增顺序 - 同一天中,
IncreaseRisk
或DecreaseRisk'
调用排在所有travel
调用之前,Query
调用排在所有其他调用之后。 - 同一天同一地区调用
IncreaseRisk
和DecreaseRisk
的次数之和不会超过一次(即风险不会来回切换)。 - 调用
IncreaseRisk
或DecreaseRisk
一定会产生风险切换(比如不会出现已是高风险的地区再调用IncreaseRisk
的情况)
输入
每行表示一个函数调用,初始化函数仅仅首行调用一次,累计函数调用不会超过 1000 次
1 <= people.size() <= 1000
0 <= peopleId <= 1000
0 <= peopleId[i] <= 1000
0 <= regionId <= 1000
0 <= date <= 1000
样例1
RiskMonitor([1, 1])
Travel(2, 1, 0)
IncreaseRisk(5, 1)
Query(5)
Travel(19, 1, 1)
DecreaseRisk(21, 1)
Query(22)
Travel(25, 1, 1)
Travel(35, 0, 0)
Query(37)
输出
null
0
null
[1, 0]
-1
null
[18, 0]
0
0
[30, 0]
代码实现如下:
#include <bits/stdc++.h>
using namespace std;
constexpr int N = 1005;
class Solution {
public:
RiskMonitor(const vector<int> &people) : n(people.size())
{
m_belongRegion.resize(N, vector<int>(N));
m_regionRisk.resize(N, vector<bool>(N, false));
m_peopleSep.resize(N, vector<bool>(N, false));
for (auto i = 0; i < n; i++) {
for (auto j = 0; j < N; j++) {
m_belongRegion[i][j] = people[i];
}
}
}
int Travel(int date, int peopleId, int regionId)
{
if (m_belongRegion[peopleId][date] == regionId) {
return 1;
}
if (m_regionRisk[regionId][date] || m_peopleSep[peopleId][date]) {
return -1;
}
for (auto i = date; i < N; i++) {
m_belongRegion[peopleId][i] = regionId;
}
return 0;
}
void IncreaseRisk(int date, int regionId)
{
for (auto i = date; i < N; i++) {
m_regionRisk[regionId][i] = true;
}
for (int i = 0; i < n; i++) {
if (m_belongRegion[i][date] != regionId) {
continue;
}
for (int j = date; j < N; j++) {
m_peopleSep[i][j] = true;
}
}
}
void DecreaseRisk(int date, int regionId)
{
for (int i = date; i < N; i++) {
m_regionRisk[regionId][i] = false;
}
for (int i = 0; i < n; i++) {
if (m_belongRegion[i][date] != regionId) {
continue;
}
for (int j = date + 14; j < N; j++) {
m_peopleSep[i][j] = false;
}
}
}
vector<int> Query(int date)
{
vector<int> res;
for (int i = 0; i < n; i++) {
int cnt = 0;
for (int j = 0; j <= date; j++) {
if (m_peopleSep[i][j]) {
cnt++;
}
}
res.push_back(cnt);
}
return res;
}
private:
int n;
vector<vector<int>> m_belongRegion;
vector<vector<<bool>> m_regionRisk;
vector<vector<bool>> m_peopleSep;
};