【二分+尺取】HDU 6119 小小粉丝度度熊

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

【思路】

  • 首先通过处理交叉的可以处理成不交叉的
  • 然后二分查找答案
  • 如何判断一个长度是否可行?
  • 双指针O(n)扫一次就可以,要处理区间和问题,所以先求前缀和
  • 时间复杂度O(nlogn)

【AC】

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<algorithm>
  6 #include<cmath>
  7
  8 using namespace std;
  9 typedef long long ll;
 10 const int maxn=1e5+3;
 11 int n,m;
 12 int cnt1,cnt2;
 13 struct node
 14 {
 15     int l;
 16     int r;
 17 }a[maxn];
 18 int b[maxn];
 19 int c[maxn];
 20 int pre1[maxn];
 21 int pre2[maxn];
 22
 23 bool cmp(node x,node y)
 24 {
 25     if(x.l!=y.l) return x.l<y.l;
 26     return x.r<y.r;
 27 }
 28 void Pre()
 29 {
 30     memset(pre1,0,sizeof(pre1));
 31     pre1[0]=b[0];
 32     for(int i=1;i<cnt1;i++)
 33     {
 34         pre1[i]=pre1[i-1]+b[i];
 35     }
 36     memset(pre2,0,sizeof(pre2));
 37     pre2[0]=c[0];
 38     for(int i=1;i<cnt2;i++)
 39     {
 40         pre2[i]=pre2[i-1]+c[i];
 41     }
 42
 43 }
 44 bool check(int p,int q,int mid)
 45 {
 46     if(p==0) return pre1[q]>=mid;
 47     return pre1[q]-pre1[p-1]>=mid;
 48 }
 49 bool judge(int mid)
 50 {
 51     int pos=upper_bound(pre2,pre2+cnt2,m)-pre2-1;
 52     int totm=pre2[pos];
 53     int p=0,q=pos+1;
 54     while(p<=q&&q<cnt1)
 55     {
 56         if(check(p,q,mid))
 57         {
 58             return true;
 59         }
 60         else
 61         {
 62             totm-=c[p];
 63             p++;
 64             while(pos+1<cnt2&&totm+c[pos+1]<=m)
 65             {
 66                 totm+=c[pos+1];
 67                 pos++;
 68             }
 69             q=pos+1;
 70         }
 71     }
 72     return false;
 73 }
 74 int main()
 75 {
 76     while(scanf("%d%d",&n,&m)!=EOF)
 77     {
 78         for(int i=0;i<n;i++)
 79         {
 80             scanf("%d%d",&a[i].l,&a[i].r);
 81         }
 82         sort(a,a+n,cmp);
 83         cnt1=0;
 84         cnt2=0;
 85         int p=a[0].l,q=a[0].r;
 86         int low=0,high=0;
 87         for(int i=1;i<n;i++)
 88         {
 89             if(a[i].l<=q)
 90             {
 91                 q=max(q,a[i].r);
 92             }
 93             else
 94             {
 95                 b[cnt1++]=q-p+1;
 96                 high+=q-p+1;
 97                 c[cnt2++]=a[i].l-q-1;
 98                 p=a[i].l;
 99                 q=a[i].r;
100             }
101         }
102         b[cnt1++]=q-p+1;
103         high+=q-p+1;
104         Pre();
105         while(low<=high)
106         {
107             int mid=(low+high)>>1;
108             if(judge(mid))
109             {
110                 low=mid+1;
111             }
112             else
113             {
114                 high=mid-1;
115             }
116         }
117         cout<<low+m-1<<endl;
118     }
119     return 0;
120 }

时间: 2024-12-10 18:58:01

【二分+尺取】HDU 6119 小小粉丝度度熊的相关文章

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 HDU 6119 小小粉丝度度熊 二分+双指针

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

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 小小粉丝度度熊 (区间处理+尺取)

http://acm.hdu.edu.cn/showproblem.php?pid=6119 解题思路:给出的出发时间和结束时间对有重合的部分进行处理,然后用尺取法找出最后的结果.比赛的时候的确想到了用尺取的想法完成题目,但是代码能力不行没有想出来. AC代码: 1 #include <iostream> 2 #include <bits/stdc++.h> 3 using namespace std; 4 const int maxn=100005; 5 struct node

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 度度熊喜欢着喵哈哈村的大明星——星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是,星

小小粉丝度度熊

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

[HDOJ6119] 小小粉丝度度熊(尺取)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6119 合并有重叠的段后尺取. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12 ┛┗┛┗┛┃ 13 ┓┏┓┏┓┃ 14 ┃┃┃┃┃┃ 15 ┻┻┻┻┻┻ 16 */ 17 #include <bi

2017&quot;百度之星&quot;程序设计大赛 - 初赛(B)小小粉丝度度熊

Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是,星星小姐拍的一手好代码! 于是度度熊关注了星星小姐的贴吧. 一开始度度熊决定每天都在星星小姐的贴吧里面签到. 但是度度熊是一个非常健忘的孩子,总有那么几天,度度熊忘记签到,于是就断掉了他的连续签到. 不过度度熊并不是非常悲伤,因为他有m张补签卡,每一张补签卡可以使得某一忘签到的天,变成签到的状