线段树练习四

原创 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);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

机器学习(周志华) 参考答案 第四章 决策树

机器学习(周志华) 参考答案 第四章 决策树 机器学习(周志华西瓜书) 参考答案 总目录 http://blog.csdn.net/icefire_tyh/article/details/520...
  • icefire_tyh
  • icefire_tyh
  • 2016年08月01日 00:39
  • 8561

【线段树】Codevs线段树练习1.2.3及线段树学习笔记

今天发现不学线段树不行了于是干了一天线段树。当然先从弱弱的codevs开始。 没有看别的资料,看了看wikipedia上的线段树模板和简单的介绍就会了。。。 其实就是区间二分存储,每一次修改其中任意点...
  • CreationAugust
  • CreationAugust
  • 2014年11月05日 14:00
  • 1199

Thinking in Java(第四版)习题--第六章

练习1 package access; //在某个包中创建一个类,在这个类所处的包的外部创建该类的一个实例。 public class Test1{ public Test1 (){ ...
  • tcitry
  • tcitry
  • 2013年09月30日 14:59
  • 2425

【SSLGZ 2647】线段树练习四

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

线段树应用示例程序

  • 2017年05月18日 14:52
  • 2.39MB
  • 下载

ZKW线段树源码-pascal

  • 2015年03月10日 19:21
  • 104KB
  • 下载

线段树入门

  • 2015年05月03日 11:01
  • 204KB
  • 下载

线段树学习资料

  • 2013年09月25日 23:04
  • 161KB
  • 下载

线段树资料

  • 2014年02月18日 22:52
  • 990KB
  • 下载

hdu acm1166线段树

  • 2014年05月03日 18:41
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线段树练习四
举报原因:
原因补充:

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