有一棵n個點的樹,樹中節點標號依次為0,1,2,...n-1,其中n<=500000。樹中有n-1條邊,這些邊長度不一定相同。現在要把樹中一些邊刪除,設刪除了k條邊(k>=0,即可以不刪除任何邊),由樹的性質可知,該樹將被分割為乙個含有k+1棵樹的森林。稱乙個森林是"完美森林",要求這個森林中的每一棵樹滿足:該樹的直徑長度不超過maxdist這麼長。其中樹的直徑指樹中任意兩點的最大距離。那麼,對於給出的n個點的樹,能劃分出的完美森林最少包含多少棵樹?
$n\leq 500000$
直接貪心從下往上取。對於當前節點,如果選擇一些子樹之後,超出限制了,就斷掉最深的子樹,直到最深深度不超過限制就好了。
#include using namespace std;int read()
const int n=500005;
struct graph
void add(int a,int b,int c)
}g;int n,m,ans=1;
int dis[n];
vector a[n];
void solve(int x,int pre)
if (!v.empty())
sort(v.begin(),v.end());
while (!v.empty()&&v.back()>m)
v.pop_back(),ans++;
while (((int)v.size())>=2&&v.back()+v[(int)v.size()-2]>m)
v.pop_back(),ans++;
dis[x]=v.back();
v.clear();
}int main()
solve(1,0);
printf("%d",ans);
return 0;
}
51Nod 1182 完美字串 (貪心)
約翰認為字串的完美度等於它裡面所有字母的完美度之和。每個字母的完美度可以由你來分配,不同字母的完美度不同,分別對應乙個1 26之間的整數。約翰不在乎字母大小寫。也就是說字母f和f 的完美度相同。給定乙個字串,輸出它的最大可能的完美度。例如 dad,你可以將26分配給d,25分配給a,這樣整個字串完美...
51nod1803 森林直徑
題目看這裡 為什麼xheditor不能支援字型了,不管了,那就用markdown吧 乙個非常有意思的題目,首先考慮離線做法,把所有的詢問按照l排序,所有的邊倒序插入整個樹中 我們需要維護兩個東西 1.f x i 表示當整顆樹有 x,f x i 這乙個區間內的所有邊時,以x為根的子樹存在乙個深度為i的...
51nod1803 森林直徑
題目看這裡 為什麼xheditor不能支援字型了,不管了,那就用markdown吧 乙個非常有意思的題目,首先考慮離線做法,把所有的詢問按照l排序,所有的邊倒序插入整個樹中 我們需要維護兩個東西 1.f x i 表示當整顆樹有 x,f x i 這乙個區間內的所有邊時,以x為根的子樹存在乙個深度為i的...