洛谷P1311 選擇客棧 二分

2022-09-03 03:42:10 字數 1562 閱讀 4885

麗江河邊有n

n家很有特色的客棧,客棧按照其位置順序從11到n

n編號。每家客棧都按照某一種色調進行裝飾(總共k

k種,用整數0∼k

−10∼

k−1表示),且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。

兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家客棧中。晚上,他們打算選擇一家咖啡店喝咖啡,要求咖啡店位於兩人住的兩家客棧之間(包括他們住的客棧),且咖啡店的最低消費不超過pp 。

他們想知道總共有多少種選擇住宿的方案,保證晚上可以找到一家最低消費不超過p

p元的咖啡店小聚。

假設現在以i

i為其中乙個客棧,1∼i

1∼i中最低消費不超過p

p且盡量靠後的客棧為j

j。那麼明顯任意乙個j

j左邊的客棧且和i

i顏色相同的客棧都可以和i

i一起成為乙個方案。

那麼就從1

1列舉到n

n,每用w[c

ol][

1∼su

m]w[

col]

[1∼s

um]表示1∼i

1∼i中顏色是col

col的客棧編號。而且保證w[c

ol]w

[col

]單調遞增。

記錄1∼i1

∼i中最靠後的最低消費不超過p

p的客棧為fla

gfla

g,現在列舉到第i

i個客棧,那麼就在w[c

ol[i

]]w[

col[

i]]中二分,找到不超過fla

gfla

g的最靠後的客棧j

j,那麼1∼j

1∼j都可以和i

i匹配成為一種方案。

需要特判一下,如果客棧i

i的最低消費已經沒有超過p

p了,那麼1∼i

−11∼

i−1的顏色相同的客棧都可以選擇。

時間複雜度o(n

logn

)o(n

logn

)。

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

200010

;int n,k,p,col[n]

,m[n]

,flag,w[60]

[n],sum[60]

,l,r,mid;

ll ans;

intmain()

ans+

=(ll)

(l-1);

} sum[col[i]]++

;//數量加一

w[col[i]

][sum[col[i]]]

=i;if

(m[i]

<=p) flag=i;

} cout

}

洛谷P1311 選擇客棧 二分

麗江河邊有n nn家很有特色的客棧,客棧按照其位置順序從1 11到n nn編號。每家客棧都按照某一種色調進行裝飾 總共k kk種,用整數0 k 1 0 sim k 1 0 k 1表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不...

洛谷P1311 選擇客棧 二分

麗江河邊有n n家很有特色的客棧,客棧按照其位置順序從11到n n編號。每家客棧都按照某一種色調進行裝飾 總共k k種,用整數0 k 10 k 1表示 且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相...

洛谷 P1311 選擇客棧

原題 首先暴力如果寫的優秀,可以拿到60分,這裡介紹兩種暴力 40 include include include include include using namespace std int color 200010 cost 200010 int main printf d n ans k r...