NOIP模擬 相交(樹鏈剖分 樹狀陣列維護)

2021-08-31 00:24:32 字數 919 閱讀 3530

我已經無力爆粗了。。。。。。。md這c++怎麼能在編譯了、執行了以後,最後發現居然是之前的版本?喵喵喵?

考慮兩條路徑相交,那麼其中一條的lca一定在另一條路徑上。所以開兩個樹狀陣列維護之前路徑的資訊和之前路徑的lca的位置。統計一下,然後更新,再做下一條路徑即可。

#includeusing namespace std;

const int maxn=1e6+10;

const int maxm=2e6+10;

int n,cnt,q;

long long ans;

int head[maxn],fa[maxn],son[maxn],siz[maxn],top[maxn],depth[maxn];

int nxt[maxm],to[maxm];

int dfn[maxn],ys[maxn],tot;

int read()

int lowbit(int x)

void update(int *t,int x,int v)

int query(int *t,int x)

void add(int x,int y)

void dfs1(int u,int f)

}void dfs2(int u,int tp)

dfs2(son[u],tp);

for(int i=head[u];i!=-1;i=nxt[i])

r[u]=tot;

}int lca(int x,int y)

return depth[x]}int calc(int x,int y,int z)

int main()

dfs1(1,-1);

dfs2(1,1);

while(q--)

cout

}

校內模擬 層流 樹鏈剖分

給出一棵樹,給出n條邊,問這些邊兩兩之間是否滿足兩個條件之一 覆蓋對方或被對方覆蓋 沒有相交。如果都滿足輸出yes,否則輸出no。題解考場上第一眼就覺得是樹剖,畢竟前段時間天天見到這種型別的東西。做法有點差分的意思,在每條邊的兩個頂點異或上某個值,然後查詢這條邊上的異或和,如果合法異或和當然為0。但...

LCA 樹鏈剖分 樹上相交路徑

首先不難發現乙個結論 因此我們可以將lca排序,每一次統計路徑上有多少lca加入即可。統計完以後,把當前路徑的lca也加入。include using namespace std const int n 2e5 int n,m,cnt 0 int l n r n fa n int size n de...

數鏈剖分(樹的統計Count )

具體思路 單點更新,區間查詢,查詢的時候有兩種操作,查詢區間最大值和區間和。注意點 在查詢的時候,我們應該直接將這個點進行查詢,而不是荊這個點在樹上的編號進行查詢,只有在進入線段樹的時候我們才用樹上的編號,update的時候也就直接用樹上的編號就可以了,注意這個題有點權值會有負值的情況。ac 1 i...