在考場上的玄學思路:
首先不斷摸索用手划水,用腳蹬水的動作,經過一段時間的練習,你就學會了游泳
這道題的思路相對來說還是很好想出來的(
首先,對於每乙個節點,只要右兒子節點與左兒子節點的權值不同,就肯定不是對稱的,捨去
然後,每一次向下走一層的時候,左子樹跟右子樹的路徑取反
什麼意思呢?
就是,你左子樹向右走,右子樹就向左走;左子樹向左走,右子樹向右走
(如果這裡不能理解建議動手畫圖看一下)
同理,判斷時也取反
分四種情況:
那麼什麼時候滿足對稱性呢?
——當搜尋到兩個節點,兩個節點同為葉子結點且權值相等時
但只要有其中某一條路徑不滿足,整顆子樹肯定不滿足
那麼,按照以上思路打出來的**是多少分的呢?我怎麼知道
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 為子樹根的一棵 子樹 指...