坑了四天的虛樹,終於過了,也對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...