Codeforces 587C 樹上倍增

2021-08-06 02:45:22 字數 1185 閱讀 7677

題意:

求樹上兩點路徑中的前 a(<=10) 小的點權值。

思路:

類似lca倍增演算法來儲存 i -> 2^j 路上的 前(<=10)小個 的點權值。

然後要寫乙個權值合併》

具體求 u->v 的話,就是先分別計算 和 (減1是lca會重疊), 然後再合併,輸出答案。

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

#define mem(a,b) memset(a, b, sizeof(a))

#define lmid left, mid

#define rmid mid+1,right

#define lson num<<1, left, mid

#define rson num<<1|1, mid + 1, right

const

int inf = 0x3f3f3f3f;

struct asd

void ins(int val)

}w[17][100010];

struct edgeedge[200010];

int head[100010],tol;

int n, m, q, p[17][100010], dep[100010];

void init()

void add(int u,int v), head[u] = tol++;

edge[tol] = (edge), head[v] = tol++;

}asd merge(asd x, asd y)

void dfs(int u, int fa)

for(int i=head[u];~i;i=edge[i].nex)

}int lca(int u, int v)

asd getans(int u, int dp)

int main()

for(int i=1;i<=m;i++)

dfs(1, 0);

while(q--)

return

0;}

codeforces 739C 線段樹的高階應用

題意,給你乙個序列,有q次操作,每次對乙個區間進行加值,同時要輸出 最長的上公升序列 下降序列 先上公升再下降序列 很明顯能想到的是利用線段樹維護,有很明顯的能想到要維護線段樹的每個區間的左邊界和右邊界的值,並且每個點都有維護四種變化的值,然後就懵逼了。這時候應該想到的是維護每個區間的左右邊界的四種...

CodeForces 896C 珂朵莉樹

傳送門 用set搞的比較神奇的樹吧,玄學時間複雜度,簡潔好寫,無聊學了用來水題再好不過了 include include include include include include include include include include include include define x ...

CodeForces1328E dfs,樹的深度

給出乙個有n個頂點的有根樹,頂點的編號從1到n。樹的根節點編號恒為1。一棵數是具有n 1條邊的聯通圖。給出 m 個詢問。第i個詢問由 k i 個不同的節點 v i 1 v i 2 v i k i 組成.你的任務是判斷是否存在一條從根節點到u的路徑,使得給出的k i個節點要麼在這條路徑上,要麼與該路徑...