地址:acmore.net/web/showProblem?id=1250
第四次圣杯战争开始了,为了收集敌人的情报,言峰绮礼命令他的使魔Assassin 将自己的灵体分成n 份,分别监视教堂外的长直走道。
Assassin 每份灵体的能力不同,第i 份灵体可以监视到的区域是[ai, bi],绮礼想知道,监控范围内的区域的总长度是多少。
比如,第一份灵体的视野范围是[-1, 1],第二份灵体的视野范围是[0, 2],第三份灵体的视野范围是[3, 4]。
那么绮礼能获得的全部视野范围是[-1; 2] ∪ [3; 4],长度是4。
Input:
第1 行有一个整数,表示灵体数量n(1 ≤n ≤10000)。接下来有n 行,每行两个整数ai, bi(0≤ai,bi≤2×109),表示第i 个灵体的视野范围是[ai, bi]。
Sample Input:
2
0 1
3 4
Sample Output:
2
感觉这题是区间覆盖里一道非常经典的,特地拿出来与线段树对比
如果这题稍微改下,改成某个点最多能同时被多少个幽灵监控,那就是道很好的线段树了
有时候题目限制条件比较少的时候,贪心是一种很好的方法
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int MX=10000+5; struct Seg{ LL L,R; bool operator<(const Seg&b)const{ if(L==b.L){ return R>b.R; } return L<b.L; } }A[MX]; int main(){ int n; while(~scanf("%d",&n)){ for(int i=1;i<=n;i++){ scanf("%lld%lld",&A[i].L,&A[i].R); } sort(A+1,A+1+n); LL ans=0,L=0,R=0; for(int i=1;i<=n;i++){ if(L<=A[i].L&&A[i].L<=R) R=max(R,A[i].R); else{ ans+=R-L; L=A[i].L;R=A[i].R; } } ans+=R-L; printf("%lld\n",ans); } return 0; }