天天愛跑步 桶(就是陣列) 權值線段樹(沒打)

2022-03-26 22:52:07 字數 888 閱讀 4597

提取:等式轉換,桶

,倍增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的連續正整數。...