線段樹什麼的最討厭了

2021-09-10 02:18:41 字數 1438 閱讀 2878

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作用域下的。通過匿名函式...