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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P3293-[SCOI2016]美味【主席树】

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3293-[SCOI2016]美味【主席树】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

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


題目大意

給出一個長度為nnn的序列,mmm次詢問給出b,x,l,rb,x,l,rb,x,l,r表示詢問在[l,r][l,r][l,r]中找到一個數字aaa使得bxor(a+x)b\ xor\ (a+x)b?xor?(a+x)的值最大。

1≤n,m≤2×105,0≤a,b,x<1051\leq n,m\leq 2\times10^5,0\leq a,b,x<10^51n,m2×105,0a,b,x<105


解題思路

TrieTrieTrie上想就很容易卡思路,考慮正常情況下我們是怎么求bxorab\ xor\ ab?xor?a最大的。

其實在TrieTrieTrie樹上條等價于每次詢問一個區間內有沒有值然后再選擇往左或者往右,現在這個xxx就是相當于把我們詢問的區間移動了,既然TrieTrieTrie樹解決不了這樣的問題那么就考慮一下主席樹。

定義一下zzz表示異或的那個數的基數(前面枚舉的位已經確定),從大到小枚舉iii,若bbb的第iii位有那么最好是讓a+xa+xa+x的第iii位沒有,也就是詢問[z?x,z?x+2i)[z-x,z-x+2^i)[z?x,z?x+2i)。如果第iii位沒有那么最好是a+xa+xa+x的第iii位有,那么詢問[z?x+2i,z?x+2i+1)[z-x+2^i,z-x+2^{i+1})[z?x+2i,z?x+2i+1)就好了。

時間復雜度O(nlog?2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=2e5+10,M=N<<5,Li=1e5; int n,m,cnt,rt[N],w[M],ls[M],rs[M]; int Change(int x,int L,int R,int pos){int now=++cnt;w[now]=w[x]+1;if(L==R)return now;int mid=(L+R)>>1;if(pos<=mid)ls[now]=Change(ls[x],L,mid,pos),rs[now]=rs[x];else rs[now]=Change(rs[x],mid+1,R,pos),ls[now]=ls[x];return now; } int Ask(int x,int y,int L,int R,int l,int r){if(!(w[y]-w[x]))return 0;if(L==l&&R==r)return w[y]-w[x];int mid=(L+R)>>1;if(r<=mid)return Ask(ls[x],ls[y],L,mid,l,r);if(l>mid)return Ask(rs[x],rs[y],mid+1,R,l,r);return Ask(ls[x],ls[y],L,mid,l,mid)+Ask(rs[x],rs[y],mid+1,R,mid+1,r); } int Query(int L,int R,int l,int r){if(l<0)l=0;if(r>Li)r=Li;if(r<l)return 0;return Ask(rt[L-1],rt[R],0,Li,l,r); } int main() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int x;scanf("%d",&x);rt[i]=Change(rt[i-1],0,Li,x);}while(m--){int b,a,l,r,z=0,ans=0;scanf("%d%d%d%d",&b,&a,&l,&r);for(int i=17;i>=0;i--){if((b>>i)&1){if(Query(l,r,z-a,z-a+(1<<i)-1))ans|=(1<<i);else z|=(1<<i);}else{if(Query(l,r,z-a+(1<<i),z-a+(1<<i+1)-1))ans|=(1<<i),z|=(1<<i);}}printf("%d\n",ans);}return 0; }

總結

以上是生活随笔為你收集整理的P3293-[SCOI2016]美味【主席树】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。