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 }
     
    
    
    功不成,身已退
  • 相关阅读:
    ASIHTTPRequest系列(一):同步和异步请求
    浅谈SQL Server2005的几种分页方法
    在iphone越狱机器中使用Hook
    iphone4 双击Home键 截获
    xcode中打印毫秒时间
    获得一个不错的电子书翻页效果,和大家分享
    【转】iOS平台XML解析类库对比和安装说明
    xml的sax解析方法
    svn 日常使用技巧以及vim profile的配置
    自制固件iOS4.1刷机、解锁教程
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2969186.html
Copyright © 2011-2022 走看看