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 }
     
    
    
    功不成,身已退
  • 相关阅读:
    点击某个内容复制到粘贴板
    滚动条全局样式
    23个Python爬虫开源项目代码:爬取微信、淘宝、豆瓣、知乎、微博等
    爬虫数据清洗
    邮件二次验证
    mysql基础语句
    orm操作
    解决跨域请求
    第二十一章 线程局部存储区
    第二十章 DLL高级技术
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2969186.html
Copyright © 2011-2022 走看看