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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

bzoj [Scoi2016]美味

發(fā)布時(shí)間:2025/5/22 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj [Scoi2016]美味 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?[Scoi2016]美味

Time Limit:?30 Sec??Memory Limit:?256 MB
Submit:?721??Solved:?391
[Submit][Status][Discuss]

Description

一家餐廳有 n 道菜,編號 1...n ,大家對第 i 道菜的評價(jià)值為 ai(1≤i≤n)。有 m 位顧客,第 i 位顧客的期 望值為 bi,而他的偏好值為 xi 。因此,第 i 位顧客認(rèn)為第 j 道菜的美味度為 bi XOR (aj+xi),XOR 表示異或 運(yùn)算。第 i 位顧客希望從這些菜中挑出他認(rèn)為最美味的菜,即美味值最大的菜,但由于價(jià)格等因素,他只能從第? li 道到第 ri 道中選擇。請你幫助他們找出最美味的菜。

Input

第1行,兩個整數(shù),n,m,表示菜品數(shù)和顧客數(shù)。 第2行,n個整數(shù),a1,a2,...,an,表示每道菜的評價(jià)值。 第3至m+2行,每行4個整數(shù),b,x,l,r,表示該位顧客的期望值,偏好值,和可以選擇菜品區(qū)間。 1≤n≤2×10^5,0≤ai,bi,xi<10^5,1≤li≤ri≤n(1≤i≤m);1≤m≤10^5

Output

?輸出 m 行,每行 1 個整數(shù),ymax ,表示該位顧客選擇的最美味的菜的美味值。

Sample Input

4 4
1 2 3 4
1 4 1 4
2 3 2 3
3 2 3 3
4 1 2 4

Sample Output

9
7
6
7

HINT

Source

?

題解:

區(qū)間最大異或值的經(jīng)典做法是可持久化trie,但是加上一個數(shù)的話可持久化trie就變得非常的扯淡

考慮可持久化trie其實(shí)可以等價(jià)為一顆上限為2^k-1的主席樹,在trie上確定一位其實(shí)相當(dāng)于將答案的區(qū)間縮小的一半,也就是在主席樹上向下走一層

當(dāng)所有數(shù)加上x之后,我們在主席樹上走的時(shí)候就不能直接調(diào)用siz[son[x][0]],但是因?yàn)樗袛?shù)都被加了,所以我們其實(shí)要查詢的是左子樹的區(qū)間向前竄x位之后的區(qū)間有沒有數(shù),這樣的話每次走的時(shí)候在主席樹上重新查[l-x,mid-x]或者[mid+1-x,r-x]來判斷應(yīng)該往哪邊走即可,復(fù)雜度多了個log,但是n=2*10^5,不虛

然后就過了

時(shí)間復(fù)雜度O(m log^2 n)

1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 const int N=1<<18; 6 const int maxn=200010; 7 int n,m,tot; 8 int rt[maxn]; 9 struct node 10 { 11 int ls,rs,siz; 12 }s[maxn*30]; 13 void insert(int x,int &y,int l,int r,int a) 14 { 15 y=++tot,s[y].siz=s[x].siz+1; 16 if(l==r) return ; 17 int mid=(l+r)>>1; 18 if(a<=mid) s[y].rs=s[x].rs,insert(s[x].ls,s[y].ls,l,mid,a); 19 else s[y].ls=s[x].ls,insert(s[x].rs,s[y].rs,mid+1,r,a); 20 } 21 int query(int l,int r,int x,int y,int a,int b) 22 { 23 if(a<=l&&r<=b) return s[x].siz-s[y].siz; 24 int mid=(l+r)>>1; 25 if(b<=mid) return query(l,mid,s[x].ls,s[y].ls,a,b); 26 if(a>mid) return query(mid+1,r,s[x].rs,s[y].rs,a,b); 27 return query(l,mid,s[x].ls,s[y].ls,a,b)+query(mid+1,r,s[x].rs,s[y].rs,a,b); 28 } 29 inline int find(int l,int r,int a,int b) 30 { 31 int i,j=0,d; 32 for(i=1<<18;i;i>>=1) 33 { 34 d=(b&i)>0; 35 if(d&&!query(0,N,rt[r],rt[l-1],j-a,j+i-a-1)) j+=i; 36 if(!d&&query(0,N,rt[r],rt[l-1],j+i-a,j+i+i-a-1)) j+=i; 37 } 38 return b^j; 39 } 40 inline int rd() 41 { 42 int ret=0,f=1; char gc=getchar(); 43 while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();} 44 while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar(); 45 return ret*f; 46 } 47 int main() 48 { 49 int i,a,b,c,d; 50 n=rd(),m=rd(); 51 for(i=1;i<=n;i++) 52 a=rd(),insert(rt[i-1],rt[i],0,N,a); 53 for(i=1;i<=m;i++) 54 { 55 a=rd(),b=rd(),c=rd(),d=rd(); 56 printf("%d\n",find(c,d,b,a)); 57 } 58 }

?

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

總結(jié)

以上是生活随笔為你收集整理的bzoj [Scoi2016]美味的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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