題意
傳送門 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≤
riy
yy 隨 w
ww 遞增單調不增,故二分引數 w
ww。預處理字首和,則 y
iy_i
yi 的 ∑j1
\sum_1
∑j1
與 ∑jvj
\sum_v_
∑jvj
項可以 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 思路 對於已經排好序的,且要求查詢陣列中某乙個數的位置,屬於搜尋類...