HDU 6119 2017百度之星初赛B 小小粉丝度度熊 (二分)

小小粉丝度度熊

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

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

【分析】两种做法。第一,双指针扫一下,取最大值。第二,枚举每一个块作为右端点,然后向左二分左端点即可。不过区间可能 重叠交叉,所以要预处理一下,将区间合并。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof a)
#define pb push_back
#define mp make_pair
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = 1e5+50;;
const int M = 17;
const int mod = 1e9+7;
const int mo=123;
const double pi= acos(-1.0);
typedef pair<int,int>pii;
int n,m;
ll sum[N],sum2[N];
vector<pii>vec;
struct man{
   int l,r;
}a[N];
bool cmp(const man &s,const man &d){
    if(s.l==d.l)return s.r<d.r;
    return s.l<d.l;
}
int main(){
    while(~scanf("%d%d", &n, &m)) {
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i].l,&a[i].r);
        }
        sort(a+1,a+1+n,cmp);
        int now=1;
        vec.clear();
        met(sum,0);met(sum2,0);
        for(int i=2;i<=n;i++){
            if(a[i].l<=a[now].r)a[now].r=max(a[now].r,a[i].r);
            else {
                vec.pb(mp(a[now].l,a[now].r));
                now=i;
            }
        }
        vec.pb(mp(a[now].l,a[now].r));
        int sz=vec.size();
        ll ans=0,ss,dd;
        sum[0]=0;
        sum2[0]=vec[0].second-vec[0].first+1;
        for(int i=1;i<sz;i++){
            sum[i]=sum[i-1]+vec[i].first-vec[i-1].second-1;
            sum2[i]=sum2[i-1]+vec[i].second-vec[i].first+1;
        }
        for(int i=0;i<sz;i++){
            int ll=0,rr=i,res=-1;
            while(ll<=rr){
                int mid=(ll+rr)/2;
                ss=sum[i]-sum[mid];
                if(ss<=m)rr=mid-1,res=mid;
                else ll=mid+1;
            }
            if(res==0)dd=sum2[i];
            else dd=sum2[i]-sum2[res-1];
            ss=sum[i]-sum[res];
            ans=max(ans,dd+ss+(m-ss));
        }
        printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-12-19 03:33:43

HDU 6119 2017百度之星初赛B 小小粉丝度度熊 (二分)的相关文章

(最小费用流)hdu 6118(2017百度之星初赛B 1005) 度度熊的交易计划

度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 260    Accepted Submission(s): 83 Problem Description 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片

百度之星2017 HDU 6119 小小粉丝度度熊 二分+双指针

小小粉丝度度熊 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6119 Description 度度熊喜欢着喵哈哈村的大明星--星星小姐.为什么度度熊会喜欢星星小姐呢?首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听.但这都不是最重要的,最重要的是,星星小姐拍的一手好代码!于是度度熊关注了星星小姐的贴吧.一开始度度熊决定每天都在星星小姐的贴吧里面签到.但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到.不过

HDU 6118 2017百度之星初赛B 度度熊的交易计划(费用流)

度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 254    Accepted Submission(s): 80 Problem Description 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片

HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(B))

小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1572    Accepted Submission(s): 513 Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是

hdu 6119 小小粉丝度度熊

小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1299    Accepted Submission(s): 419 Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是

hdu 6119 小小粉丝度度熊(区间双指针)

题目链接:hdu 6119 小小粉丝度度熊 题意: 给你n个区间,和一个数m,m表示可补上不连续的位置累计和为m,现在问你最长的连续区间和为多少. 题解: 我可能写的有点复杂,大概就是将每个区间排序后离散化,将这些间隔看成一个点,然后双指针一下. 1 #include<bits/stdc++.h> 2 #define mst(a,b) memset(a,b,sizeof(a)) 3 #define F(i,a,b) for(int i=(a);i<=(b);++i) 4 using na

2017百度之星初赛(A)1001,1005,1006解题报告

1001 小C的倍数问题 纯签到题,求p-1的因数个数,暴力枚举即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 ios::sync_with_stdio(false); 6 int t,p,cnt,n,num; 7 cin>>t; 8 while(t--) 9 { 10 cnt=0; 11 cin>>p; 12 n=p-1; 13 for(int i=1;i*i<=n;+

2017百度之星初赛

1001 小C的倍数问题 Accepts: 1990 Submissions: 4931 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 根据小学数学的知识,我们知道一个正整数x是3的倍数的条件是x每一位加起来的和是3的倍数.反之,如果一个数每一位加起来是3的倍数,则这个数肯定是3的倍数. 现在给定进制P,求有多少个B满足P进制下,一个正整数是

hdu 5690 2016&quot;百度之星&quot; - 初赛(Astar Round2A) All X 快速二次幂 || 寻找周期

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5690 题意:m个数字全为x mod k ?= c;其中m <= 1010,0 < c,k <= 10,000; 法1:xxx = (10m-1)/9*x;但是n太大,需要同时mod.去除分母将式子变为:10m*x%(9k) - x%(9k) =? 9c ;其中 10m 快速二次幂即可: 时间复杂度为O(logn) 法2: 由于m个x数的产生对于mod具有可拆分性,所以直接求解周期即可: #i