試題編號:
201709-5
試題名稱:
除法時間限制:
10.0s
記憶體限制:
256.0mb
問題描述:
問題描述
小蔥喜歡除法,所以他給了你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 31 2 3 4 5
2 1 5
1 1 3 2
2 1 5
樣例輸出
1514
評測用例規模與約定
對於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。
n, m = list(map(int, input().split()))
a = list(map(int, input().split()))
a.insert(0,0)
tree = [0] * (n+1) # 樹形陣列,注意陣列要從1開始
def lowbit(x): # 計算2^k的值(其中k為x的二進位制中從最低到高位連續0的長度)
return (-x) & x
def update(x, y, n): # 單點更新
'''x為更新的位置,y為更新後的值,n為陣列個數
tree[i] = a[i+1-2^k]+a[i+2-2^k]+...+a[i]
'''i = x
while i < n:
tree[i] += y
i += lowbit(i)
def getsum(i): # 單點更新的逆操作
ans = 0
while i > 0:
ans += tree[i]
i -= lowbit(i)
return ans
# 初始化樹形陣列
for i in range(1, n+1):
update(i, a[i], n+1)
result =
for i in range(m):
temp = list(map(int, input().split()))
op, l, r = temp[0], temp[1], temp[2]
if op == 2:
ans = getsum(r) - getsum(l-1) # 求l到r的和
elif op == 1:
v = temp[3]
if v == 1:
continue
for i in range(l, r+1):
if a[i] >= v and a[i] % v == 0:
update(i, -(a[i] - a[i]//v), n+1) # 注意這裡的y為:tree[i]=tree[i]-a[i]+a[i]/v
a[i] = a[i] // v
for i in result:
print(i)
CCF2023年12月第3題 Crontab
這一題要求我們對給定的配置資訊,在特定的時間段輸出需要執行的任務。在unix中每分鐘檢查一次,最簡單的思路就是用迴圈模擬時間的推移,每分鐘匹配一次規則。這種情況在真正的系統裡是很高效的,因為時間是真實流動的。但如果是模擬執行則有些浪費時間。如果在考試過程中想不到其它方法這種暴力方法至少可以通過70 ...
CCF 2023年12月第5題 商路
這一題題目很長,但理解起來並不困難。有一點很重要,那就是題目輸入的順序是城市編號的順序,而城市編號的順序又直接決定了城市之間的上下級關係。雖然編號小的不一定是大編號的下級,但下級城市的編號一定比上級城市的編號小,如何利用這一點非常重要。假如城市a的下級城市是b,c,d 那如果b,c,d 本身的商路價...
CCF 2023年3月第5題 引水入城(80分)
這一題是很明確的最大流問題 但是無論是用dfs 還是 bfs 都肯定會超時。因為規模太大了。如果想練手網路流可以試試提交乙個殘量網路的 應該只能得50分左右。dfs,bfs 有缺陷得地方在於沒有認識到這一題圖得結構是非常規整得。這一題得方案還是使用動態規劃來做。將最大流問題轉換為最小割問題 接下來只...