給出乙個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天製造的...