麗江河邊有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...