bzoj [Scoi2016]美味
生活随笔
收集整理的這篇文章主要介紹了
bzoj [Scoi2016]美味
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?[Scoi2016]美味
Time Limit:?30 Sec??Memory Limit:?256 MBSubmit:?721??Solved:?391
[Submit][Status][Discuss]
Description
一家餐廳有 n 道菜,編號 1...n ,大家對第 i 道菜的評價值為 ai(1≤i≤n)。有 m 位顧客,第 i 位顧客的期 望值為 bi,而他的偏好值為 xi 。因此,第 i 位顧客認(rèn)為第 j 道菜的美味度為 bi XOR (aj+xi),XOR 表示異或 運算。第 i 位顧客希望從這些菜中挑出他認(rèn)為最美味的菜,即美味值最大的菜,但由于價格等因素,他只能從第? li 道到第 ri 道中選擇。請你幫助他們找出最美味的菜。Input
第1行,兩個整數(shù),n,m,表示菜品數(shù)和顧客數(shù)。 第2行,n個整數(shù),a1,a2,...,an,表示每道菜的評價值。 第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^5Output
?輸出 m 行,每行 1 個整數(shù),ymax ,表示該位顧客選擇的最美味的菜的美味值。
Sample Input
4 41 2 3 4
1 4 1 4
2 3 2 3
3 2 3 3
4 1 2 4
Sample Output
97
6
7
HINT
Source
?
題解:
區(qū)間最大異或值的經(jīng)典做法是可持久化trie,但是加上一個數(shù)的話可持久化trie就變得非常的扯淡
考慮可持久化trie其實可以等價為一顆上限為2^k-1的主席樹,在trie上確定一位其實相當(dāng)于將答案的區(qū)間縮小的一半,也就是在主席樹上向下走一層
當(dāng)所有數(shù)加上x之后,我們在主席樹上走的時候就不能直接調(diào)用siz[son[x][0]],但是因為所有數(shù)都被加了,所以我們其實要查詢的是左子樹的區(qū)間向前竄x位之后的區(qū)間有沒有數(shù),這樣的話每次走的時候在主席樹上重新查[l-x,mid-x]或者[mid+1-x,r-x]來判斷應(yīng)該往哪邊走即可,復(fù)雜度多了個log,但是n=2*10^5,不虛
然后就過了
時間復(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hbase:原理和设计
- 下一篇: HTML 5常用的交互元素————内容交