简单的询问--差分数组

Problem A: 简单的询问

Time Limit: 1 Sec Memory Limit: 64 MB

Description

给你N个区间[Li,Ri],有Q个询问。

每个询问问,num这个数是否在给出的某个区间内。

Input

输入第一行有一个正整数T(T<=10),表示组数;

每组数据第一行有两个正整数N,Q(N,Q<=1e5),意义如题;

接下来行每行包含两个正整数Li,Ri(Li<=Ri<=1e6),意义如题;

接下来行每行包含一个整数num(int范围内),意义如题。

Output

对于每个询问,如果num在区间内则输出Yes,否则输出No。

Sample Input

1
4 5
1 3
2 4
4 5
7 8
2
4
6
8
10

Sample Output

Yes
Yes
No
Yes
No

HINT

之前这道题还是卡了很久,只想到了延时标记,但没想到差分数组(该补补啦)

———————————————————————————————————————
差分数组不仅仅是一个优秀的数据结构,还是一种很好的思想
差分数组的功能是修改区间,查询点
修改区间的时间复杂度是O(1),查询点的时间复杂度为O(n)
我们这里要根据数据范围灵活选取方法,不要拘泥于差分数组
这里给大家推荐一篇比较好的博客 http://www.cnblogs.com/aininot260/p/9304521.html


#include <algorithm>
#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
const int maxn = 1e6 + 20;
int  vis[maxn];
int sum[maxn];
int main()
{
    int n, m, t;
    scanf("%d", &t);
    while (t--)
    {
        memset(vis, 0, sizeof vis);
        memset(sum, 0, sizeof sum);
        scanf("%d %d", &n, &m);
        for (int i = 1; i <= n; i++)
        {
            int l, r;
            scanf("%d %d", &l, &r);
            vis[l] += 1;
            vis[r + 1] -= 1;    //延迟标记(不懂的自行百度)
        }
        for (int i = 1; i <= 1000000 + 10; i++) //注意范围
        {
            sum[i] = sum[i - 1] + vis[i];   //用另一个数组存
        }
        for (int i = 1; i <= m; i++)
        {
            int x;
            scanf("%d", &x);
            if (x<0 || x>1e6) //根据题上的要求 把脏数去掉   不然会RE
            {
                printf("No\n");
            }
            else
            {
                if (sum[x] != 0)   //判断是否区间延迟标记了
                {
                    printf("Yes\n");
                }
                else
                {
                    printf("No\n");
                }
            }
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_42137895/article/details/84961964