xsy2274 平均值 線段樹

2022-05-03 19:00:07 字數 1580 閱讀 3682

題目大意:給你乙個長度為$n$的序列$a$,請你求:

$\sum\limits_^\sum\limits_^\dfrac,...,a_r)}$

對998244353取模

資料範圍:$n≤5\times 10^5$

我們考慮把原先的式子轉化一下

令$s[i]=\sum\limits_^ \frac$。

令$f[i][l]$表示最小的$x$,滿足$mex(a_l,a_,...,a_x)≥i$。若找不到這樣的$x$,$f[i][l]=n+1$

不難發現,原先答案的式子我們可以轉化:

$\sum\limits_^\sum\limits_^s[n-l+1]-s[f[i][l]-l]$

其中lim表示最大的數x,滿足0到x-1中的數都出現過

然後我們發現,當i不變時,$f[i]$的值是遞增的,且有大量的值是相同的,且以區間的形式出現。

我們可以基於這個性質,通過線段樹打標記,快速地將$f[i]$的值更新至$f[i+1]$。

線段樹統計的同時維護答案的式子,每次累加即可。

1 #include2

#define m (1<<19)

3#define l long long

4#define mid ((a[x].l+a[x].r)>>1)

5#define mod 998244353

6using

namespace

std;

78 l pow_mod(l x,l k)

9 l inv[m]=,s[m]=,n;

10 l s(int l,int r)

1112

struct sega[m*2

];13

14void pushup(int

x)19

void upd(int x,int

k)23

void pushdown(int

x)27

28int build(int x,int l,int

r)32

33void updata(int x,int l,int r,int

k)40

if(l<=a[x].l&&a[x].r<=r)45}

46pushdown(x);

47if(l<=mid) updata(x<<1

,l,r,k);

48if(mid1|1

,l,r,k);

49pushup(x);50}

5152

struct

node

54 friend bool

operator

<(node a,node b)

55}p[m];

5657

intmain()

77 updata(1,last+1

,p[i].id,p[i].id);

78 last=p[i].id;79}

8081 ans=(ans+a[1].sum)%mod;82}

8384 cout<<(s[n]*hh-ans+mod)%mod<85 }

637 二叉樹的層平均值

給定乙個非空二叉樹,返回乙個由每層節點平均值組成的陣列.示例 1 輸入 3 9 20 15 7 輸出 3,14.5,11 解釋 第0層的平均值是 3,第1層是 14.5,第2層是 11.因此返回 3,14.5,11 注意 節點值的範圍在32位有符號整數範圍內。class solution res.a...

637 二叉樹的層平均值

給定乙個非空二叉樹,返回乙個由每層節點平均值組成的陣列.示例 1 輸入 3 9 20 15 7 輸出 3,14.5,11 解釋 第0層的平均值是 3,第1層是 14.5,第2層是 11.因此返回 3,14.5,11 注意 節點值的範圍在32位有符號整數範圍內。definition for a bin...

637 二叉樹的層平均值

題目描述 給定乙個非空二叉樹,返回乙個由每層節點平均值組成的陣列。示例 1 輸入 輸出 3,14.5,11 解釋 第 0 層的平均值是 3 第1層是 14.5 第2層是 11 因此返回 3,14.5,11 節點值的範圍在32位有符號整數範圍內。方法1 使用佇列實現廣度優先 主要思路 1 正常點的使用...