校门外的树

校门外的树

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;

}
全部评论

相关推荐

2024-11-23 22:07
同济大学 Java
贺兰星辰:你这简历完全可以缩到一页,校园工作、自我评价完全可以删了,没人看的;个人技能可以写多点。
点赞 评论 收藏
分享
2024-11-18 13:45
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
7
收藏
分享
牛客网
牛客企业服务