dtoj 4258 鈴鐺計數問題

2022-07-24 00:21:29 字數 1397 閱讀 5091

聖誕節來了,倉鼠又要來策劃活動了,今年倉鼠會在聖誕樹上掛上鈴鐺!

已知聖誕樹有 $n$ 個節點,並且根節點是固定的。記 $s[i]$ 表示以 $i$ 為根的子樹中,所有節點上鈴鐺數目的總和。但倉鼠覺得詢問 $s[i]$ 太簡單了,他決定給定 $l$ 和 $r$,要你回答 $\sum\limits_^s[i]$ 的值。

但是為了避免有的人一次預處理後一勞永逸,倉鼠在大家答題的過程中還會修改某個節點上燈籠的數量。倉鼠還要去籌備活動,你能幫助他寫乙個程式幫助實時給出標準答案嗎?

分塊好題。

比較容易想到分塊處理,但是這題要把各個部分分開算。

$cnt[x][i]$ 表示在第 $i$ 個塊,有多少個點在 $x$ 到根的鏈上,那麼每次修改 $val[x]$ 就會發生 $cnt[x][i]\times (new-val[x])$ 的權值變化。

對於單個點價值的計算,按照 $dfn$ 序做字首和,單點修改區間查詢,考慮再分一次塊,對於每一次修改,對整個塊有影響的對於這個塊統一加乙個值,否則單點加。那麼一次查詢效率就是 $o(1)$ 的了。

#include#define il inline

#define ll long long

#define _(d) while(d(isdigit(ch=getchar())))

using

namespace

std;

const

int n=1e5+5,m=320

;ll res[m],sum[n],tag[m],g[n];

intgr[n],sz,num[m][n],dfn[n],ed[n],tot;

int n,q,val[n],rt,head[n],ne[n<<1],to[n<<1

],cnt;

il int

read()

il void ins(int x,int

y)il

void dfs(int x,int

fa) ed[x]=tot;res[gr[x]]+=g[x];

}il ll cal(

intx)

il void change(int x,int

v)il ll query(

int l,int

r)

for(int i=l;i<=gr[l]*sz;i++)ans+=cal(i);

for(int i=(gr[r]-1)*sz+1;i<=r;i++)ans+=cal(i);

for(int i=gr[l]+1;ires[i];

return

ans;

}int

main()

dfs(rt,0);

while(q--)

else

}return0;

}

view code

計數問題(二)

計數問題 二 在上一講中,我們一起研究 列舉法 乘法原理 加法原理 在計數問題中的應用。但是,在實際的問題中,這些方法並不是單獨使用的。往往需要同時應用這幾種方法,這就需要我們搞清題意,根據已知條件,分別使用正確的方法,得到準確的結果。一 閱讀思考 例1.求720這個數約數的個數。分析與解 從1開始...

問題 E 計數問題

時間限制 1 sec 記憶體限制 128 mb 提交 30 解決 22 提交狀態 討論版 命題人 admin 題目描述 試計算在區間 1 到 n 的所有整數中,數字 x 0 x 9 共出現了多少次?例如,在 1 到 11 中,即在 1 2 3 4 5 6 7 8 9 10 11 中,數字 1 出現了...

序關係計數問題

序關係計數問題 問題描述 用關係 和 將3 個數a b和c依序排列時有13 種不同的序關係 a b c,a b 設n個數可列出的關係式的個數為g n 下面我們設法總結規律找出g n 的遞推關係 對於乙個關係式 a1 a2 a3.an 其中 表示 或 總存在乙個k,使a1,a2,ak,之間均用 連線,...