NC14393 點權和(思維)

2022-05-28 16:27:09 字數 964 閱讀 5752

這種題肯定不會是暴力列舉,多半考慮是貢獻

首先我們要想清楚的是,我每次操作,會對哪些節點產生影響,答案又是從哪些節點更新而來

很顯然我們會從兒子,自身,父親這三個角度去思考問題。

所以我們會設計狀態 now表示自身被操作的次數,a,表示被兒子影響的次數,b表示的是被孫子操作的次數,in表示的是兒子個數。

為什麼這裡會出現孫子呢,因為孫子+1,兒子+1,那麼當答案的時候,兒子的值變化了,所以答案也變化了。

為什麼不用專門設計父親呢?因為所有的父親都是別人的兒子,所以這樣的狀態足以,不然就更加複雜了。

假如我們對當前點進行更新,那麼我們可以更新:

當前點的權值,別的點的兒子影響,孫子影響。

具體解釋看**,很多不同的答案都是對的,只要能表達清楚就行

#include#include

#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;

}

view code

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節點的權值 那麼,對於每次的...