聖誕節來了,倉鼠又要來策劃活動了,今年倉鼠會在聖誕樹上掛上鈴鐺!
已知聖誕樹有 $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 inlineview code#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;
}
計數問題(二)
計數問題 二 在上一講中,我們一起研究 列舉法 乘法原理 加法原理 在計數問題中的應用。但是,在實際的問題中,這些方法並不是單獨使用的。往往需要同時應用這幾種方法,這就需要我們搞清題意,根據已知條件,分別使用正確的方法,得到準確的結果。一 閱讀思考 例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,之間均用 連線,...