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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】

發(fā)布時(shí)間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P4585


題目大意

nnn個(gè)集合,開(kāi)始每個(gè)集合中有一個(gè)數(shù)字。

  • 開(kāi)啟新的一天并且往集合sss中插入數(shù)字vvv
  • 詢問(wèn)ddd天以內(nèi)插入的數(shù)字(包括最開(kāi)始的)中l~rl\sim rlr集合內(nèi)的數(shù)字異或上xxx的最大值。
  • 所有數(shù)字均在[0,105][0,10^5][0,105]范圍內(nèi)


    解題思路

    線段樹(shù)上每個(gè)節(jié)點(diǎn)維護(hù)一個(gè)可持久化TrieTrieTrie。

    每次插入就把包含sss的節(jié)點(diǎn)插入數(shù)字vvv

    詢問(wèn)就正常查詢即可。

    時(shí)空間復(fù)雜度都是O(nlog?2n)O(n\log^2 n)O(nlog2n)

    好像還有空間是O(nlog?n)O(n\log n)O(nlogn)的線段樹(shù)分治算法,不過(guò)懶得寫了。


    code

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e5+10; int n,m,cnt,p[N],rt[N<<2]; int ch[N<<9][2],last[N<<9]; int Insert(int x,int val,int id,int k=16){int y=++cnt;if(k<0){last[y]=id;return y;}int c=(val>>k)&1;ch[y][c^1]=ch[x][c^1];ch[y][c]=Insert(ch[x][c],val,id,k-1);last[y]=max(last[ch[y][0]],last[ch[y][1]]);return y; } int Ask(int x,int val,int lim,int k=16){if(k<0)return val;int c=(val>>k)&1;if(last[ch[x][c^1]]>=lim)return Ask(ch[x][c^1],val|(1<<k),lim,k-1);if(last[ch[x][c]]>=lim)return Ask(ch[x][c],val^(val&(1<<k)),lim,k-1);return 0; } void Change(int x,int l,int r,int pos,int id,int val){rt[x]=Insert(rt[x],val,id);if(l==r)return;int mid=(l+r)>>1;if(pos<=mid)Change(x*2,l,mid,pos,id,val);else Change(x*2+1,mid+1,r,pos,id,val);return; } int Query(int x,int L,int R,int l,int r,int val,int lim){if(L==l&&R==r)return Ask(rt[x],val,lim);int mid=(L+R)>>1;if(r<=mid)return Query(x*2,L,mid,l,r,val,lim);if(l>mid)return Query(x*2+1,mid+1,R,l,r,val,lim);return max(Query(x*2,L,mid,l,mid,val,lim),Query(x*2+1,mid+1,R,mid+1,r,val,lim)); } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int x;scanf("%d",&x);p[i]=Insert(p[i-1],x,i);}int id=0;for(int i=1;i<=m;i++){int op;scanf("%d",&op);if(op){int l,r,x,d,ans=0;scanf("%d%d%d%d",&l,&r,&x,&d);ans=Query(1,1,n,l,r,x,id-d+1);ans=max(ans,Ask(p[r],x,l));printf("%d\n",ans);}else{int s,v;scanf("%d%d",&s,&v);id++;Change(1,1,n,s,id,v);}}return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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