這題挺有意思的,就是給你乙個數和一段區間,求區間內的乙個數與這個數xor起來的最大值,輸出之。
很自然的想到trie樹來做,然後用線段樹套起來,發現效率o(q∙lg(n)∙lg(10^9))很不錯嘛,於是做之,寫了trie的合併,判漏了當主樹存在副樹不存在的合併情況,調之;寫個巨集定義導致max內多次呼叫solve導致超時,調之。終於在乙個多小時之後成功ac.
二話不說上**
#include
#define lc(x) ch[x][0]
#define rc(x) ch[x][1]
#define ls o<<1
#define rs (ls)+1
#define tls ls,l,mid
#define trs rs,mid+1,r
#define cm int mid=(l+r)>>1
#define root 1,1,n
using namespace std;
const int n = 50000+10;
const int len = 32;
const int siz = n*len
*2;int cnt=0;
int n,q,a[n],tmp[len+1];
int cn,ch[siz][2];
int max(int a,int b)
int create()
struct trie
}int solve(int
x) return ret;
}void merge(int o,int o1,int o2,int dep)
};struct tree
void build(int o,int l,int r)
cm; build(tls); build(trs);
pushup(o);
}int query(int o,int l,int r,int l,int r,int v)
int ret=0; cm;
if(l<=mid) ret=max(ret,query(tls,l,r,v));
if(mid+1
<=r) ret=max(ret,query(trs,l,r,v));
return ret;
}}t;int main()
return
0;}
51nod 演算法馬拉松6 索函式 (規律題目)
總的來說是要先找規律的題目,然後就是乙個球log2 f n 的技巧。這題目的解題報告說的很詳細 通過列出前幾項觀察可以發現,答案其實是2 k 1,其中k為fib n 在二進位制表示中的位數,記為bit f n 下面來證明該結論。用數學歸納法。對於m 0,1時該結論顯然成立。設當m當m n時,由於f ...
51nod 4級演算法 1405
給定一棵無根樹,假設它有n個節點,節點編號從1到n,求任意兩點之間的距離 最短路徑 之和。第一行包含乙個正整數n n 100000 表示節點個數。後面 n 1 行,每行兩個整數表示樹的邊。output每行乙個整數,第i i 1,2,n 行表示所有節點到第i個點的距離之和。4 1 23 2 4 253...
51nod 2級演算法題 1007
基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 收藏 關注 將一堆正整數分為2組,要求2組的和相差最小。例如 1 2 3 4 5,將1 2 4分為1組,3 5分為1組,兩組和相差1,是所有方案中相差最少的。第1行 乙個數n,n為正整數的數量。第2 n 1行,n個正...