問題描述
小蔥喜歡除法,所以他給了你n個數a1, a2, ⋯, an,並且希望你執行m次操作,每次操作可能有以下兩種:
給你三個數l, r, v,你需要將al, al+1, ⋯, ar之間所有v的倍數除以v。
給你兩個數l, r,你需要回答al + al+1 + ⋯ + ar的值是多少。
輸入格式
第一行兩個整數n, m,代表數的個數和操作的次數。
接下來一行n個整數,代表n個數一開始的值。
接下來m行,每行代表依次操作。每行開始有乙個整數opt。如果opt=1,那麼接下來有三個數l, r, v,代表這次操作需要將第l個數到第r個數中v的倍數除以v;如果opt = 2,那麼接下來有兩個數l, r,代表你需要回答第l個數到第r個數的和。
輸出格式
對於每一次的第二種操作,輸出一行代表這次操作所詢問的值。
樣例輸入
5 3
1 2 3 4 5
2 1 5
1 1 3 2
2 1 5
樣例輸出
15 14
評測用例規模與約定
對於30%的評測用例,1 ≤ n, m ≤ 1000;
對於另外20%的評測用例,第一種操作中一定有l = r;
對於另外20%的評測用例,第一種操作中一定有l = 1 , r = n;
對於100%的評測用例,1 ≤ n, m ≤ 105,0 ≤ a1, a2, ⋯, an ≤ 106, 1 ≤ v ≤ 106, 1 ≤ l ≤ r ≤ n。
這個題瘋狂卡我細節時間,心態gg。
開始的時候有些傻x,忘了用陣列存值,結果每次都要先查詢,再更新,卡了一波時間。。。
#include
long
long tree[101024];
int n,m,a[101024];
int lowbit(int x)
void update(int i,int val)
}long
long getsum(int i)
return sum;
}int main()
while(m--)
else
++l;}}
}return
0;}
樹狀陣列 單點更新 區間查詢
input 每組測試用例首先一行是2個正整數n和m n 100000,m 10000 其中,n表示士兵的數量,m表示有m個詢問。接下來一行是n個正整數,依次表示n位士兵cf的rating。其中,rating的取值範圍是小於等於5000。最後是m行的詢問,每行包含2個正整數a和b,表示要計算從第a個士...
樹狀陣列區間更新 區間查詢 單點查詢
為了更好地使用複雜度比線段樹更加優化的樹狀陣列,所以必須實現樹狀陣列的區間更新 樹狀陣列時間複雜度為o mlogn 實際用的時候優於線段樹,且寫得少。引入差分陣列,假設初始資料陣列為a,另a 0 0 設要維護的差分陣列為 d i a i a i 1 進一步可知 a i d 1 d 2 d i 即前i...
樹狀陣列的單點更新,區間查詢。
基本的陣列陣列概念,樹狀陣列利用其特殊的位置可以用二進位制達到log級別的更新,如下圖 核心 int sum int i return s void add int i,int x lowbit的作用是求出最低位的那個1,為什麼這樣可以求出來呢,是因為計算機中是採用補碼的方式來儲存數值型資料,所以負...