题目描述
有一条无限长的道路,道路可以近似看做一条直线。道路上有N个部分需要维修,第i个部分的维修的位置是Vi,Xi时间开始维修,直到Yi时间维修结束。有Q个维修工人,第i个工人的上班的时间是Ai,下班时间是Bi,从Ai时间开始,他负责所有维修位置在[Li,Ri]范围的道路,直到Bi时间结束。他想要知道他上班的每一分钟是否都在进行维修工作,你能编写一个程序回答他吗?
输入
第一行一个整数N,接下来N行,每行三个整数Vi,Xi,Yi。
下一行一个整数Q,接下来Q行,每行四个整数Li,Ri,Ai,Bi。
1 <= N,Vi,Q <= 1 0 5 10^5 105,
1<= Xi <= Yi <= 1 0 5 10^5 105
1 <= Li <= Ri <= 1 0 5 10^5 105,
1<= Ai <= Bi <= 1 0 5 10^5 105
输出
输出Q行,如果答案为是,输出“Yes”,否则输出“No”
样例输入
4
5 3 3
2 4 5
3 1 2
5 2 3
4
2 3 2 2
1 4 2 3
2 5 2 4
3 5 1 5
样例输出
Yes
No
Yes
No
提示
第1个工人在时间2维修,所以输出Yes。
第2个工人只在时间2维修,时间3没有维修,所以输出No。
第3个工人在时间2,3,4维修,所以输出Yes。
第4个工人只在时间1,2,3维修,时间4,5没有维修,所以输出No。
题解
解题思路
首先很容易想到,因为维修的位置和时间相关联,所以可以使用一个二维数组来进行标识,将需要维修的位置出把需要维修的时间进行标注。之后根据工人维修的地点和时间进行判断工人上班的每一分钟是否都在进行维修工作。
具体解法
首先输入需要维修的部分的数量,再输入每个部分的位置和需要维修的时间段。在二维数组上进行标注为1。如下图所示。
之后输入每个工人的维修位置和上班时间和下班时间,判断时候工人上班的每一分钟是否都在进行维修工作。
判断方法:
找到需要维修的位置,从工人开始上班的时间开始,如果需要维修的位置范围内存在需要维修的位置,则遍历下一个时间,直到所有的时间段都遍历完成。统计有需要维修的位置的时间的数量,如果和工人的工作时间段相同,则输出“Yes”,否则输出“No”。
具体流程演示:
第一个工人:
Sum = 1,所有的时间都在工作
第二个工人:
Sum = 1,小于工人工作的时间段,工人上班的每一分钟不都是在进行维修工作。
代码
#include <iostream>
#include<vector>
using namespace std;
const int MAXSIZE = 1000;
vector<vector<int>> viandti(MAXSIZE, vector<int>(MAXSIZE));
string judge(vector<vector<int>> arr,int L,int R,int A,int B)
{
int temp = 0;
for (int i = A; i <= B; i++)
{
int sum = 0;
//i 时间
// j 地点
for (int j = L; j <= R; j++)
{
sum += arr[j][i];
}
if (sum > 0)
{
temp++;
}
}
if (temp == B - A + 1)
{
return "Yes";
}
{
return "No";
}
}
int main()
{
int N;
cin >> N;
for (int i = 1; i <= N; i++)
{
int Vi, Xi, Yi;
cin >> Vi >> Xi >> Yi;
for (int j = Xi; j <= Yi; j++)
{
viandti[Vi][j] = 1;
}
}
int Q;
cin >> Q;
for (int i = 1; i <= Q; i++)
{
int L, R, A, B;
cin >> L >> R >> A >> B;
cout << judge(viandti, L, R, A, B) << endl;;
}
return 0;
}