樹上的好題

2022-07-13 20:09:13 字數 2091 閱讀 9992

給出乙個n個節點的有根樹(編號為0到n-1,根節點為0)。乙個點的深度定義為這個節點到根的距離+1。

設dep[i]表示點i的深度,lca(i,j)表示i與j的最近公共祖先。

有q次詢問,每次詢問給出l r z,求sigma_dep[lca(i,z)]。

(即,求在[l,r]區間內的每個節點i與z的最近公共祖先的深度之和)

這道題一上來乍眼一看沒什麼思路,其實之後的每步都是套路;

對於lca,我們首先會想到差分,沒錯,就是差分;

咋查分啊?乙個區間的點啊,這複雜度可不是鬧著玩的;

但有沒有注意到,z只有乙個;我們是否可以把整個區間在樹上差分,然後用這乙個點z來查詢;

答案是當然可以:(注意:這裡的差分與普通的樹形差分不一樣)

我們把z到root這條路上的所有點都打上標記(點的權值加1);那麼你會發現,這條路徑上任意一點的深度就是到根節點的點權和;

所以詢問區間[l,r],我們只要詢問每個點到根節點的點權和就可以了;

另外,這個結論存在乙個優美的性質:若將這個區間的所有點到根節點路徑的點權值加1,那麼詢問時可以找z到根節點的權值和;

通過以上的的操作,我們將鬧著玩的複雜度降到了似乎可做的複雜度;

接下來我們接著優化:

這麼多區間的查詢,是否想到了數字dp的經典處理方法?

沒錯,這是乙個字首和優化處理;

我們將詢問離線掉;然後從1到n加入這個點;並將這個點到根節點的路徑上所有點的權值加1;

然後複雜度變成了看起來好好做的樣子;

在思維想不動的時候,就換種解題思路,使用資料結構大力維護每個點到根節點的點權和;

你想到了什麼?樹剖?lct?沒問題!

接下來就是愉快的ac時間了;

#include#include#include#include#include#define ll long long

#define inf 1000000000

#define mod 201314

using namespace std;

inline ll read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m,cnt,place;

int bin[20];

int son[50005],last[50005],fa[50005],belong[50005],pl[50005],deep[50005];

struct edgee[50005];

struct queq[50005];

struct dataa[100005];

struct segt[200005];

inline bool operator<(data a,data b)

inline void pushdown(int k)

void build(int k,int l,int r)

void update(int k,int x,int y)

int mid=(l+r)>>1;

if(y<=mid)update(k<<1,x,y);

else if(x>mid)update(k<<1|1,x,y);

else

t[k].sum=t[k<<1].sum+t[k<<1|1].sum;

}void solve_update(int x,int f)

update(1,pl[f],pl[x]);

}int query(int k,int x,int y)

int solve_query(int x,int f)

sum+=query(1,pl[f],pl[x]);sum%=mod;

return sum;

}int main()

}star[400010];

int n,m;

long long f[3010][3010];

long long size[200010];

void dfs(register int u,register int fa)

}size[u]+=size[v];            }}

int main()

dfs(1,0);

cout<

CTSC模擬題 樹上的路徑

給定一棵 n 個結點的樹,結點用正整數 1 dots n 編號,每條邊有乙個正整數權值。用 d a,b 表示從結點 a 到結點 b 路徑上經過邊的權值和,其中要求 a b 將這 frac 個距離值從大到小排序,輸出前 m 個距離值。第一行包含兩個正整數 n,m 下面 n 1 行,每行三個正整數 a,...

51nod 1287 加農炮 好題啊好題

1287 加農炮 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 乙個長度為m的正整數陣列a,表示從左向右的地形高度。測試一種加農炮,炮彈平行於地面從左向右飛行,高度為h,如果某處地形的高度大於等於炮彈飛行的高度h a i h 炮彈會被擋住並落在...

貪心 好題 Yogurt factory

題目 任務規定,乙個酸奶製造廠,在n個星期內,分別要向外提供y i unit的酸奶。已知這個製造廠第i周製造每unit酸奶的費用為c i 儲存室儲存每1unit酸奶1星期的費用為s。問要完成這個任務的最小費用是多少。來自 思路 等價的思路,在第n天的時候,第n 2天製造的酸奶可以看成第n 1天製造的...