牛客 C 子段乘積(線段樹)

2021-10-03 08:40:11 字數 1257 閱讀 4541

暴力 o(n

2)o(n^2)

o(n2

) 超時。

用線段樹維護區間乘積的餘數,然後查詢區間 [i,

i+k−

1][i,i+k-1]

[i,i+k

−1] 即可。其中建樹的複雜度是 o(n

)o(n)

o(n)

,查詢的時間複雜度是 o(l

ogn)

o(logn)

o(logn

)。

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const ll mod =

998244353

;const

int n =

200010

;int n, k;

ll a[n]

;struct node tree[

4*n]

;inline

intlc

(int p)

inline

intrc

(int p)

void

build

(int i,

int l,

int r)

int mid =

(l + r)

>>1;

build(lc

(i), l, mid)

;build(rc

(i), mid+

1, r);

tree[i]

.pd =

((tree[

lc(i)

].pd % mod)

*(tree[

rc(i)

].pd % mod)

)% mod;

}ll query

(int i,

int ql,

int qr)

intmain()

printf

("%lld\n"

, ans)

;return0;

}

《牛客競賽 子段乘積》的題解

給出乙個長度為 n 的數列 a1,a2,an 求其長度為 k 的連續子段的乘積對 998244353 取模餘數的最大值。第一行兩個整數n,k。第二行n個整數,a1,a2,an 輸出乙個整數,代表最大餘數。531 230861 k n 2 1e5 0 ai 998244353 這一次解題我們需要用到逆...

牛客網子段乘積

新增鏈結描述 include using namespace std typedef long long ll const int mod 998244353 ll quick ll a,ll b 快速冪 快速冪的迭 法 return ret 1 初始令ans 1,用來存放累積的結果。2 判斷b的二...

牛客第四場 子段乘積

線段樹的運用 線段樹真np 真好用,真強 題目鏈結 直接掃一遍維護區間 會出現 遇見 0 處理麻煩的問題 直接用線段樹 這一問題將會不復存在 將普通的區間加 變成 區間 就可!include include include include include include include includ...