思路:如果我們把覆蓋的區間和未覆蓋的分開,那麼我們可以構造出乙個序列:例如
7543598
粗體的表示中間沒有簽到的部分,而相鄰的部分就是已經連續簽到了的部分。
那麼題目實際上就是我們可以單獨的覆蓋m天,然後怎麼樣覆蓋才能獲得最大的連續區間,然後求出這個連續的區間大小。
嗯,根據範圍基本上確定是乙個nlogn的做法。最容易想到的是暴力列舉區間,但顯然n2
,於是考慮能不能二分,嗯,然後看一下答案的性質,答案肯定是乙個連續的區間,那這就好辦了,那麼我們可以列舉左端點,二分消耗不超過m的右端點的值。然後不斷更新答案就可以了。複雜度o(
nlog
n)。
#include
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
} p[maxn];
int main()
else
}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)
else high = mid - 1;
}max = max(max,(a[ans] - (i>0?a[i-1]:0)+m));
}printf("%d\n",max);
}return0;}
/*5 2
3 45 6
1 48 100
200 300
*/
hdu6119 小小粉絲度度熊
題目傳送門 思路 首先題目中說區間可能有交叉,所以第一步我們先處理一下區間重疊的情況把重疊的區間合併一下 第二步我們只需要尺取一下找最大區間就可以了 include include include include using namespace std const int maxn 1e9 7 st...
HDU6119 小小粉絲度度熊(區間)
區間有n個區間,這n個區間內的天數,都簽到了,m表示m張補簽卡 區間可能存在交叉的情況,求最多連續簽到多少天 include include include include using namespace std typedef long long ll int n,m const int maxn...
hdu 6119 小小粉絲度度熊 想法題
problem description 度度熊喜歡著喵哈哈村的大明星 星星小姐。為什麼度度熊會喜歡星星小姐呢?首先星星小姐笑起來非常動人,其次星星小姐唱歌也非常好聽。但這都不是最重要的,最重要的是,星星小姐拍的一手好 於是度度熊關注了星星小姐的貼吧。一開始度度熊決定每天都在星星小姐的貼吧裡面簽到。但...