洛谷P1311 選擇客棧 二分

2021-09-09 09:00:21 字數 1816 閱讀 2576

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