description
小y 最近學習了線段樹,但是由於她的智商比較低,運用的還不是很熟練。於是小r 給了她一點練習題訓練,其中有一道是這樣的。
這是小r 寫的線段樹的一段建樹**:
只要呼叫buildtree(1,0,n) 就可以得到一顆線段樹了。顯然,一顆線段樹一共有o(n) 個節點,因為每乙個節點都代表了乙個不同的區間,所以線段樹上一共出現了o(n) 個不同的區間。
現在小r 給了你乙個區間[l; r],他想要你告訴他乙個最小的n 使得區間[l; r] 出現在了用buildtree(1,0,n) 建出來的線段樹中。
input
第一行輸入乙個正整數t 表示資料組數。
接下來t 行每行三個整數l;r; lim 表示一組詢問,如果對於所有的0 <= n <= lim 都不存在滿足條件的解,輸出-1 即可。
output
對於每組詢問輸出乙個答案。
.分析
我們可以從該區間逆向推它的父節點
以該區間為左子樹或為右子樹
共有四種情況:
q=y-x+1;
dfs(x-q,y);
dfs(x-q-1,y);
dfs(x,y+q-1);
dfs(x,y+q);
一定注意剪枝,沒做好可能會直接爆蛋..
...程式:
#include#include#includeusing namespace std;
long long l,r,lim;
long long minn;
void dfs(long long x,long long y)
long long q=y-x+1;
if (x-q==0||x-q>=q+q) dfs(x-q,y);
if (x-q==1||x-q-1>=q+q+1) dfs(x-q-1,y);
if (x>=q+q-1) dfs(x,y+q-1);
if (x>q+q) dfs(x,y+q);
}int main()
if (l>r)
minn=2147483647;
dfs(l,r);
if (minn!=2147483647)
else printf("-1\n");
} return 0;
}
線段樹什麼的最討厭了
description 小y 最近學習了線段樹,但是由於她的智商比較低,運用的還不是很熟練。於是小r 給了她一點練習題訓練,其中有一道是這樣的。這是小r 寫的線段樹的一段建樹 只要呼叫buildtree 1,0,n 就可以得到一顆線段樹了。顯然,一顆線段樹一共有o n 個節點,因為每乙個節點都代表了...
五校聯考1day1 線段樹什麼的最討厭了
只要呼叫buildtree 1,0,n 就可以得到一顆線段樹了。顯然,一顆線段樹一共有o n 個節點,因為每乙個節點都代表了乙個不同的區間,所以線段樹上一共出現了o n 個不同的區間。現在給了你乙個區間 l,r 他想要你告訴他乙個最小的n 使得區間 l r 出現在了用buildtree 1,0,n ...
全域性變數汙染什麼的最討厭了
用匿名函式將指令碼包起來 使用多級命名空間。這第二條 使用多級命名空間 這個,我覺得並不是很完美的好主意。因為如果級數太多的話會造成變數名字變得長的一逼。沒有做過任何優化的滿目瘡痍的 a.js 和 b.js 都有全域性變數window.a,導致衝突,全域性變數屬於window作用域下的。通過匿名函式...