zoukankan      html  css  js  c++  java
  • NYOJ522 Interval

    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 }
     
    
    
    功不成,身已退
  • 相关阅读:
    POJ1239
    HDU 2829 四边形不等式优化
    返回数字二进制的最高位位数o(n)
    矩阵快速幂 模板
    HDU4718 The LCIS on the Tree(LCT)
    HDU4010 Query on The Trees(LCT)
    HDU3487 Play With Chains(Splay)
    CF444C DZY Loves Colors
    HDU4836 The Query on the Tree(树状数组&&LCA)
    HDU4831&&4832&&4834
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2969186.html
Copyright © 2011-2022 走看看