HDU6119 小小粉丝度度熊
来源:互联网 发布:海口seo外包 编辑:程序博客网 时间:2024/04/27 23:12
思路:如果我们把覆盖的区间和未覆盖的分开,那么我们可以构造出一个序列:例如
7 5 4 3 5 9 8
粗体的表示中间没有签到的部分,而相邻的部分就是已经连续签到了的部分。
那么题目实际上就是我们可以单独的覆盖m天,然后怎么样覆盖才能获得最大的连续区间,然后求出这个连续的区间大小。
嗯,根据范围基本上确定是一个nlogn的做法。最容易想到的是暴力枚举区间,但显然
#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 1e5+7;const int inf = 1e9;const LL mod = 1e9+7;int n;int m;int a[MAXN];int b[MAXN];struct node{ int l,r; bool operator < (const node &a)const { if(l!=a.l)return l < a.l; else return r < a.r; }} p[MAXN];int main(){ while(~scanf("%d%d",&n,&m)) { for(int i = 0; i < n; ++i)scanf("%d%d",&p[i].l,&p[i].r); sort(p,p+n); int cnt = 0; //给出的数据按照块和空白分开,做成一个序列 int ll = p[0].l,rr = p[0].r; for(int i = 1; i < n; ++i) { if(p[i].l <= rr + 1) { rr = max(rr,p[i].r); continue; } else { a[cnt++] = rr - ll +1; b[cnt] = p[i].l - rr - 1; ll = p[i].l; rr = p[i].r; } } a[cnt] = rr - ll + 1; int MAX = 0; //累加前缀和 for(int i = 1; i <= cnt; ++i)b[i]+=b[i-1],a[i]+=a[i-1]; //枚举左端点,二分右端点 for(int i = 0 ; i <= cnt; ++i) { //二分不超过m的最右端点 int low = i+1,high = cnt; int ans = i; while(low <= high) { int mid = (low + high)>>1; if(b[mid] - b[i] <= m) { ans = mid; low = mid+1; } else high = mid - 1; } MAX = max(MAX,(a[ans] - (i>0?a[i-1]:0)+m)); } printf("%d\n",MAX); } return 0;}/*5 23 45 61 48 100200 300*/
阅读全文
1 0
- HDU6119 小小粉丝度度熊
- hdu6119 小小粉丝度度熊
- HDU6119-小小粉丝度度熊
- hdu6119小小粉丝度度熊(尺取法)
- HDU6119 小小粉丝度度熊(区间)
- hdu6119 小小粉丝度度熊【尺取】
- Hdu6119 小小粉丝度度熊(2017"百度之星"程序设计大赛
- hdu6119 小小粉丝度度熊【尺取法(滑动窗口)】
- 2017百度之星初赛(B)1006小小粉丝度度熊------hdu6119
- hdu6119 2017"百度之星"初赛(B)1006小小粉丝度度熊(贪心)
- 小小粉丝度度熊
- 小小粉丝度度熊
- 小小粉丝度度熊
- 小小粉丝度度熊 HDU
- 小小粉丝度度熊 HDU
- 小小粉丝度度熊
- 小小粉丝度度熊
- hdu 6119 小小粉丝度度熊
- glibc源码分析之系统调用(二)
- ReactNative开发(二)之基础与入门
- 437. Path Sum III
- 事件基础五
- 【Solr】 Solr集群概念介绍
- HDU6119 小小粉丝度度熊
- Swift Apple-计算器-Demo源码解读
- 金蝶K3 SQL报表系列-委外未勾稽明细表
- Javascript闭包——懂不懂由你
- maven中如何使用代理解决内网无法下载jar包
- DrawerLayout图标的方法
- Java学习路线
- [Poi2012] bzoj 2788 Festival
- D