HDU6119 小小粉絲度度熊

2021-08-06 04:00:38 字數 1123 閱讀 2483

思路:如果我們把覆蓋的區間和未覆蓋的分開,那麼我們可以構造出乙個序列:例如

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 度度熊喜歡著喵哈哈村的大明星 星星小姐。為什麼度度熊會喜歡星星小姐呢?首先星星小姐笑起來非常動人,其次星星小姐唱歌也非常好聽。但這都不是最重要的,最重要的是,星星小姐拍的一手好 於是度度熊關注了星星小姐的貼吧。一開始度度熊決定每天都在星星小姐的貼吧裡面簽到。但...