五校聯考1day1 線段樹什麼的最討厭了

2021-09-10 02:54:08 字數 1098 閱讀 7614

只要呼叫buildtree(1,0,n) 就可以得到一顆線段樹了。顯然,一顆線段樹一共有o(n) 個節點,因為每乙個節點都代表了乙個不同的區間,所以線段樹上一共出現了o(n) 個不同的區間。

現在給了你乙個區間[l, r],他想要你告訴他乙個最小的n 使得區間[l; r] 出現在了用buildtree(1,0,n) 建出來的線段樹中。

看到給定的buildtree(1,0,n),一種就簡單的解法就是列舉n(r~lim),直接呼叫此函式,順推下去,判斷是否符合。(預期得分:30或0)

既然順推不行,要列舉n,會爆,那就逆推

深搜(從答案[l,r]往[0,lim]搜)

[l,r]->[l,2 * r-l],

——[l,2 * r-l+1],

——[2 * (l-1)-r,r],

——[2 * (l-1)-r+1,r]

當 l==0 時,就更新ans

然後就要加剪枝

一:顯而易見,當超出限制時,即 r>lim or l<0 ,則return

二:當 l>r or r>ans 時,則return

三:接著就是特判了

1、l== r or l==0 則可以直接輸出r

2、經過推理和嘗試, 發現 2*l<=r ,可直接輸出-1;ans<=x+y,所以lim=min(lim,l+r)

自己感性理解一下

#includeusing namespace std;

int t,x,y,lim,ans;

void dfs(int l,int r)

dfs(l,r*2-l);

dfs(l,r*2+1-l);

dfs((l-1)*2-r,r);

dfs((l-1)*2+1-r,r);

}int main()

if(2*x<=y)

ans=2e9+7;

dfs(x,y);

if(ans!=2e9+7)

cout<

else

cout<

}}

五校聯考1day1 已經沒有什麼好害怕的了

小y 最近開始學習演算法姿勢,但是因為小r 非常bb,給了她很多b6 題,所以她覺得自己已經沒有什麼前途了。於是小r 給了她一些稍微簡單的題,讓她覺得已經沒有什麼好害怕的了,其中一道是這樣的 給定乙個長度為n 只包含左括號和右括號的序列,現在小r 想要知道經過每乙個位置的合法子串有多少個。空串是乙個...

五校聯考1day1 已經沒有什麼好害怕的了

description 小y 最近開始學習演算法姿勢,但是因為小r 非常bb,給了她很多b6 題,所以她覺得自己已經沒有什麼前途了。於是小r 給了她一些稍微簡單的題,讓她覺得已經沒有什麼好害怕的了,其中一道是這樣的 給定乙個長度為n 只包含左括號和右括號的序列,現在小r 想要知道經過每乙個位置的合法...

五校聯考1day1 我才不是蘿莉控呢

小y 小r 你是蘿莉控嗎。小r 為了避免這個尷尬的話題,小r 決定給小y 做一道題。有乙個長度為n 的正整數陣列a,滿足ai ai 1,現在構造乙個陣列b,令bi 現在,有乙個n n 的網格圖,左下角座標是 1,1 右上角座標是 n,n 有乙個小sb正在座標為 n,1 的位置,每一時刻,如果他現在在...