這種題肯定不會是暴力列舉,多半考慮是貢獻
首先我們要想清楚的是,我每次操作,會對哪些節點產生影響,答案又是從哪些節點更新而來
很顯然我們會從兒子,自身,父親這三個角度去思考問題。
所以我們會設計狀態 now表示自身被操作的次數,a,表示被兒子影響的次數,b表示的是被孫子操作的次數,in表示的是兒子個數。
為什麼這裡會出現孫子呢,因為孫子+1,兒子+1,那麼當答案的時候,兒子的值變化了,所以答案也變化了。
為什麼不用專門設計父親呢?因為所有的父親都是別人的兒子,所以這樣的狀態足以,不然就更加複雜了。
假如我們對當前點進行更新,那麼我們可以更新:
當前點的權值,別的點的兒子影響,孫子影響。
具體解釋看**,很多不同的答案都是對的,只要能表達清楚就行
#include#includeview code#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int n=1e5+5
;const
int mod=19260817
;ll p[n],a[n],b[n];
ll in
[n];
ll now[n];
intmain()
ll res=0
;
for(i=1;i<=m;i++)
if(p[p[x]])
ans=(ans+(in[x]+1)%mod*now[x]%mod+a[x]*2+b[x])%mod;//
自己運算元的貢獻,以及兒子對兒子和自己的貢獻以及孫子的貢獻
res=(res+ans*i+mod)%mod;
}cout
return0;
}
NC19798 區間權值 字首和
列舉w 根據長度的增加,其實相當於變成某一段區間能多加幾次 而到了最高點後又會下降,加的次數會變少,因此維護這個資料即可 includeusing namespace std typedef long long ll typedef pair pll const int n 3e5 10 const...
2023年ccpc威海(祖先的邊權和點權)
傳輸門 給出了 n個人和 m 條關係,每乙個團體的價值為當前團體的關係數 人數,如果這個團體的關係數小於等於人數那麼就是 0,也就相當於不選擇。可以使用並查集來考慮對於每個節點計算點數和邊數的關係,符合邊數 點數 0的就加上邊數 點數,最後求總和。pragma gcc optimize 1 prag...
nowcode練習賽6(B) 點權和
思路 因為m的大小為1e7,那麼怎麼做到o 1 的維護節點的兒子和父親的資訊 fa x 表示x的父親的編號 用乙個sum x 陣列記錄節點x的所有兒子節點的權值 用乙個cnt x 陣列表示當前 x節點出現的次數 dep x 表示x節點的兒子的個數,即出度 arr x 為x節點的權值 那麼,對於每次的...