攀爬 二分, 思維

2021-09-27 13:40:57 字數 3288 閱讀 8518

若存在乙個合法的攀爬序列, 則其形式一定是 ak+

∑i=1

m(ai

−bi)

≥la_ + \sum\limits_^m (a_i - b_i) \geq l

ak​+i=

1∑m​

(ai​

−bi​

)≥l,

於是考慮列舉 a

ka_k

ak​, 設 di=

ai−b

id_i = a_i-b_i

di​=ai

​−bi

​, 按 d

dd從大到小排序, 然後 o(n

)o(n)

o(n)

解出 爬出井 的最早時間, 更新答案, 總時間複雜度 o(n

2)o(n^2)

o(n2) .

考慮怎麼優化, 記 sum

i=∑j

=1id

jsum_i = \sum\limits_^i d_j

sumi​=

j=1∑

i​dj

​, 設最早被淹死的時間為 day

dayda

y, day

=min⁡(

i∣su

mi≤∑

j=1i

cj)day = \min(i\ |\ sum_i \le \sum\limits_^i c_j)

day=

min(i∣

sumi

​≤j=

1∑i​

cj​)

,只需要在 sum

i,i∈

[1,d

ay]sum_i, i ∈ [1, day]

sumi​,

i∈[1

,day

] 中二分查詢l−a

kl - a_k

l−ak

​ 即可得到 關於 a

ka_k

ak​ 的答案,

但是隨著 a

ka_k

ak​ 的變化, sum

isum_i

sumi

​ 同樣也在變化, 我們要使得這種變化更加 「平滑」, 更加易於控制一點,

於是我們將 a

ka_k

ak​從右往左列舉, 考慮取出 a

ka_k

ak​ 會對哪些 sum

isum_i

sumi

​ 造成影響,

會對 sum

p,p∈

[k,n

]sum_p, p ∈ [k, n]

sump​,

p∈[k

,n] 造成影響, 這種變化會使得 sum

p′=s

ump+

di+1

−dksum^_p = sum_p + d_ - d_k

sump′​

=sum

p​+d

i+1​

−dk​

,由於 d

kd_k

dk​從右向左列舉, 且

\是 遞減的, 所以 d

kd_k

dk​ 是不斷增大的, 進而 sum

p′sum^_p

sump′​

是不斷減少的,

所以 day

dayda

y 只有可能不斷向左移動, 而向左移動最多移動 n

nn 步, 所以按上述方法暴力移動 day

dayda

y, 總複雜度是 o(n

log⁡n)

o(n \log n)

o(nlogn)

的 .但是這裡要提到的是, 當出現 d

i<

0d_i < 0

di​<

0 的情況時, sum

isumi​ 並非單調,

為了應對這種情況, 需要找出乙個中準點 mdmd

md, 使得 [1,

md][1, md]

[1,md]

是單調遞增的, 在 [1,

min⁡(d

ay,m

d)][1, \min(day, md)]

[1,min(d

ay,m

d)] 中二分查詢即可 .

#include

#define reg register

typedef

long

long ll;

intread()

while

(isdigit

(c)) s = s*

10+ c-

'0', c =

getchar()

;return s * flag;

}const

int maxn =

100005

;int n;

int l;

ll c[maxn]

;ll sum[maxn]

;struct pill a[maxn]

;bool

cmp(pill x, pill y)

intlower_bound

(int l,

int r,

const

int&aim,

const

int&k)

return res;

}int

main()

int ans =-1

;for

(reg int k = n; k >=

1; k --

)int pos =

lower_bound(1

, day, l-a[k]

.a, k);if

(pos !=-1

)}if(ans !=-1

) ans ++;if

(ans ==

2) ans --

;printf

("%d\n"

, ans)

;return0;

}

二分 差分 思維

二分 差分 思維 當猜了乙個數 x 總共有三種情況 裁判說數大了,那麼裁判說對的取值範圍是 x 裁判說數小了,那麼裁判說對的取值範圍是 x,裁判說數一樣,那麼裁判說對的取值範圍是 x,x 那麼我們只需要求最大有多少個區間重疊了就行了,問題就轉化成了區間的修改,單點查詢,可以考慮差分了。注意題目資料 ...

D Max Median 二分 思維

d.max median 二分 思維 題目大意 給你乙個長度為n的序列,乙個長度為 x 的中位數是 這個序列重新排序之後的 frac 向下取整的位置,讓你求長度至少為 k 的子串行的最大中位數是多少?題解 include using namespace std typedef long long l...

Maximum Value (二分 思維列舉)

you are given a sequence a consisting of n integers.find the maximum possible value of i divided by a j where 1 i,j n and a i a j.input the first line...