日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【ZJOI2019】线段树【线段树上dp】【大讨论】

發(fā)布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【ZJOI2019】线段树【线段树上dp】【大讨论】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:有一個 [1,n][1,n][1,n] 的線段樹和 mmm 個區(qū)間賦值操作,求任取一個操作的子集并按順序在線段樹上跑后線段樹上有 lazy 標記的點的個數(shù)之和 模 998244353998244353998244353

n,m≤105n,m\leq 10^5n,m105

真·線段樹上 dp

考慮線段樹的情況很復雜,所以大概率是強行討論。

顯然分結(jié)點考慮,即設(shè) f(u)f(u)f(u) 為當前線段樹上結(jié)點 uuu 有標記的概率。

然后對于一次操作,結(jié)點大概分為以下 444 類:

  • 普通結(jié)點:該操作真實操作到的 log?\loglog 個結(jié)點,這些結(jié)點操作后一定有標記。
  • 文藝結(jié)點:普通線段樹修改時經(jīng)過但未覆蓋的點。這些點即使有標記訪問后也會被下放,所以一定沒有標記。
  • 二逼結(jié)點:在父結(jié)點只往兄弟結(jié)點遞歸時,可以得到父結(jié)點標記的結(jié)點。但它是否有標記需要討論。
  • 廢物結(jié)點:和修改沒有任何關(guān)系的結(jié)點。
  • 然后開始討論

    • 普通結(jié)點

    f(u)←f(u)+12f(u)\leftarrow \frac{f(u)+1}{2}f(u)2f(u)+1?

    • 文藝結(jié)點

    f(u)←f(u)2f(u)\leftarrow \frac {f(u)}2f(u)2f(u)?

    • 二逼結(jié)點

    f(u)←f(u)+&#歪比巴卜……2f(u)\leftarrow\frac{f(u)+\texttt{\&\#歪比巴卜……}}{2}f(u)2f(u)+&#歪比巴卜?

    發(fā)現(xiàn)這個修改后有標記的概率不好搞。

    然后考場上瞎傳參亂搞,然后寫崩了……

    冷靜分析我們實際上需要什么東西。

    這個點有標記,當且僅當祖先傳下來了一個標記,或者自己本來就有標記。總之就是 1~u1\sim u1u 的路徑上至少有一個標記。

    這個怎么搞呢?容斥?

    實際上直接開個 g(u)g(u)g(u) 記一下就可以了……

    重新推一下

    • 普通結(jié)點

    自己被標記了,所以到根路徑上一定也有標記。

    f(u)←f(u)+12f(u)\leftarrow \frac{f(u)+1}{2}f(u)2f(u)+1?

    g(u)←g(u)+12g(u)\leftarrow \frac{g(u)+1}{2}g(u)2g(u)+1?

    • 文藝結(jié)點

    自己有標記也會被傳下去。

    f(u)←f(u)2f(u)\leftarrow \frac {f(u)}2f(u)2f(u)?

    g(u)←g(u)2g(u)\leftarrow \frac {g(u)}2g(u)2g(u)?

    • 二逼結(jié)點

    本身有標記當且僅當?shù)礁窂缴嫌袠擞洝R驗樽嫦鹊臉擞浂急粋飨聛砹?#xff0c;所以路徑有標記相當于自己有標記。

    f(u)←f(u)+g(u)2f(u)\leftarrow \frac {f(u)+g(u)}2f(u)2f(u)+g(u)?

    g(u)←g(u)+g(u)2=g(u)g(u)\leftarrow \frac {g(u)+g(u)}2=g(u)g(u)2g(u)+g(u)?=g(u)

    • 廢物結(jié)點

    然后你會發(fā)現(xiàn)還有兩種小類:

  • 底層結(jié)點
  • 普通結(jié)點子樹內(nèi)被減掉的結(jié)點,標記不變,但到根路徑一定有標記。

    g(u)←g(u)+12g(u)\leftarrow \frac {g(u)+1}2g(u)2g(u)+1?

  • 路人結(jié)點
  • 純路人,沒有任何變化。

    然后 普通,文藝,二逼的結(jié)點是 O(log?n)O(\log n)O(logn) 的,直接暴力。底層結(jié)點可以打 lazy 標記,路人結(jié)點不管。

    復雜度 O(nlog?n)O(n\log n)O(nlogn)

    #include <iostream> #include <cstdio> #include <cstring> #include <cctype> #define MAXN 100005 using namespace std; inline int read() {int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans; } typedef long long ll; const int MOD=998244353,INV=(MOD+1)>>1; int f[MAXN<<3],g[MAXN<<3],s[MAXN<<3]; int add[MAXN<<3],mul[MAXN<<3]; #define lc p<<1 #define rc p<<1|1 inline void update(int p){s[p]=((ll)f[p]+(ll)s[lc]+s[rc])%MOD;} inline void pushlzy(int p,int m,int v){g[p]=((ll)g[p]*m+v)%MOD;mul[p]=(ll)mul[p]*m%MOD,add[p]=((ll)add[p]*m+v)%MOD;} inline void pushdown(int p) {if (add[p]||mul[p]>1){pushlzy(lc,mul[p],add[p]),pushlzy(rc,mul[p],add[p]);add[p]=0,mul[p]=1;} } void modify(int p,int l,int r,int ql,int qr) {if (ql<=l&&r<=qr) return (void)(f[p]=(f[p]+1ll)*INV%MOD,pushlzy(p,INV,INV),update(p));pushdown(p);f[p]=(ll)f[p]*INV%MOD,g[p]=(ll)g[p]*INV%MOD;int mid=(l+r)>>1;if (qr<=mid){f[rc]=((ll)f[rc]+g[rc])*INV%MOD;update(rc);modify(lc,l,mid,ql,qr);return update(p);}if (ql>mid){f[lc]=((ll)f[lc]+g[lc])*INV%MOD;update(lc);modify(rc,mid+1,r,ql,qr); return update(p);}modify(lc,l,mid,ql,qr),modify(rc,mid+1,r,ql,qr);update(p); } int main() {freopen("segment.in","r",stdin);freopen("segment.out","w",stdout);for (int i=0;i<(MAXN<<3);i++) mul[i]=1;int n=read(),cur=1;for (int m=read();m;m--){int t=read();if (t==1){int l,r;l=read(),r=read();modify(1,1,n,l,r);cur=cur*2%MOD;}else printf("%lld\n",(ll)s[1]*cur%MOD);}return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的【ZJOI2019】线段树【线段树上dp】【大讨论】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。