麗江河邊有n
nn家很有特色的客棧,客棧按照其位置順序從1
11到n
nn編號。每家客棧都按照某一種色調進行裝飾(總共k
kk種,用整數0∼k
−1
0\sim k-1
0∼k−
1表示),且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。
兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家客棧中。晚上,他們打算選擇一家咖啡店喝咖啡,要求咖啡店位於兩人住的兩家客棧之間(包括他們住的客棧),且咖啡店的最低消費不超過p
pp 。
他們想知道總共有多少種選擇住宿的方案,保證晚上可以找到一家最低消費不超過p
pp元的咖啡店小聚。
假設現在以i
ii為其中乙個客棧,1∼i
1\sim i
1∼i中最低消費不超過p
pp且盡量靠後的客棧為j
jj。那麼明顯任意乙個j
jj左邊的客棧且和i
ii顏色相同的客棧都可以和i
ii一起成為乙個方案。
那麼就從1
11列舉到n
nn,每用w[c
ol][
1∼su
m]
w[col][1\sim sum]
w[col]
[1∼s
um]表示1∼i
1\sim i
1∼i中顏色是col
colco
l的客棧編號。而且保證w[c
ol
]w[col]
w[col]
單調遞增。
記錄1 ∼i
1\sim i
1∼i中最靠後的最低消費不超過p
pp的客棧為fla
gflag
flag
,現在列舉到第i
ii個客棧,那麼就在w[c
ol[i
]]
w[col[i]]
w[col[
i]]中二分,找到不超過fla
gflag
flag
的最靠後的客棧j
jj,那麼1∼j
1\sim j
1∼j都可以和i
ii匹配成為一種方案。
需要特判一下,如果客棧i
ii的最低消費已經沒有超過p
pp了,那麼1∼i
−1
1\sim i-1
1∼i−
1的顏色相同的客棧都可以選擇。
時間複雜度o(n
logn
)o(n\ logn)
o(nlog
n)。
#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 n家很有特色的客棧,客棧按照其位置順序從11到n n編號。每家客棧都按照某一種色調進行裝飾 總共k k種,用整數0 k 10 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...