小小粉丝度度熊

来源:互联网 发布:各种域名区别 编辑:程序博客网 时间:2024/05/15 23:45

小小粉丝度度熊

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

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天。

Source
2017”百度之星”程序设计大赛 - 初赛(B)

http://acm.hdu.edu.cn/showproblem.php?pid=6119

最近智商没了,脑子没了,变成傻逼了。细节想不到了,重新变成渣渣从头再来一波

本题细节部分。在于区间的合并问题。
合并之后 区间中间的差值 ,就是补签数量 。
之后用前缀和加尺取法,求出最大可连续的区间。
差值只要小于m ,就是合法的

#include <bits/stdc++.h>using namespace std;long long tag[100005];struct node{    long long x,y,z;} d[100005];bool cmp(node a,node b){    if(a.x!=b.x) return a.x<b.x;    return a.y<b.y;}int main(){    long long n,m;    while(cin>>n>>m)    {        memset(tag,0,sizeof(tag));        memset(d,0,sizeof(d));        for(long long i=1;i<=n;i++)            scanf("%lld%lld",&d[i].x,&d[i].y);        sort(d+1,d+n+1,cmp);        long long  x=1,y=d[1].x;        for(long long i=1;i<=n;i++)//前缀和        {            d[i].z=max((long long )0,d[i].x-y-1);            y=max(y,d[i].y);//区间合并的细节。最近脑子不好用了            tag[i]+=tag[i-1]+d[i].z;        }        long long  maxs=0;        long long sum;        y=0;        for(int i=1;i<=n;i++)        {            y=max(y,d[i].y);            while(tag[i]-tag[x]>m) x++;//尺取法            sum=tag[i]-tag[x];            maxs=max(y-d[x].x+1+m-sum,maxs);//合法情况下最大区间,m-sum为残量。        }        cout<<maxs<<endl;    }}