疫情的人员管理

solve actually problem!

现在有一套人员流动风险管理系统,需要实现如下接口:

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 非严格递增顺序
  • 同一天中,IncreaseRiskDecreaseRisk'调用排在所有 travel 调用之前,Query调用排在所有其他调用之后。
  • 同一天同一地区调用 IncreaseRiskDecreaseRisk的次数之和不会超过一次(即风险不会来回切换)。
  • 调用IncreaseRiskDecreaseRisk一定会产生风险切换(比如不会出现已是高风险的地区再调用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;
};