題目大意:給你乙個長度為$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 正常點的使用...