題目看這裡
(為什麼xheditor不能支援字型了,不管了,那就用markdown吧)
乙個非常有意思的題目,首先考慮離線做法,把所有的詢問按照l排序,所有的邊倒序插入整個樹中
我們需要維護兩個東西:
1.f[x][i]表示當整顆樹有[x,f[x][i]]這乙個區間內的所有邊時,以x為根的子樹存在乙個深度為i的兒子,滿足條件最小的f[x][i]
2.g[k]表示最小的r,使得[l,r]組成的森林擁有長度為k的直徑
那麼每次加入一條邊(x,y) (x為y的祖先) 我們就需要更新這兩個東西:
g[i+j+1]=min(g[i+j+1],max(f[x][i],f[y][j],y-1)) (注意y-1就是這條邊的編號)
f[x][i]=min(f[x][i],max(y-1,f[y][j-1])
注意到題目的性質,樹高是log n級別的
所以一次操作是o(log n) 的,一共n次加邊,總複雜度o(n lg n)
(再也弄不回原來的code風格了,否則就是沒有高亮的了)
#pragma gcc optimize("o3")
#pragma g++ optimize("o3")
#include
#include
#include
#define m 35
#define n 500010
using
namespace
std;
struct q s[n];
int n,m,f[n][m],g[m<<2],p[n],a;
inline
bool cmp(q a,q b)
inline
void adj(int x,int y)
int main()
}printf("%d\n",a);
}
51nod1803 森林直徑
題目看這裡 為什麼xheditor不能支援字型了,不管了,那就用markdown吧 乙個非常有意思的題目,首先考慮離線做法,把所有的詢問按照l排序,所有的邊倒序插入整個樹中 我們需要維護兩個東西 1.f x i 表示當整顆樹有 x,f x i 這乙個區間內的所有邊時,以x為根的子樹存在乙個深度為i的...
51nod 1803 森林的直徑
題目中生成樹的方式可以生成任何一種形狀的 n 節點樹。這是因為樹也是da g圖.任何形狀的樹,都可以拓撲排序後重新標號。我們計算這種方式生成的樹的期望深度。其實就是隨機生成一棵樹的期望深度。但是平均不代表不能代表特殊。更具體來說,對於 n 個節點的隨機樹。最大深度超過 h時候大概率是多少?是否有絕對...
51Nod1367 完美森林 貪心
有一棵n個點的樹,樹中節點標號依次為0,1,2,n 1,其中n 500000。樹中有n 1條邊,這些邊長度不一定相同。現在要把樹中一些邊刪除,設刪除了k條邊 k 0,即可以不刪除任何邊 由樹的性質可知,該樹將被分割為乙個含有k 1棵樹的森林。稱乙個森林是 完美森林 要求這個森林中的每一棵樹滿足 該樹...