各位大神们。。。。拜托啦。。。。。
为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
样例输出
298
[解决办法]
#include<iostream>
using namespace std;
int ans,L,M,line[10001];
int main()
{
cin>>L>>M;int l,r,rp=-1,flag=1;
//rp is right point of a interval,we use rp to maintain a union set of all intervals.
for(int i=1;i<=M;i++){
cin>>l>>r;
line[l]=r;
}//input data.
for(int i=0;i<=L;i++){
if(line[i]){
flag=0;
rp=max(line[i],rp);
}
if(i>rp)flag=1;
if(flag)ans++;
}//maintained rp and calculated answer.
cout<<ans<<endl;
return 0;
}
#include<iostream>
using namespace std;
int a[10000],b[101];
void kuaipai(int*b,int q,int p){
if(q>=p )
return ;
int i=q,j=q,r=b[p];
while( j<p ){
if(b[j]<b[p] )
swap(b[i++],b[j]);
j++;
}
swap(b[p],b[i]);
kuaipai(b,q,i-1);
kuaipai(b,i+1,p);
}
int main(){
int l,m,n;
cin>>l>>m;
for( int i=0;i<m;i++) {cin>>b[i];cin>>a[b[i]];}
kuaipai(b,0,m-1);
n=0;
for(int i=0 ;b[i];i++ ){
int k=b[i];
while(a[b[i]]>b[i+1]&&b[i+1] )
i++;
n+=( a[b[i]]-k) ;
}
cout<<l-n-1<<endl;
}