題目鏈結
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...