提取:等式轉換,桶
,倍增lca
對於(x,y)的一次提問,我們規定lca為(x,y)的lca
d為深度,w為點出現觀察員的時間
那麼對於(x,lca)這段路徑上的點i,此次提問能作出貢獻的等式是
d[x]-d[i]=w[i]
->d[x]=w[i]+d[i]
對於(lca,y)這段路徑上的點i,此次提問能作出貢獻的等式是
d[x]-d[lca]+d[i]-d[lca]=w[i]
->d[x]-2*d[lca]=w[i]-d[i]
那麼我們可以將提答轉化為區間修改了!
在(x,lca)上將「d[x]"這種物品的個數+1
在(lca,y)上將"d[x]-2*d[lca]"這種物品的個數+1
但是好像lca處加重了?
請聽下文。
能否繼續優化?
當然可以!考慮將區間修改轉化為單點修改...
樹上差分!
具體的,(對於(x,lca)過程,(lca,y)同理)
將x處"d[x]"物品的個數+1
將lca處」d[x]"物品的個數-1
對嗎?我們考慮lca處,如果這樣處理,就會使得lca處反而沒修改!(請注意與上文差異)
所以基於lca有且只有一次新增,我們將第一次修改的範圍變為(x,fa[lca]),
而第二次修改範圍(lca,y)不變,這就達到我們的目的了!
而樹上差分可以用權值線段樹(常用,但空間複雜度較大),桶(陣列?)來解決。
本題我的選擇是陣列。
第二次修改時d[x]-2*d[lca]可能會成負數記得平移orz
code
NOIP2016 天天愛跑步(線段樹 桶)
小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步是乙個養成類遊戲,需要 玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 n個結點和n 1 條邊的樹,每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從1到n的連續正整數。現在有個玩家...
P1600 天天愛跑步 線段樹合併 lca
天天愛跑步 有點毒瘤的題目 我們觀察一下性質 在路徑 u,v 上 如果這個路徑 對某個點j 有貢獻j肯定得在路徑 u,v上 也就是說 如果當前遍歷的點在 lca u,v 上方的話 那麼 u,v路徑是肯定沒有貢獻的 因此到達lca時我們要把貢獻去掉 在說怎麼算貢獻 設u為起始點 v為終止點 如果u對於...
洛谷P1600 天天愛跑步(線段樹合併)
小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步 是乙個養成類遊戲,需要玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 nn個結點和 n 1n 1條邊的樹,每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從11到nn的連續正整數。...