給定一棵
n 個點的樹,求每個點至少需要刪除多少條邊,然後重新加上同等數量的邊才能成為樹的重心。
data constraint n≤
106首先,刪掉邊後重新連邊必然是連在根上。 設f
i 表示保證
i 的子樹大小小於等於n/
2的最少刪邊數,gi
表示這樣刪完後剩餘的樹的大小。轉移顯然可以貪心一下,每次優先保留剩餘大小小的子樹。
然後在o(n
) 的換根,求出以每個點為根的答案。
時間複雜度:o(
n)
#include
#include
#include
#include
#include
using
namespace
std ;
#define n 1000000 + 10
struct note
} f[n] , fa[n] ;
int node[2*n] , next[2*n] , head[n] , tot ;
int qs[n] ;
int n ;
int ans[n] ;
int read()
return ret ;
}void link( int u , int v )
void dfs( int x , int f )
for (int p = head[x] ; p ; p = next[p] )
ans[x] = f[x].ct ;
sort( qs + 1 , qs + cnt + 1 ) ;
for (int i = 1 ; i <= cnt ; i ++ )
}void move( int x , int f )
sort( qs + 1 , qs + cnt + 1 ) ;
int wz = 0 ;
for (int i = 1 ; i <= cnt ; i ++ )
}for (int p = head[x] ; p ; p = next[p] ) else fa[son].sz += f[son].sz , fa[son].ct -- ;}}
for (int p = head[x] ; p ; p = next[p] )
}int main()
dfs( 1 , 0 ) ;
move( 1 , 0 ) ;
for (int i = 1 ; i <= n ; i ++ ) printf( "%d\n" , ans[i] ) ;
return
0 ;}
以上. LOJ 6042 跳蚤王國的宰相
點此看題 哎,本來能做出來的,考試最後一秒拍出錯了 qwq qwqqw q 對拍還是要及時打 首先題目可以輕易的轉化為求斷掉多少條邊再接上可以使他變成重心,證明可以用微調法,因為如果不是重心的話往某個子樹大小 n 2 n 2 n 2 移動一點的話距離和顯然會變小,所以一定是重心。考試時候想到這裡我還...
線段樹 跳蚤
nirobc 姐姐奴役了一群跳蚤,並隨時把它們丟到一台圖靈機的紙帶上。一開始,紙帶上沒有跳蚤,每乙個時刻,nirobc 姐姐可能做以下三個操作之一 在位置x 放置乙隻每次向右 座標增大方向 跳t 格的跳蚤。命令所有跳蚤向右跳躍一次,跳躍的距離為各自的t。給定區間 l,r 求該區間內跳蚤的個數。第一行...
跳蚤(線段樹)
nirobc 姐姐奴役了一群跳蚤,並隨時把它們丟到一台圖靈機的紙帶上。一開始,紙帶上沒有跳蚤,每乙個時刻,nirobc 姐姐可能做以下三個操作之一 在位置x 放置乙隻每次向右 座標增大方向 跳t 格的跳蚤。命令所有跳蚤向右跳躍一次,跳躍的距離為各自的t。給定區間 l,r 求該區間內跳蚤的個數。第一行...