链接:https://ac.nowcoder.com/acm/contest/1085/A
来源:牛客网
应肖老师要求前来更新水一水
题目描述
小 sun 非常喜欢放假,尤其是那种连在一起的长假,在放假的时候小 sun 会感到快乐,快乐值等于连着放假的天数,现在小 sun 把他的安排表告诉你,希望你告诉他在他的安排表中, 他的最大快乐值。
当某天没有安排的时候就是放假。
输入描述:
第一行两个数n,m,代表总共有n天,m个安排。
接下来有m行,每行是一个安排l,r,代表从第l天到第r天,小sun有安排了。
安排可能会重复。
输出描述:
输出一行,在这个安排表中,小sun最大的快乐值。
备注:
数据范围:
n≤1e9,m≤1e5nleq 1e9, mleq 1e5n≤1e9,m≤1e5
1≤l,r≤n1 leq l,rleq n1≤l,r≤n
n≤1e9,m≤1e5nleq 1e9, mleq 1e5n≤1e9,m≤1e5
1≤l,r≤n1 leq l,rleq n1≤l,r≤n
题意:
在一条长为n的数轴上,用m个区间覆盖这条数轴,问最长未被覆盖的数轴长度。
思路:
线段树的染色法肯定是暴毙的,由此想到暴力动动小脑瓜。
首先我们对m个区间的左端点进行排序,然后惊讶地发现只要从左到右更新最远的右端点并对未被覆盖的区间长度进行更新即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 1e5+7; struct node{ int l,r; }a[maxn]; bool cmp(node a,node b) { /*if(a.l==b.l) return a.r>b.r; */ return a.l<b.l; } int main() { int ans=0; int lf=1,rt=0; int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d %d",&a[i].l,&a[i].r); } sort(a+1,a+m+1,cmp); /*for(int i=1;i<=m;i++) printf("l:%d r:%d ",a[i].l,a[i].r);*/ ans=(a[1].l-1); //printf("a:%d ",ans); rt=a[1].r; for(int i=2;i<=m;i++) { if(a[i].l>rt) { ans=max(ans,a[i].l-rt); rt=a[i].r; } else { if(a[i].r>rt) { rt=a[i].r; } continue; } } ans=max(ans,n-rt); printf("%d ",ans); return 0; }
方法二:
肖老师说的pair
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <set> #include <ext/pb_ds/assoc_container.hpp> using namespace std; const int maxn = 1e5+7; set< pair <int,int> > s; int main() { int ans=0; int rt=0; int n,m; scanf("%d%d",&n,&m); int l,r; for(int i=1;i<=m;i++) { scanf("%d %d",&l,&r); s.emplace(l,r); } for(auto i : s) { if(i.first>rt) { ans=max(ans,i.first-rt); rt=i.second; } else { if(i.second>rt) { rt=i.second; } continue; } } ans=max(ans,n-rt); printf("%d ",ans); return 0; }
本质上是一样的东西,set+emplace跑的并没有更快?