F: Baldheaded stronger

来源:互联网 发布:网络上芒果是什么意思 编辑:程序博客网 时间:2024/06/16 05:26

题解

这个可以用,结构体排序做,线段树新,树状数组。当初给我们开题时用的结构体排序做的。比赛完了的时候,学长讲了最简单的方法,数组前缀和,加标记。就很简单,代码量也少。
Baldheaded stronger

                        时间限制: 1 Sec  内存限制: 128 MB                        提交: 161  解决: 20                        [提交][提交的状态][讨论]                        题目描述

东软的校门外长度为L的马路上很有多颗树,每两棵相邻的树之间的间隔是1米。我们可以简化的把马路看成一个数轴,马路的一端在数轴中x=0的位置,另一端在x=L的位置;数轴上的每个整数点即0,1,2,3……L,都种有一棵树。现在光头强——平头!出现了。他要把其中一些区域中的树全部砍走。已知任一区域中的起点和终点都是整数,区域之间可能有重合的部分。现在你的任务是计算这些树被平头砍走后,马路上还剩下多少棵树。
输入

题目数据有多组,对于每组的数据:

第一行输入两个数L(1 <= L <= 500000)和m(1 <= m <= 10000)。L代表马路的长度,m代表平头要砍树的区域数目。

然后接下来m行中每行有两个数left和right(0 <= left <= right <= L),表示一个区域的起点和终点坐标。
输出

对于每组测试数据输出一个数,表示马路上剩余树的数目。
样例输入

500 3
150 300
100 200
470 471
样例输出

298
提示

平头强!平头很强!

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N=5e5+10;int main(){    int n,m,l,r,ans;    int a[N];    while(cin>>n>>m)    {        ans=0;        memset(a,0,sizeof(a));        while(m--)        {            cin>>l>>r;           a[l]++;          ///把起始标记为1,末尾的后一位标记为-1;            a[r+1]--;    ///求前缀和的时候就能把区间砍掉的树标记掉,同时在未区间后前缀和重新标记为0,代表没砍;        }        for(int i=1; i<=n; i++)        {           a[i]=a[i-1]+a[i];        }        for(int i=0;i<=n;i++)        {            if(!a[i])         ///记录没砍的树,数组为0就ans++                ans++;        }        cout<<ans<<endl;    }    return 0;}