51nod 6級題目 XOR key 問題

2021-07-09 10:54:35 字數 1268 閱讀 9867

這題挺有意思的,就是給你乙個數和一段區間,求區間內的乙個數與這個數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個正...