贪心 csust1250 绮礼的阴谋

来源:互联网 发布:淘宝可以申请几个账号 编辑:程序博客网 时间:2024/05/16 04:59

地址: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;}


0 0
原创粉丝点击