題解 NOIP2018PJ 對稱二叉樹

2021-09-09 06:06:40 字數 1908 閱讀 6820

在考場上的玄學思路:

首先不斷摸索用手划水,用腳蹬水的動作,經過一段時間的練習,你就學會了游泳

這道題的思路相對來說還是很好想出來的(

首先,對於每乙個節點,只要右兒子節點與左兒子節點的權值不同,就肯定不是對稱的,捨去

然後,每一次向下走一層的時候,左子樹跟右子樹的路徑取反

什麼意思呢?

就是,你左子樹向右走,右子樹就向左走;左子樹向左走,右子樹向右走

(如果這裡不能理解建議動手畫圖看一下)

同理,判斷時也取反

分四種情況:

那麼什麼時候滿足對稱性呢?

——當搜尋到兩個節點,兩個節點同為葉子結點且權值相等時

但只要有其中某一條路徑不滿足,整顆子樹肯定不滿足

那麼,按照以上思路打出來的**是多少分的呢?我怎麼知道

96分哦,炸了,極限資料卡成一條鏈了……

那麼,我們還可以加上什麼優化呢?

給大家3分鐘的思考時間……

優化很簡單——只要左右子樹的節點數目不同,則結構肯定不對稱!

那麼這個優化加上去多少分?

當然ac啦!

上**!喂喂喂**老師怎麼回事bgm呢

#include

#include

#include

#include

using

namespace std;

struct note

;int n,ans;

note a[

1000010];

int d[

1000010];

intfast_read()

ch=getchar()

;}while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int

dfs(

int root)

int s=1;

if(a[root]

.left!=-1

)if(a[root]

.right!=-1

) d[root]

=s;return s;

}bool

dfs2

(int left,

int right)

if(a[left]

.left==-1

)}if(a[left]

.right!=-1

)}if(a[left]

.left!=-1

)}if(a[left]

.right==-1

)}if(a[left]

.right==-1

&&a[left]

.left==-1

)bool f=1;

if(!dfs2

(a[left]

.left,a[right]

.right))if

(!dfs2

(a[left]

.right,a[right]

.left)

)return f;

}void

work()

}else

//printf("%d\n",ans);}}

intmain()

for(

int i=

1;i<=n;i++

)int k=

dfs(1)

;work()

;/*for(int i=1;i<=n;i++)

*/printf

("%d\n"

,ans)

;return0;

}

一堆除錯語句請見諒……

update 18.11.16

考場上沒有不同節點數的優化a了

感謝同機房巨佬的提醒,某處錯誤已改正

題解 NOIP2018PJ 對稱二叉樹

在考場上的玄學思路 這道題的思路相對來說還是很好想出來的 首先,對於每乙個節點,只要右兒子節點與左兒子節點的權值不同,就肯定不是對稱的,捨去 然後,每一次向下走一層的時候,左子樹跟右子樹的路徑取反 什麼意思呢?就是,你左子樹向右走,右子樹就向左走 左子樹向左走,右子樹向右走 如果這裡不能理解建議動手...

NOIP2018PJ正式賽 擺渡車

題目描述 有 名同學要乘坐擺渡車從人大附中前往人民大學,第 位同學在第 分鐘去等車。只有一輛擺渡車在工作,但擺渡車容量可以視為無限大。擺渡車從人大附中出發 把車上的同學送到人民大學 再回到人大附中 去接其他同學 這樣往返一趟總共花費 分鐘 同學上下車時間忽略不計 擺渡車要將所有同學都送到人民大學。凱...

NOIP2019 PJ 對稱二叉樹

一棵有點權的有根樹如果滿足以下條件,則被軒軒稱為對稱二叉樹 下圖中節點內的數字為權值,節點外的 id 表示節點編號。現在給出一棵二叉樹,希望你找出它的一棵子樹,該子樹為對稱二叉樹,且節點數最多。請輸出這棵子樹的節點數。注意 只有樹根的樹也是對稱二叉樹。本題中約定,以節點 t 為子樹根的一棵 子樹 指...