2017百度之星初赛(B)1006小小粉丝度度熊------hdu6119
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=6119
分析: 我们一看到这题呢,因为题目明确告诉我们有重叠,所以我们肯定要先排序预处理下啦,然后呢,因为题意给的是补签次数,我们就可以求一下每两端连签之间的缺签天数,记录下这些坑的天数。然后两指针尺取下,每次算中间补签的天数小于题目给的补签数m,最后算下如果没坑,也就是只有一个连续的块时的天数就好了
代码如下:
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; const int maxn = 1e5 + 5; struct Node{ LL L,R; }node[maxn],whole[maxn]; LL keng[maxn]; bool cmp(Node a,Node b) { if(a.L != b.L) return a.L < b.L; return a.R < b.R; } int main() { LL n,m; while(scanf("%I64d%I64d",&n,&m) !=EOF) { for(int i = 0; i < n; i++) { scanf("%I64d%I64d",&node[i].L,&node[i].R); } sort(node, node + n,cmp); int cnt = 1; whole[cnt] = node[0]; for(int i = 1; i < n; i++) { if(node[i].L <= whole[cnt].R + 1) whole[cnt].R = max(whole[cnt].R, node[i].R); else whole[++cnt] = node[i]; } for(int i = 1; i < cnt; i++) { keng[i] = whole[i+1].L - whole[i].R - 1; } int tt = 0, l = 1; LL sum = 0; for(int i = 1; i < cnt; i++) { tt += keng[i]; while(tt > m) { tt -= keng[l]; l++; } sum = max(sum, whole[i+1].R - whole[l].L + 1 + m - tt); } sum = max(sum,whole[1].R - whole[1].L + 1 + m); printf("%I64d\n",sum); } return 0; }
本文版权归作者本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.