簡單來說就是使用線段樹來儲存操作步驟,因為如果直接計算的話long long會溢位,所以建立乙個【1,q】的線段樹,使用線段樹的葉子節點來表示權值,非葉子節點表示操作過程
開始的時候線段樹的葉子節點初始化為1,而非葉子節點c[k] = c[k << 1] * c[k << 1 | 1] % mod;也為1。
當開始進行操作的時候,如果是
操作1,m:就把對應序號(第幾次操作)的線段樹的葉子節點更新為m,之後遞迴更新父節點
操作2,a:就把對應m【a】的線段樹的葉子節點更新為1,之後遞迴更新父節點
也可以這麼理解:線段樹是按照時間順序建立的,這樣就可以在執行除法之前將數字改為1,乘1 相當於後面的除
#include#includeusing
namespace
std;
typedef
long
long
ll;#define max 100001ll c[max
<<2], m[100001
];int
t, q, mod,a,b;
void build(int l, int r,int
k)
else
}void update(int index,ll v,int l, int r, int
k)
else
}int
main()
}}
線段樹 單點修改 區間查詢 洛谷P4588
想了半天 這個和線段樹什麼關係!最後發現我就是豬豬 害就是個板子題 把每乙個葉子節點的值賦值為1 如果第m個是1 n 就把m這個點的值變為n 如果是2 n 就把n點的值變為1 include include include include include include include includ...
線段樹 P4588 TJOI2018 數學計算
這道題目,看起來只給了乙個數,與線段樹關係不大,但是將每次的操作存起來,就相當於是點更新,段查詢 乘積 這樣就可以轉化為線段樹的問題了。對於操作1,我們可以把對應的位置修改為相應值 操作2,把當前位置,和pos的位置改為1 並維護線段樹即可 includeusing namespace std co...
洛谷4588 數學計算(線段樹)
思路妙妙妙啊。現在我們有q個葉子節點,權值為1的線段樹,對於每次1操作,相當於將第i個葉子節點的值改為val,每次2操作就是將之前某葉節點權值改為1,最後輸出根節點的權值即可。其實還算比較氵的題了。includeusing namespace std typedef long long ll con...