校门外的树
校门外的树
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; }