问题描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数 轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已 知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树 都移走后,马路上还有多少棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已 知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树 都移走后,马路上还有多少棵树。
输入格式
输入文件的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点 和终止点的坐标。
输出格式
输出文件包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例输入
500 3
150 300
100 200
470 471
150 300
100 200
470 471
样例输出
298
数据规模和约定
对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。
对于其它的数据,区域之间有重合的情况。
挺基础的一道线段树的题目,直接附上我的ac代码:
1 #include<iostream> 2 using namespace std; 3 struct node{ 4 int l,r,w; 5 }tree[50050]; 6 void create(int i,int left,int right){ 7 tree[i].l=left;tree[i].r=right; 8 if(left==right){ 9 tree[i].w=1; 10 return; 11 } 12 int mid=(left+right)>>1; 13 create(i<<1,left,mid); 14 create((i<<1)|1,mid+1,right); 15 tree[i].w=tree[i<<1].w+tree[(i<<1)|1].w; 16 } 17 void update(int i,int left,int right){ 18 if(tree[i].l==tree[i].r){ 19 tree[i].w=0;return; 20 } 21 if(tree[i].l==left&&tree[i].r==right){ 22 tree[i].w=0;return; 23 } 24 if(tree[i].w==0) return; 25 int mid=(tree[i].l+tree[i].r)>>1; 26 if(right<=mid){ 27 update(i<<1,left,right); 28 }else if(left>mid){ 29 update((i<<1)|1,left,right); 30 }else{ 31 update(i<<1,left,mid); 32 update((i<<1)|1,mid+1,right); 33 } 34 tree[i].w=tree[i<<1].w+tree[(i<<1)|1].w; 35 } 36 int find(int i,int left,int right){ 37 if(tree[i].w==0)return 0; 38 if(left==right) return 1; 39 if(tree[i].l==left&&tree[i].r==right){ 40 return tree[i].w; 41 } 42 int mid=(tree[i].l+tree[i].r)>>1; 43 if(right<=mid){ 44 return find(i<<1,left,right); 45 }else if(left>mid){ 46 return find((i<<1)|1,left,right); 47 }else{ 48 return find(i<<1,left,mid)+find((i<<1)|1,mid+1,right); 49 } 50 } 51 int main(){ 52 int L,M,le,ri; 53 cin>>L>>M; 54 create(1,0,L); 55 while(M--){ 56 cin>>le>>ri; 57 update(1,le,ri); 58 } 59 cout<<find(1,0,L)<<endl; 60 return 0; 61 }