贪心 csust1250 绮礼的阴谋

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


你可能感兴趣的:(ACM)