樹上倍增一些理解和寫法

樹上倍增可以比較容易求得i節點的第k個父親,我們定義一個二維數組fa[i][j]代表節點i的第2^j個父親,關于有什么用我們等會再說,現在先學會怎么去求這個fa數組

我們可以通過從根節點開始一遍dfs求得所有fa數組,首先我們發現fa數組有這樣一個特性,fa[i][j] = fa[ fa[i][j-1] ][j-1],什么意思呢,就是說節點i的第2^j個父親就是i的第2^(j-1)個父親的第2^(j-1)個父親,這看起來似乎是一句顯然成立的廢話,但我們可以通過這個特性以O(nlogn)的復雜度內求fa數組。

我們知道dfs是從根開始,一步一步往下走的,這就說明除了根節點,每個節點當它被dfs到的時候,它的所有父親肯定都已經被dfs過了,這樣通過剛才的關系,就可以由i的第2^(j-1)個父親求fa[i][j]了,我們需要處理的只是i的第2^j個父親有可能不存在罷了。我們初始化fa數組為0,然后從根開始dfs。若有n個節點,則顯然一個節點最多只可能往前找2^log(n)個父親

void dfs(int x)  
{  for(int i=1;i<=logn;i++)  //logn代表log(n)if(fa[x][i-1])   //在dfs(x)之前,x的父親們的fa數組都已經計算過了fa[x][i]=fa[fa[x][i-1]][i-1];  else break;    //x的第2^j個父親可能不存在for(/*每一個與x相連的節點i*/)  if(i!=fa[x][0])     //如果i是x的兒子
        {  fa[i][0]=x;       //記錄兒子的第一個父親是x  dep[i]=dep[x]+1;      //深度  
            dfs(i);  }  
}  

?

求出fa數組后有什么用呢?其實我們可以輕易的在O(logk)內求出i的第k個父親,根據數組定義看起來我們只能求i的第2,4,8...2^j次方個父親,實際上我們可以求出i的第任意個父親

我們有這樣一個事實,任何一個數,都可以寫成多個2的x次方的和,實際上這就是2進制轉10進制的過程,比如:10的二進制表示為1010,它的左數第2位和第4位上是1,所以2^(2-1)+2^(4-1) = 2^1 + 2^3 = 10。這個思想很有用,需要記住

所以對于任意一個數k,只要我們把它寫成若干個2的次方形式的數的和,就可以利用fa數組了。

另外我們代碼中還有個技巧,(1<<i)&k表示k的二進制表示中,左數第(i-1)位上是否為1?

經過上面知識我們可以寫出求i的第k個父親的代碼

int father(int i,int k)  
{  for(int x=0;x<=int(log2(k));x++)  if((1<<x)&k)    i=fa[i][x];     return i;  
}  

?

轉載于:https://www.cnblogs.com/chaoswr/p/8489224.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252284.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖像去畸變和添加畸變

背景&#xff1a;最近的項目中用到的圖像去畸變的知識&#xff0c;剛開始是直接調用opencv中提供的函數cv::initUndistortRectifyMap()和cv::remap()函數&#xff0c;實現圖像的全局去畸變&#xff0c;但是由于圖像的分辨率很高&#xff0c;再加上&#xff0c;實際過程中我們只…

win10上編譯libharu庫

背景&#xff1a; 最近的項目需要自動的生成pdf文件&#xff0c;我在網上查看相關的資料&#xff0c;發現目前比較流行的生成pdf文件的庫有兩個&#xff0c;一個是libpdf&#xff0c;另一個是libharu。libpdf個人使用時免費的但是商業使用就需要收費了&#xff0c;否則得到的p…

爬蟲——正則表達式re模塊

為什么要學習正則表達式 實際上爬蟲一共就四個主要步驟&#xff1a; 明確目標&#xff1a;需清楚目標網站爬&#xff1a;將所有的目標網站的內容全部爬下來取&#xff1a;在爬下來的網站內容中去掉對我們沒有用處的數據&#xff0c;只留取我們需要的數據處理數據&#xff1a;按…

深入Spring Boot:快速集成Dubbo + Hystrix

2019獨角獸企業重金招聘Python工程師標準>>> 背景 Hystrix 旨在通過控制那些訪問遠程系統、服務和第三方庫的節點&#xff0c;從而對延遲和故障提供更強大的容錯能力。Hystrix具備擁有回退機制和斷路器功能的線程和信號隔離&#xff0c;請求緩存和請求打包&#xff…

BZOJ2333 [SCOI2011]棘手的操作 【離線 + 線段樹】

題目 有N個節點&#xff0c;標號從1到N&#xff0c;這N個節點一開始相互不連通。第i個節點的初始權值為a[i]&#xff0c;接下來有如下一些操作&#xff1a; U x y: 加一條邊&#xff0c;連接第x個節點和第y個節點 A1 x v: 將第x個節點的權值增加v A2 x v: 將第x個節點所在的連通…

opencv圖像仿射變換和普通旋轉

背景&#xff1a;今天需要對程序生成的圖像進行旋轉90度和下采樣操作&#xff0c;當然還有改變圖像類型的操作&#xff0c;就是把原來.png的圖像轉換為.jpg的圖像&#xff0c;主要是我目前使用libharu庫&#xff0c;無法成功從本地加載png圖像到pdf中去&#xff0c;不得不使用j…

討厭麻煩的ora 01722無效數字

