Codeforces 739B 樹上倍增 差分

2021-08-05 23:12:09 字數 1351 閱讀 4885

思路:

差分其實是個自己隨便創造的東西啊~

差分(這裡的小差分):

比如你要算一棵樹上 u->v 路徑上的次數, v是 u 子樹上的乙個點,

算一棵樹上 u->v 路徑上的次數 在這了是算u -> v路徑上除了 v 的 每個節點的次數,

對於每一對u, v (u -> v)的,用c[i]計數,可以c[fa[ u ]]–, c[fa[ v ]]++ (fa[i] 是 i 的前驅節點), 然後跑一下dfs,統計次數,具體處理就是對於每個節點去加上他的所有子節點的次數,然後就會發現就這麼搞好了。。

樹上倍增:

福利:真講的超級棒!!!

處理完倍增以後,就是每次找乙個能「跳」的最遠位置!

對於第一次應用倍增和差分,真是感覺非常...爽啊...

要多刷一波倍增的題了!!!

**參考自:

#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 maxn = 2e5 + 10;

struct edgeedge[maxn<<1];

int n, head[maxn], tol, f[maxn][23];

ll w[maxn], c[maxn], dis[maxn];

void init()

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

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

}void dfs1(int u, int fa)

}void dfs2(int u, int fa)

}int main()

dfs1(1, 0);

dfs2(1, 0);

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

printf("%i64d ", c[i]);

return

0;}

codeforces 739C 線段樹的高階應用

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

Codeforces482B 線段樹構造

題意 有m個限制,每個限制有l,r,q,表示從a l a r 取且後的數一定為q,問是否有滿足的數列。思路 看到大牛說是線段樹,線段樹對於區間操作,印象中乘啊,啊,啊都不錯,但是並沒有就是對於這個位運算就不懂了 這題的題意就是構造,大致思路是 每條限制是對於每個區間處理就是或上q 可以保證相應的二進...

Codeforces482B 線段樹構造

題意 有m個限制,每個限制有l,r,q,表示從a l a r 取且後的數一定為q,問是否有滿足的數列。思路 看到大牛說是線段樹,線段樹對於區間操作,印象中乘啊,啊,啊都不錯,但是並沒有就是對於這個位運算就不懂了 這題的題意就是構造,大致思路是 每條限制是對於每個區間處理就是或上q 可以保證相應的二進...