HDU 6119 小小粉丝度度熊

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=6119

题目大意:给出N个区间,区间可能存在交叉,在这N个区间内的每个点都标记为1,不在区间内的每个点标记为0。现给出M次机会把为0的点标记为1,问能得到的最长的连续1的长度是多少。

解题思路:离散化之后枚举每个区间,计算以当前区间为起点的满足条件的区间长度值,最后记录最大值。 由于要的是连续的区间长度,因此M此机会也一定是作用于连续的为0区间上。

代码:

 1 const int maxn = 2e5 + 5;
 2 struct node{
 3     ll l, r;
 4     bool operator < (const node &t) const{
 5         if(t.l != l) return l < t.l;
 6         return r < t.r;
 7     }
 8 }; 
 9 int cmp(node a, node b){
10     if(a.l != b.l) return a.l < b.l;
11     return a.r < b.r;
12 }
13 node a[maxn], b[maxn];
14 ll sumb[maxn];
15 int n, m;
16 
17 void solve(){
18     sort(a, a + n);
19     int bcnt = 1;
20     b[bcnt++] = a[0];
21     for(int i = 0; i < n; i++) {
22         if(b[bcnt - 1].r >= a[i].l - 1) b[bcnt - 1].r = max(b[bcnt - 1].r, a[i].r);
23         else b[bcnt++] = a[i];
24     }
25     sumb[0] = 0;
26     for(int i = 1; i < bcnt; i++)  sumb[i] = sumb[i - 1] + b[i].r - b[i].l + 1;
27     ll ans = 0;
28     for(int i = 1; i < bcnt; i++){
29         int j = i;
30         while(j < bcnt && b[j].r - b[i].l + 1 - (sumb[j] - sumb[i - 1]) <= m) j++;
31         ll tmans = b[j - 1].r - b[i].l + 1, smm = sumb[j - 1] - sumb[i - 1];
32         if(m - tmans + smm > 0) tmans += m - tmans + smm;
33         ans = max(ans, tmans);
34     }
35     printf("%I64d\n", ans);
36 }
37 
38 int main(){
39     while(scanf("%d %d", &n, &m) !=EOF){
40         for(int i = 0; i < n; i++) scanf("%I64d %I64d", &a[i].l, &a[i].r);
41         solve();
42     }
43 }

题目:

小小粉丝度度熊

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 826    Accepted Submission(s): 244


Problem Description
度度熊喜欢着喵哈哈村的大明星——星星小姐。

为什么度度熊会喜欢星星小姐呢?

首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听。

但这都不是最重要的,最重要的是,星星小姐拍的一手好代码!

于是度度熊关注了星星小姐的贴吧。

一开始度度熊决定每天都在星星小姐的贴吧里面签到。

但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到。

不过度度熊并不是非常悲伤,因为他有m张补签卡,每一张补签卡可以使得某一忘签到的天,变成签到的状态。

那么问题来了,在使用最多m张补签卡的情况下,度度熊最多连续签到多少天呢?

 

 

Input
本题包含若干组测试数据。

第一行两个整数n,m,表示有n个区间,这n个区间内的天数,度度熊都签到了;m表示m张补签卡。

接下来n行,每行两个整数(l[i],r[i]),表示度度熊从第l[i]天到第r[i]天,都进行了签到操作。


数据范围:

1<=n<=100000

0<=m<=1000000000
0<=l[i]<=r[i]<=1000000000


注意,区间可能存在交叉的情况。
 

 

Output
输出度度熊最多连续签到多少天。
 

 

Sample Input
2 1 1 1 3 3 1 2 1 1
 

 

Sample Output
3 3
Hint
样例一:度度熊补签第2天,然后第1天、第二天和第三天都进行了签到操作。 样例二:度度熊补签第2天和第3天。
posted @ 2017-08-14 10:37  EricJeffrey  阅读(165)  评论(0编辑  收藏  举报