本文共 2207 字,大约阅读时间需要 7 分钟。
????????????????????????????????????????????C?????????????????????Fenwick Tree??????? Indexed Tree???????????????
Fenwick Tree ????????
?????
import sysdef main(): # ???? input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) idx += 1 M = int(data[idx]) idx += 1 # Fenwick Tree?? class FenwickTree: def __init__(self, size): self.n = size self.tree = [0] * (self.n + 2) def update(self, idx, delta): while idx <= self.n: self.tree[idx] += delta idx += idx & -idx def query(self, idx): res = 0 while idx > 0: res += self.tree[idx] idx -= idx & -idx return res ft = FenwickTree(N) # ?????? for _ in range(M): opt = int(data[idx]) idx +=1 u = int(data[idx]) idx +=1 v = int(data[idx]) idx +=1 k = int(data[idx]) idx +=1 if opt == 1: a = u b = v c = k ft.update(a, c) if b+1 <= N: ft.update(b+1, -c) else: a = u b = v c = k # ???? low = 1 high = 10**18 # ???????1e18 ans = 0 while low <= high: mid = (low + high) // 2 # ???? [a, b] ? >= mid ??? sum_mid = ft.query(b) - ft.query(a-1) sum_mid -= ft.query(b) - ft.query(a-1) # ??????????????????? # ??????? cnt = ft.query(b) - ft.query(a-1) if cnt >= c: ans = mid high = mid - 1 else: low = mid + 1 print(ans)if __name__ == "__main__": main()
Fenwick Tree ??
update ??????????????????????query ?????????????1?idx??????????
??????????????????O(logN)?????????????
转载地址:http://cvmu.baihongyu.com/