51nod1885 區間和2 二分 尺取

2022-05-20 02:57:00 字數 1499 閱讀 9474

題目要求的是 ∑i=

lrbi

i=l∑

r​bi

​, 轉化為求 ∑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...