若存在乙個合法的攀爬序列, 則其形式一定是 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∑
idj
, 設最早被淹死的時間為 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
logn)
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...