P5597 【XR-4】復讀 思維題 +二叉樹合併
題意:
分析:
由於這是一個無限大的完全二叉樹,所以不合法的方案僅存在於跳到根節點的父親這一種,且由於指令會無限重複,所以我們必須保證指令會使得離開被標記的子樹的時候,所有被標記的點已經全部訪問完,因為我們不會折返回去向上跳的
那麼我們考慮列舉它是經過哪條路徑,從哪個點離開整顆子樹的,只要保證在走這條路經的同時遍歷完所有的點,且由於指令會無限重複,所以我們對於路徑上每一個點,將所有的子樹求一個形態上的並集,只要使得整個並集能被訪問,那麼所有的點都會被訪問到,最後的答案就是 ( c n t − 1 ) ∗ 2 − d e p (cnt-1)*2-dep (cnt−1)∗2−dep,其中 c n t cnt cnt是並集的樹上節點數, d e p dep dep為我們列舉的離開的點的深度
程式碼:
#include<bits/stdc++.h>
using namespace std;
namespace zzc
{
const int maxn = 2e3+5;
int ans=1e9+7,cnt,cur,rt,pos;
char ch[maxn],pth[maxn];
struct tree
{
int lc,rc;
}f[maxn],g[maxn];
void build(int &x)
{
if(!x) x=++cnt;
int t=ch[pos++]-'0';
if(t&1) build(f[x].lc);
if(t&2) build(f[x].rc);
}
void merge(int &x,int y)
{
if(!x) x=++cnt;
if(y==cur) return ;
if(f[y].lc) merge(g[x].lc,f[y].lc);
if(f[y].rc) merge(g[x].rc,f[y].rc);
}
void solve(int u,int dep)
{
if(u!=1)
{
memset(g,0,sizeof(g));
cur=cnt=1;
while(cur)
{
const int t=cur;
for(int i=0;i<dep;i++)
{
cur=pth[i]=='l'?f[cur].lc:f[cur].rc;
}
merge(rt=1,t);
}
ans=min(ans,(cnt-1)*2-dep);
}
pth[dep]='l';
if(f[u].lc) solve(f[u].lc,dep+1);
pth[dep]='r';
if(f[u].rc) solve(f[u].rc,dep+1);
}
void work()
{
scanf("%s",ch);pos=0;cnt=1;
build(rt=1);
solve(1,0);
printf("%d\n",ans);
}
}
int main()
{
zzc::work();
return 0;
}
相關文章
- leetcode 每日一題 617 合併二叉樹LeetCode每日一題二叉樹
- 【Leetcode千題】617. 合併二叉樹LeetCode二叉樹
- 6.20-合併二叉樹二叉樹
- LeetCode.617. 合併二叉樹LeetCode二叉樹
- LeetCode617. 合併二叉樹LeetCode二叉樹
- leetcode 617.合併二叉樹 JavaLeetCode二叉樹Java
- 組合計數思維題
- 思維體系---技術思維、業務資料思維、產品思維、複合思維
- 99恢復二叉樹二叉樹
- 236、二叉樹的最近公共祖先 | 演算法(leetcode,附思維導圖 + 全部解法)300題二叉樹演算法LeetCode
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 102、二叉樹的層序遍歷 | 演算法(leetcode,附思維導圖 + 全部解法)300題二叉樹演算法LeetCode
- 《演算法筆記》8. 二叉樹的遞迴思維實戰演算法筆記二叉樹遞迴
- 相同二叉樹和鏡面二叉樹問題二叉樹
- 88、合併兩個有序陣列 | 演算法(leetcode,附思維導圖 + 全部解法)300題陣列演算法LeetCode
- 系統分析與綜合思維相結合:又見森林又見樹木 - hjorteland
- CF 1436 E 線段樹+思維
- 樹上啟發式合併
- 線段樹合併 筆記筆記
- 精讀《外掛化思維》
- 《思維力量》閱讀筆記筆記
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- 二叉樹高頻題(下)二叉樹
- 樹上啟發式合併-附有例題CF600E
- 利用一維陣列構造二叉樹陣列二叉樹
- 程式碼隨想錄演算法訓練營第第20天 | 654.最大二叉樹 、617.合併二叉樹 、700.二叉搜尋樹中的搜尋、98.驗證二叉搜尋樹演算法二叉樹
- 程式碼隨想錄 第20天 20的總結沒看 | 654.最大二叉樹 ● 617.合併二叉樹 ● 700.二叉搜尋樹中的搜尋 ● 98.驗證二叉搜尋樹二叉樹
- LeetCode-099-恢復二叉搜尋樹LeetCode
- 思維導圖整理Java併發基礎Java
- 程式碼隨想錄演算法訓練營第十七天| 654.最大二叉樹 , 617.合併二叉樹 , 700.二叉搜尋樹中的搜尋 , 98.驗證二叉搜尋樹演算法二叉樹
- 面試題7:重建二叉樹面試題二叉樹
- 二叉樹的最小深度問題二叉樹
- 部分二叉樹題目彙總二叉樹
- 樹上啟發式合併總結
- 資料結構--線段樹合併資料結構
- LeetCode題解(Offer26):判斷二叉樹A是否為二叉樹B的子樹(Python)LeetCode二叉樹Python
- 程式碼隨想錄演算法訓練營第十七天|leetcode654. 最大二叉樹、leetcode617.合併二叉樹、leetcode700.二叉搜尋樹中的搜尋、leetcode98.驗證二叉搜尋樹演算法LeetCode二叉樹
- 論文閱讀2-思維鏈