线段树练习四

原创 2017年09月13日 20:53:04

输入输出解释:

第一行两个数n,m
表示长度为n的线段
接下来的m行读入x,y
表示在[x,y]的区间中加入一条线段
最后一行两个数x,y
输出x到y这一个区间中的线段数
保证x+1=y
样例输入 :
7 5
2 3
2 5
2 4
4 5
2 4
2 4
样例输出:
3
做法:
当某线段能够完整覆盖某个结点所对应的区间时,则不再二分。因此要统计某个单位区间上重叠的线段总数,必须把从叶结点到根结点路径上所有结点的count域累加
代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int c[500000],n,m,e=0;

void insert(int t,int l,int r,int a,int b)
{
    int m=(l+r) / 2;
    if (l==a && r==b)
    {
        c[t]++;
    }
    else
    {
        if (b<=m)   insert(t*2,l,m,a,b);
        else if (a>=m)  insert(t*2+1,m,r,a,b);
        else
        {
            insert(t*2,l,m,a,m);
            insert(t*2+1,m,r,m,b);
        }
    }
}

void find(int t,int l,int r,int a,int b)
{
    int m=(l+r) / 2;
    if (l==a && r==b)
    {
        e=t;
        return;
    }
    else
    {
        if (b<=m)   find(t*2,l,m,a,b);
        else if (a>=m)  find(t*2+1,m,r,a,b);
        else
        {
            find(t*2,l,m,a,m);
            find(t*2+1,m,r,m,b);
        }
    }
}

int count(int t)
{
    int sum=0;
    while (t>0)
    {
        sum+=c[t];
        t/=2;
    }
    return sum;
}

int main()
{
    scanf("%d%d",&n,&m);
    int x,y;
    for (int p=1;p<=m;p++)
    {       
        scanf("%d%d",&x,&y);
        insert(1,1,n,x,y);
    }
    scanf("%d%d",&x,&y);
    find(1,1,n,x,y);    
    int ans=count(e);
    printf("%d",ans);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【SSLGZ 2647】线段树练习四

问题描述 在平面内有一条长度为n的线段(也算一条线段),可以对进行以下2种操作: 1 x y 把从x到y的再加一条线段 2 x 查询从x到x+1有多少条线段 输入 第一行两个数n,m ...

线段树高级数据结构实现

  • 2016年05月26日 13:20
  • 2KB
  • 下载

Codevs 4927 线段树练习5

4927 线段树练习5 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有n个数和5种操作 add a b c:把区间[a,...

线段树代码

  • 2014年09月11日 12:03
  • 26KB
  • 下载

竞选海报(线段树加离散化)

  • 2013年05月11日 18:25
  • 2KB
  • 下载

杭电hdu 1394 Minimum Inversion Number 线段树练习

http://acm.hdu.edu.cn/showproblem.php?pid=1394 刚看的时候感觉和线段树并没有关系啊,但是看别人的解题报告却都用了很多的方法,还有用的就是线段树,树状数组...

线段树学习步骤

  • 2013年08月09日 20:28
  • 773KB
  • 下载

帮助理解的线段树

  • 2013年07月29日 17:06
  • 166KB
  • 下载

Code Vs 1082 线段树练习 3

树状数组+线段树
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线段树练习四
举报原因:
原因补充:

(最多只允许输入30个字)