世界樹 虛樹,坑

2021-08-28 06:39:50 字數 1215 閱讀 4825

坑了四天的虛樹,終於過了,也對treedp印象深刻了些,這裡挖個坑(基環樹dp,該搞搞了

坑點1:兩個點直接要的不僅僅的路徑長度,而是路徑上的所有點,那麼應該是兒子數相減

坑點2:兩個點在st表查詢的時候可能會超邊界,因為mid不一定在鏈上

坑點3:找某個點屬於哪個點歸屬的時候,更新必須加入佇列中,不然其後面的點不一定會改變值。

#includeusing namespace std;

const int maxn=3e5+7;

typedef long long ll;

struct node;

node edge[maxn+maxn];

int cnt,head[maxn],num[maxn],pos,son[maxn],deep[maxn];

void add(int x,int y)

void init()

int ff[maxn][21],fa[maxn];

void dfs(int u,int pre,int w)

}int p[maxn],tp[maxn],fp[maxn];

void dfs2(int u,int sd)

}int lca(int u,int v)

if(deep[u]>deep[v])swap(u,v);

return u;

}int a[maxn],b[maxn],s[maxn],top;

bool vis1[maxn],vis2[maxn];

vectorv[maxn];

vectorvv;

int size[maxn];

struct ttt;

ttt g1[maxn];

int lenn(int x,int y)

int cmp1(int x,int y)

if(p[lca]p[s[top]])s[++top]=lca;

s[++top]=x;

}bool in1[maxn];//判斷這個點是否已經在佇列中了

void dp()

dp();

dfs3(root,-1);

for(j=1;j<=k;j++)

printf("%d ",size[b[j]]);

printf("\n");

for(j=0;jvv.clear();

}return 0;

}

bzoj 世界樹 虛樹 樹形DP lca

include include include include include define inf 0x3f3f3f3f define rep0 i,n for int i 0 i n i define rep1 i,n for int i 1 i n i define rep 0 i,n for...

P3233 HNOI2014 世界樹(虛樹)

看到 mi 300000自然聯想到虛樹,簡單思考一下似乎可行,但剩下的部分貌似就比較麻煩。首先對重新構建的虛樹,考慮每個點應該被誰管。因為乙個點既可以被它子樹中的點管,也可以被子樹以外的點管,所以我們做兩次dfs。第一次先遍歷子節點,再更新,記錄的是乙個點子樹中最近的管他的點是誰。第二次先用從父節點...

statement 基環樹 虛樹 倍增

這個題寫的真爽翻了。題目大意就是給你乙個樹和基環樹森林 內向 邊有權,每次詢問給你兩個點集,問所有黑點到白點的路徑中,邊權最大值最小是多少。題解 首先考慮樹,直接建出虛樹來跑一遍dfs即可。然後每個環會選出一些點來,那些點先計算出乙個貢獻,你只要把環倍長然後那些點排個序,在上面做倍增即可。inclu...