P2082 区间覆盖(加强版)
题目描述
已知有N个区间,每个区间的范围是[si,ti],请求出区间覆盖后的总长。
输入输出格式
输入格式:
N s1 t1 s2 t2 …… sn tn
输出格式:
共一行,一个正整数,为覆盖后的区间总长。
输入输出样例
说明
【数据范围】
对于40%的数据 N≤1000,0<Si<Ti≤10000
对于100%的数据 N≤10^5,0<Si<Ti≤10^17,且为整数
贪心
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 100010 #define LL long long using namespace std; LL n,l,r,ans; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } struct Node { LL x,y; }node[N]; int cmp(Node a,Node b) {return a.x<b.x;} int main() { n=read(); for(int i=1;i<=n;i++) node[i].x=read(),node[i].y=read(); sort(node+1,node+1+n,cmp); l=node[1].x;r=node[1].y; for(int i=2;i<=n;i++) { if(r>=node[i].x) r=max(r,node[i].y); else { ans+=(LL)r-l+1; l=node[i].x; r=node[i].y; } } ans+=r-l+1; printf("%lld",ans); return 0; }