題目要求的是 ∑i=
lrbi
i=l∑
rbi
, 轉化為求 ∑i=
1rbi
−∑i=
1l−1
bii=
1∑r
bi−
i=1∑
l−1
bi,
即求前 k
k 小所有區間的字首和.
怎麼求前 k
k 小區間的和呢 ? 首先找出所有區間再去找第前k
k個區間 是不可行的, 考慮二分答案,
先二分出 mid
mid, 轉化為判斷是否有k
k個區間比mid
mid小,
考慮怎麼列舉區間, 有哪些演算法可以快速地求出符合某些條件的區間的個數?
?尺取可以快速地求出符合條件的區間個數, 使用尺取統計 a
a 數列中有多少子段是 ≤mi
d≤mi
d 的, 設為 num
num,
這裡說明一下為什麼可以尺取, 因為對每個左端點, 右端點往右移產生的新區間的和滿足單調遞增, 又因為有界限存在, 所以可以不重不漏地照顧到所有滿足條件的區間.注意詢問中的 l,r但若出現負數, 就不可以這麼做了, 這道題 就是乙個例子 .
l,r 由於區間的數量是 n2n
2 級別的, 所以要開 lon
glon
glon
glon
g .
#include
#define reg register
typedef
long
long ll;
const
int maxn =
200005
;int n;
int q;
int a[maxn]
;int sum[maxn]
;int
chk(
int mid, ll k, ll &tmp)
tmp = res;
if(cnt < k)
return1;
// mid 太小
else
if(cnt-cnt_e < k)
return0;
}ll calc
(ll x)
return res;
}void
work()
}int
main()
51nod 1690 區間求和2
給出乙個長度為n的陣列a。區間 l,r 的值為 r li 0a l i a r i 求所有長度為質數的區間的值的總和。很容易想到,列舉乙個數對,然後統計他的答案 比如說,我們列舉了乙個數對 i j i,j 那麼他的答案的貢獻會有兩種情況 1.i j n 1 i j n 1這個的話,能包含他的區間長度...
51nod 1690 區間求和2
一開始考慮的是對於每個a ia i ai 有哪些a ja j aj 與它相乘,但是這樣做不了。正解是考慮每對 ai aj a i,a j ai a j 的貢獻,然後用fft優化。首先直接把長度為2 22的給算了,然後剩下的都是奇質數長度。預處理s is i si 表示1 11 i ii有多少個奇質數...
二分查詢 二分區間 快速冪(二分冪)
include include using namespace std 二分查詢 初始區間 0,n 1 intbinarysearch int a,int left,int right,int x else return 1 二分 找出元素的區間左閉右開 初始區間 0,n intlower boun...