題解 NOIP2018PJ 對稱二叉樹

2022-07-25 17:15:21 字數 1737 閱讀 7406

在考場上的玄學思路:

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

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

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

什麼意思呢?

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

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

同理,判斷時也取反

分四種情況:

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

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

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

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

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

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

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

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

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

當然ac啦!

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

#include #include 

#include

#include

using

namespace

std;

struct

note

;int

n,ans;

note a[

1000010

];int d[1000010

];int

fast_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;

returns;}

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))

returnf;}

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;

}

各位,暴力出奇蹟啊!

題解 NOIP2018PJ 對稱二叉樹

在考場上的玄學思路 首先不斷摸索用手划水,用腳蹬水的動作,經過一段時間的練習,你就學會了游泳 這道題的思路相對來說還是很好想出來的 首先,對於每乙個節點,只要右兒子節點與左兒子節點的權值不同,就肯定不是對稱的,捨去 然後,每一次向下走一層的時候,左子樹跟右子樹的路徑取反 什麼意思呢?就是,你左子樹向...

NOIP2018PJ正式賽 擺渡車

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

NOIP2019 PJ 對稱二叉樹

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