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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

●洛谷P3688 [ZJOI2017]树状数组

發(fā)布時(shí)間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ●洛谷P3688 [ZJOI2017]树状数组 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題鏈:

https://www.luogu.org/problemnew/show/P3688
題解:

二維線段樹。

先不看詢問時(shí)l=1的特殊情況。


對于一個(gè)詢問(l,r),如果要讓錯(cuò)誤的程序得到正確答案,
顯然應(yīng)該滿足l-1位置的值=r位置的值(或者說兩個(gè)位置的異或值為0)。
那么定義二元組函數(shù)f(x,y)表示x位置與y位置的異或值為0的概率
如果可以維護(hù)出所有這樣的二元組的函數(shù)值,
對于一個(gè)詢問的話,就可以很方便的回答了。
現(xiàn)在看看,怎樣維護(hù)這樣的二元組的函數(shù)值。
假設(shè)現(xiàn)在給出了一個(gè)操作1:(L,R),(令prob=1/len)
那么顯然,對于如下這些二元組:(0~L-1,L~R)和(L~R,R+1~N),
它們的函數(shù)值都會(huì)乘上(1-prob),因?yàn)橛?1-prob)的概率無法使得其異或值改變。
再對于這些二元組(L~R,L~R),它們的函數(shù)值都會(huì)乘上(1-2*prob)。
把上面的二元組看出平面上的點(diǎn),那么每個(gè)操作1就對應(yīng)著改變平面上若干個(gè)矩形的值。
所以就直接使用二維線段樹(樹套樹)去維護(hù)二維區(qū)間修改+單點(diǎn)查詢

至于詢問中l(wèi)=1的情況,如果要讓錯(cuò)誤程序得到正確答案,那么[1~r-1]這一段的異或和就應(yīng)該等于[r+1~N]這一段的異或和。
這里有這么一種做法:
記錄到當(dāng)前詢問位置,之前有了cnt個(gè)1操作。
然后二維線段樹查詢f(0,r)的得到prob,
由于0位置不可能被隨機(jī)到1操作,
所以prob就表示r位置被之前的所有1操作弄成0的概率,(即有偶數(shù)個(gè)1操作隨機(jī)到了r位置的概率)。
如果cnt為偶數(shù),那么一定[1~r-1]這一段和[r+1~N]這一段被1操作隨機(jī)到的奇偶性相同,
也就是說[1~r-1]這一段的異或和就應(yīng)該等于[r+1~N]這一段的異或和,所以答案就是prob.

反之,如果cnt為奇數(shù),(1-prob)表示r位置被之前的所有1操作弄成1的概率,(即有奇數(shù)個(gè)1操作隨機(jī)到了r位置的概率)。
這樣的話那么也一定[1~r-1]這一段和[r+1~N]這一段被1操作隨機(jī)到的奇偶性相同,
也就是說[1~r-1]這一段的異或和就應(yīng)該等于[r+1~N]這一段的異或和,所以答案就是(1-prob).


代碼:

?

#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
const int MOD=998244353;
int N,M,cnt;
int merge(int p1,int p2){return (1ll*p1*p2+1ll*(1-p1+MOD)*(1-p2+MOD))%MOD;
}
struct SGT2{int size;int ls[MAXN*200],rs[MAXN*200],p[MAXN*200];void Modify(int &u,int l,int r,int yl,int yr,int prob){if(!u) u=++size,p[u]=1;if(yl<=l&&r<=yr) return (void)(p[u]=merge(p[u],prob));int mid=(l+r)>>1;if(yl<=mid) Modify(ls[u],l,mid,yl,yr,prob);if(mid<yr) Modify(rs[u],mid+1,r,yl,yr,prob);}int Query(int u,int l,int r,int py){if(!u) return 1;int ret=merge(1,p[u]);if(l==r) return ret;int mid=(l+r)>>1;if(py<=mid) ret=merge(ret,Query(ls[u],l,mid,py));else ret=merge(ret,Query(rs[u],mid+1,r,py));return ret;}
}DTy;
struct SGT1{int size,root;int ls[MAXN*2],rs[MAXN*2],yroot[MAXN*2];void Modify(int &u,int l,int r,int xl,int xr,int yl,int yr,int prob){if(!u) u=++size;if(xl<=l&&r<=xr) return DTy.Modify(yroot[u],0,N+1,yl,yr,prob);int mid=(l+r)>>1;if(xl<=mid) Modify(ls[u],l,mid,xl,xr,yl,yr,prob);if(mid<xr) Modify(rs[u],mid+1,r,xl,xr,yl,yr,prob);}int Query(int u,int l,int r,int px,int py){if(!u) return 1;int ret=merge(1,DTy.Query(yroot[u],0,N+1,py));if(l==r) return ret;int mid=(l+r)>>1;if(px<=mid) ret=merge(ret,Query(ls[u],l,mid,px,py));else ret=merge(ret,Query(rs[u],mid+1,r,px,py));return ret;}
}DTx;
int fastpow(int a,int b){int ret=1;for(;b;a=1ll*a*a%MOD,b>>=1)if(b&1) ret=1ll*ret*a%MOD;return ret;
}
int main(){//cout<<fastpow(3,MOD-2)<<endl;scanf("%d%d",&N,&M);int t,l,r,prob,ans;for(int i=1;i<=M;i++){scanf("%d%d%d",&t,&l,&r);if(t==1){cnt++;prob=fastpow(r-l+1,MOD-2);DTx.Modify(DTx.root,0,N+1,0,l-1,l,r,(1ll-prob+MOD)%MOD);DTx.Modify(DTx.root,0,N+1,l,r,r+1,N+1,(1ll-prob+MOD)%MOD);if(r-l+1>=2) DTx.Modify(DTx.root,0,N+1,l,r,l,r,(1ll-2ll*prob+2ll*MOD)%MOD);}else{l--;ans=DTx.Query(DTx.root,0,N+1,l,r);if(l==0){if((cnt&1)==0) printf("%d\n",ans);else printf("%d\n",(1-ans+MOD)%MOD);}else printf("%d\n",ans);}}return 0;
}

?

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/zj75211/p/8541662.html

總結(jié)

以上是生活随笔為你收集整理的●洛谷P3688 [ZJOI2017]树状数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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