webservice開發過程中&#xff0c;數據庫由原來的oracle改為現在的sql server。然后重新調試&#xff0c;結果報出ora 01722無效數字的錯誤。 由于連接oracle數據庫的時候并沒有問題&#xff0c;所以一開始我以為是數據庫不同&#xff0c;導致部分數據類型差異&#xff0c;&…

CSS樣式:覆蓋規則

規則一&#xff1a;由于繼承而發生樣式沖突時&#xff0c;最近祖先獲勝。 CSS的繼承機制使得元素可以從包含它的祖先元素中繼承樣式&#xff0c;考慮下面這種情況: <html><head><title>rule 1</title><style>body {color:black;}p {color:blue;}…

try{}里有一個 return 語句,那么緊跟在這個 try 后的 finally {}里的 code 會 不會被執行,什么時候被執行,在 return 前還是后?...

這是一道面試題&#xff0c;首先finally{}里面的code肯定是會執行的&#xff0c;至于在return前還是后&#xff0c; 看答案說的是在return后執行&#xff0c;我覺得不對&#xff0c;百度了一下&#xff0c;有說return前的&#xff0c;有說return后的&#xff0c;還有return中間…

相機和鏡頭選型需要注意哪些問題

背景&#xff1a; 最近需要優于項目需求需要對工業相機和鏡頭進行選型&#xff0c;于是我就開啟的學習相機之旅&#xff0c;雖然我一直在做機器視覺方向&#xff0c;但是我對相機的了解還是很少&#xff0c;我想正好趁這次機會好好學習一下。如果有錯誤的觀點請指正。 一、相…

響應式網頁布局 - W3Schools How-Tos 01

W3Schools教學系列 W3Schools是知名的網頁設計&#xff0f;前端開發教學網站&#xff0c;不僅提供HTML、CSS、JavaScript等的詳盡教學&#xff0c;還可以把它當作說明文件&#xff08;Documents&#xff09;。有經驗的前端或多或少已經接觸過這個網站&#xff0c;因為它經常出現…

正則表達式,終極使用!3個工具,搞定一切

文章前提&#xff0c;本人。不會正則的不論什么語法&#xff0c;僅僅懂一點正則的概念。本人從未自己寫過正則&#xff0c;都是網上收羅進行改動的。相同。沒有時間去研究正則。 可是為了方便&#xff0c;入手了幾個工具。 如今就為大家一一展示。 第一個&#xff0c;regexBuil…

iOS 在tableview的側滑事件里執行tableView.selectRow無效的解決辦法

很奇怪的問題&#xff0c;在執行默認選中一個cell的時候&#xff0c;突然發現這句話不起作用了 &#xff08;我的場景是&#xff1a;當前cell側滑刪除后&#xff0c;默認選中上一個cell&#xff09; 搞了半天&#xff0c;終于發現罪魁禍首竟然是因為&#xff1a;這句話寫在了側…

VS2017 C++工程 執行python腳本

我解決了哪怕很小的一個問題&#xff0c;我也想記錄下來來見證我的經歷。 背景&#xff1a; 一、使用libhuru庫生成pdf報告 最近參與一些測試工作&#xff0c;希望測試結束后能夠根據測試得到的數據和圖像自動生成測試報告&#xff0c;最開始調研到了生成報告的庫有libharu和…

標準正弦波變頻電源調制方式的實現

目前變頻電源正不斷向規模化、專業化、智能化、精細化方向發展。變頻電源的技術隨著工業電器電子制造的興起而不斷得到重視和發展。其中,中港揚以正弦脈SPWM為核心變頻電源系統電路便是一個很好的代表。純硬件電路在焊接電路上比較復雜&#xff0c;但是調節出來的SPWM波形比較完…

Jmeter教程索引貼

Jmeter教程索引貼 新的一年即將到來&#xff0c;不知不覺2015年自己在Jmeter方面總結的文章有十幾篇&#xff0c;在此匯總一下&#xff0c;順便也算是個總結吧。2016年&#xff0c;繼續學習技術&#xff0c;總結&#xff0c;寫文章。 一、基礎部分&#xff1a; 使用Jmeter進行h…

類與接口(二)java的四種內部類詳解

引言 內部類&#xff0c;嵌套在另一個類的里面&#xff0c;所以也稱為 嵌套類; 內部類分為以下四種&#xff1a; 靜態內部類成員內部類局部內部類匿名內部類一、靜態內部類 靜態內部類&#xff1a; 一般也稱”靜態嵌套類“&#xff0c;在類中用static聲明的內部類。 因為是stat…

單例設計模式和多線程

單例設計模式 單例&#xff1a;整個項目中&#xff0c;有某個類或者某些特殊的類&#xff0c;屬于該類的對象只能建立一個。 #include<iostream> using namespace std;class MyCAS { private:MyCAS(){}private:static MyCAS *m_instance;public:static MyCAS *GetInstanc…

運行imgui例程

背景&#xff1a;目前在做一個視覺測試系統&#xff0c;需要做一個界面&#xff0c;將相機獲取的圖像&#xff0c;以及測試過程中的數據呈現在界面上&#xff0c;在我印象里&#xff0c;做界面就用qt吧&#xff0c;直到這個月真要開始做界面了&#xff0c;我的領導給我建議用im…

性能測試總結(三)--工具選型篇

性能測試總結(三)--工具選型篇 本篇文章主要簡單總結下性能測試工具的原理以及如何選型。性能測試和功能測試不同&#xff0c;性能測試的執行是基本功能的重復和并發&#xff0c;需要模擬多用戶&#xff0c;在性能測試執行時需要監控指標參數&#xff0c;同時性能測試的結果不是…