区间覆盖(线段树)

Posted 范仁义

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间覆盖(线段树)相关的知识,希望对你有一定的参考价值。

区间覆盖(线段树)

X轴上方有若干条平行于X轴的线段,求这些线段能够覆盖X轴的总长度?
输入格式
第一行一个数n(n<=100000),表示线段个数;
接下来n行,每行两个整数a[i],b[i](-10^8<=a[i],b[i]<=10^8),代表一个线段的两个端点输出覆盖X轴的长度

输入样例
2
10 12
2 4
输出样例
4

 

 1 /*
 2 样例:
 3 有两段线
 4 1 2
 5 2 3 
 6 */
 7 
 8 #include <bits/stdc++.h>
 9 using namespace std;
10 void print();
11 struct node{
12     int start,end;
13     int cover;
14 }segTree[100];
15 
16 //创建线段树 
17 void build(int root,int start,int end){
18     segTree[root].start=start;
19     segTree[root].end=end;
20     segTree[root].cover=0;
21     if(start+1<end){
22         int mid=(start+end)/2;
23         build(2*root,start,mid);
24         build(2*root+1,mid,end);
25     }
26 }
27 
28 //1-4怎么办 
29 //插入线段,线段的左右端点分别为left和right 
30 void insert(int root,int left,int right){
31     //这里还是空的才需要插入 
32     if(segTree[root].cover==0){
33         int mid=(segTree[root].start+segTree[root].end)/2;
34         if(left==segTree[root].start&&right==segTree[root].end){
35             segTree[root].cover=1;
36         }
37         else if(right<mid){//去左子树中找 
38             insert(2*root,left,right);
39         }
40         else if(left>mid){//去右子树中找 
41             insert(2*root+1,left,right);
42         }
43         else{//如果没有正好合适的,就把区间给拆了 
44             insert(2*root,left,mid);
45             insert(2*root+1,mid,right);
46         } 
47     }
48 } 
49 
50 
51 int count(int root){
52     if(segTree[root].cover==1){
53         return segTree[root].end-segTree[root].start;
54     }
55     //又不等于1,又是叶子节点,肯定给你退出 
56     else if(segTree[root].end-segTree[root].start==1){
57         return 0;
58     }
59     else{
60         return count(2*root)+count(2*root+1); 
61     }
62 }
63 
64 int main(){
65     build(1,1,5);
66     print();
67     insert(1,1,4);
68     //insert(1,2,3); 
69     print();
70     //cout<<count(1)<<endl;
71     return 0;
72 } 
73 
74 void print(){
75     for(int i=1;i<=7;i++){
76         cout<<segTree[i].start<<" "<<segTree[i].end<<" "<<segTree[i].cover<<endl;
77     }
78     cout<<"-------------------------------------------------------------------------"<<endl;
79 }

 

以上是关于区间覆盖(线段树)的主要内容,如果未能解决你的问题,请参考以下文章

线段覆盖 (线段树)

POJ 3225(线段树)

Mayor's posters POJ - 2528 线段树区间覆盖

Mayor's posters 线段树区间覆盖

POJ 3171 区间最小花费覆盖 (DP+线段树

树链剖分 树