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;
}