Interval
时间限制:
2000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
There are n(1 <= n <= 100000) intervals [ai, bi] and m(1 <= m <= 100000) queries, -100000 <= ai <= bi <= 100000 are integers.Each query contains an integer xi(-100000 <= x <= 100000). For each query, you should answer how many intervals convers xi.
-
输入
-
The first line of input is the number of test case.
For each test case,
two integers n m on the first line,
then n lines, each line contains two integers ai, bi;
then m lines, each line contains an integer xi.
输出
- m lines, each line an integer, the number of intervals that covers xi. 样例输入
2 3 4 1 3 1 2 2 3 0 1 2 3 1 3 0 0 -1 0 1
-
样例输出
0 2 3 2 0 1 0
-
很久没写树状数组了,正好看到了,就复习一下,
本题是树状数组-----插线问点的问题
注意写树状数组时候把区间都扩大到大于0的区间上,不能等于0.否则会一直超时,代码如下:
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 using namespace std; 6 7 int num[200005]; 8 9 int lowbit(int i) 10 { 11 return i & (-i); 12 } 13 14 void update(int i, int add) 15 { 16 while(i <= 200001) 17 { 18 num[i] += add; 19 i += lowbit(i); 20 } 21 } 22 23 int getsum(int x) 24 { 25 int ans = 0; 26 while(x > 0) 27 { 28 ans += num[x]; 29 x -= lowbit(x); 30 } 31 return ans; 32 } 33 34 int main() 35 { 36 int T, m, n, s, t, x; 37 scanf("%d", &T); 38 while(T--) 39 { 40 memset(num, 0, sizeof(num)); 41 scanf("%d%d", &m, &n); 42 while(m--) 43 { 44 scanf("%d%d", &s, &t); 45 update(s+100001, 1); 46 update(t+100001+1, -1); 47 } 48 while(n--) 49 { 50 scanf("%d", &x); 51 printf("%d\n", getsum(x+100001)); 52 } 53 } 54 return 0; 55 }