区间覆盖(线段树)
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 }
以上是关于区间覆盖(线段树)的主要内容,如果未能解决你的问题,请参考以下文章