題意:
求樹上兩點路徑中的前 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個節點要麼在這條路徑上,要麼與該路徑...