牛客演算法周練 小H和遊戲(樹上dfs 陣列優化)

2021-10-05 03:03:20 字數 1080 閱讀 5298

題目鏈結

1.題目大意:給出一棵樹,現在如果對乙個節點轟炸一次,那麼和它距離不超過2的節點也會被波及。現在有q(q<=7e5)次轟炸,問每次被轟炸的後此次轟炸的節點目前為止被轟炸多少次

2.很明顯想到暴力dfs,但是如果只有樹的深度只有2層而且所有子節點均連線在根節點,轟炸q次根節點,時間複雜度達到了o(n2)。必須想其他方法,不難發現對於樹上的某個點,我們只需要考慮它的兒子,孫子,父親,兄弟,爺爺這五個相關節點,對樹dfs後,首先肯定能求出所有節點的父節點,設ans[i][j](j=0,1,2),其中0代表該節點本身的影響,1代表它對兒子的影響,2代表它對孫子的影響。因為每個節點的父節點確定,那麼我們每次轟炸乙個節點後,更新它對兒子和孫子的影響,更新它對父親以及父親的兄弟的影響,更新它對爺爺的影響,那麼:

總影響=本身的影響+其父節點對兒子的影響+其祖父節點對孫子的影響

3.為什麼不考慮兒子和孫子對它的影響?因為兒子和孫子對它的影響已經計算在它本身影響中。為什麼增加轟炸後它本身的影響?因為我們一旦增加了父親對兒子的影響,它本身也作為父親的兒子被更新

#include 

#include

using namespace std;

typedef long

long ll;

const

int maxn=

8e5+10;

vector<

int>

g[maxn]

;int ans[maxn][3

];int fa[maxn]

;void

dfs(

int u,

int v)

}int

main()

dfs(0,

1);while

(q--

)return0;

}

牛客演算法周周練2 小H和遊戲(樹 思維)

小h正在玩乙個戰略類遊戲,她可以操縱己方的飛機對敵國的n座城市 編號為1 n 進行轟炸 敵國的城市形成了一棵樹,小h會依次進行q次轟炸,每次會選擇乙個城市a進行轟炸,和這座城市距離不超過2的城市都會受損 這裡距離的定義是兩點最短路徑上的邊數 轟炸結束後,小h還想知道當前城市a受損的次數 作為遊戲的開...

牛客演算法周周練2

a 題意 求乙個數的順序和逆序之和。題解 其實就是個閹割版的高精度加法嘛。其實逆序數忽略前導零這個條件是沒有用的,因為順序數不可能有前導零,自然結果也不會有,然後注意下首位進製不取餘。include using namespace std int a 10 b 10 intmain for k j ...

牛客演算法周周練2

題目鏈結 include define sc x scanf lld x define pf printf define rep i,s,e for int i s i e i define dep i,e,s for int i e i s i using namespace std typede...