2021安徽省大学生程序设计竞赛正式赛:F 道路维修

题目描述

有一条无限长的道路,道路可以近似看做一条直线。道路上有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;
}

运行结果:

运行结果

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是路人贾啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值