NC 16597 二分 字首和

2021-10-07 12:55:08 字數 1459 閱讀 1133

題意

傳送門 nc 16597題解y=∑

i=1m

(∑j1

×∑jv

j),w

j≥w,

li≤j

≤r

iy=\sum_^(\sum_1\times \sum_v_),w_j\geq w,l_i\leq j\leq r_i

y=i=1∑

m​(j

∑​1×

j∑​v

j​),

wj​≥

w,li

​≤j≤

ri​y

yy 隨 w

ww 遞增單調不增,故二分引數 w

ww。預處理字首和,則 y

iy_i

yi​ 的 ∑j1

\sum_1

∑j​1

與 ∑jvj

\sum_v_

∑j​vj​

項可以 o(1

)o(1)

o(1)

內求出。考慮到計算 y

yy 可能爆 lon

glon

glong\ long

longlo

ng,且 s

ss 範圍較小,則 y

yy 值超出 s×2

s\times 2

s×2 時即可停止計算,因為此時 y

yy 已超過 abs

(y−s

)abs(y-s)

abs(y−

s)的可能最小值。

#include

using

namespace std;

#define max(a, b) ((a) > (b) ? (a) : (b))

#define min(a, b) ((a) < (b) ? (a) : (b))

#define maxn 200005

typedef

long

long ll;

ll n, m, s, limit;

ll w[maxn]

, v[maxn]

, l[maxn]

, r[maxn]

, num[maxn]

, sum[maxn]

;ll calc

(ll x)

ll y =

0, s1 =

0, s2 =0;

for(

int i =

1; i <= m; i++

)return y;

}int

main()

printf

("%lld\n"

,min

(abs

(calc

(lb)

- s)

,abs

(calc

(ub)

- s)))

;return0;

}

字首和 二分

powered by ab in 局外人 拿洛谷的乙個例子記一下字首和。資料超過了1e5,故o n 2 的演算法又行不通,所以換二分 include typedef long long ll using namespace std ll n,m,l,r ll a 1000001 sum 100000...

二分與字首和

時間複雜度o log n 資料區間 l mid r 實現 while l給定乙個按照公升序排列的長度為 n 的整數陣列,以及 q 個查詢。對於每個查詢,返回乙個元素 k 的起始位置和終止位置 位置從 0 開始計數 如果陣列中不存在該元素,則返回 1 1。輸入格式 第一行包含整數 n 和 q,表示陣列...

二分和字首和(藍橋)

二分 1.數的範圍 題意 給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。1 n 100010,q 10000.對於每個查詢,返回乙個元素k的起始位置和終止位置 位置從0開始計數 如果陣列中不存在該元素,則返回 1 1 思路 對於已經排好序的,且要求查詢陣列中某乙個數的位置,屬於搜尋類...