- 这是一个线段性质的问题。注意如何从左边到右边,依次处理了基本的三个线段关系,以及i达到最后一个的时候怎么判断是否能覆盖。(很重要)
#include<bits/stdc++.h> using namespace std; int main(){ int n; long L; long xi,yi; cin>>n>>L; vector<pair<int,int>> v; for(int i =0; i< n;i++){ cin>>xi>>yi; v.push_back({xi,yi}); } sort(v.begin(),v.end(),[](pair<long,long> a, pair<long,long> b){ if(a.first==b.first){ return a.second>b.second; }else{ return a.first<b.first; } }); int pre = 0, last = 0, i =0, ans = 0; while(i<v.size()){ while(i<v.size()&&v[i].first<=pre){//处理堆叠情况以及下一次的连续链接情况 last = max(last,v[i].second);//前面是处理最后一条 i++; } pre = last;//进行下一步是否有缺口判断 ans++; if(i<v.size()&&v[i].first>pre){ ans==-1; break; } if(last>=L){ break;//剪枝,只处理下面的 } } if(ans==-1||last<L){//前面如果执行完last还不够的话,证明还是不行 cout<<-1<<endl; }else{ cout<<ans<<endl; } return 0; }