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