zoj3965 由2個dfs序還原二叉樹

2021-07-31 02:59:14 字數 810 閱讀 5113

題意:給定兩個二叉樹的dfs序,輸出每個節點的父節點,根的父節點為0,保證有解

題解:當前節點在兩個串中後面的節點假如不同則能確認兩個子樹,如果相同則把下個點作當前點的乙個兒子。如果子樹中還有未連根的點則接到當前點下。son陣列表示每個點的子樹有多少個點。pos陣列記錄每個數在每個序列中的位置。dfs中p1,p2指向同乙個數

lim1,lim2表示當前點子樹可能最大的子樹範圍。

ps:比賽的時候由於沒有加入長度判定,導致一直卡在最後乙個點上。。。。。500ms過490ms wa。。。。。2333333

#include #pragma comment(linker,"/stack:1024000000,1024000000")

using namespace std;

#define maxn 110000

int n,fa[maxn];

int s1[maxn],s2[maxn];

int pos1[maxn],pos2[maxn];

int vis[maxn],son[maxn];

void dfs(int p1,int p2,int lim1,int lim2)

if(!fa[s2[p2+1]])

}else if(s1[p1+1]==s2[p2+1]&&p1+1<=lim1&&p2+1<=lim2)

{fa[ s1[p1+1] ] = now;

dfs(p1+1,p2+1,lim1,lim2);

son[now]+=son[ s1[p1+1] ];

int nt=p1+son[s1[p1+1]]+1;

if(son[now]

每日一題力扣396

給定乙個長度為 n 的整數陣列 a 假設 bk 是陣列 a 順時針旋轉 k 個位置後的陣列,我們定義 a 的 旋轉函式 f 為 f k 0 bk 0 1 bk 1 n 1 bk n 1 計算f 0 f 1 f n 1 中的最大值。方案一 找規律找出來的,class solution def maxr...

396 旋轉函式 dp 數學找規律

難度中等95 假設bk是陣列a順時針旋轉 k 個位置後的陣列,我們定義a的 旋轉函式 f為 f k 0 bk 0 1 bk 1 n 1 bk n 1 計算f 0 f 1 f n 1 中的最大值。注意 可以認為n 的值小於 105。示例 a 4,3,2,6 f 0 0 4 1 3 2 2 3 6 0 ...

CodeForces 396A 數論 組合數學

好久沒做數論的東西了,乙個獲取素數的預處理跟素因子分解寫錯了,哭瞎了,呵呵,首先ai最大值為10 9,n為500,最壞的情況 m最大值為500個10 9相乘,肯定不能獲取m了,首選每乙個ai肯定是m的乙個因子,然後能分解就把ai給分解素因子,這樣全部的ai都分解了 就能得到m的 所有素因子 以及 所...