校门外的树
校门外的树
http://www.nowcoder.com/questionTerminal/0e8cfc82936048769af45967f3c4ef7e
这数据O(n^2) 模拟 ,我不想tle
看区间,区间覆盖的贪心,多想想,人总是贪心的
思路:
不妨把左端点从小到大排序,此时就是把覆盖的区间进行合并
比如
合并过后区间是[l1,r2]
但要注意像下面这种情况 第一个区间包含第二个区间 此时我们就无需改变右指针
所以right=max(a[i].r,right);
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=5e7+5;
struct node {
ll l,r;
}a[maxn];
bool cmp(node p,node q)
{
if (p.l==q.l)
{
return p.r<q.r;
}
return p.l<q.l;
}
int main()
{
ll m,n;
cin>>m>>n;
for (int i=1;i<=n;++i)
{
cin>>a[i].l>>a[i].r;
}
sort(a+1,a+n+1,cmp);
ll ans=0;
ll left=a[1].l;
ll right=a[1].r;
for (int i=2;i<=n;++i)
{
if (a[i].l<=right)
{
right=max(a[i].r,right);
}
else
{
ans+=(right-left+1);
left=a[i].l;
right=a[i].r;
}
}
ans+=(right-left+1);///处理下最后一段区间
cout<<m-ans+1<<endl;
}