結果
| 問題 |
No.3265 地元に帰れば天才扱い!
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-09-06 14:48:53 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,104 ms / 2,500 ms |
| コード長 | 3,540 bytes |
| コンパイル時間 | 390 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 135,344 KB |
| 最終ジャッジ日時 | 2025-09-06 14:49:42 |
| 合計ジャッジ時間 | 44,770 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 |
ソースコード
class FenwickTree:
def __init__(self, data):
"""data: list or len"""
if isinstance(data, int):
data = [0 for _ in range(data)]
self._n = len(data)
self._data = data
self._tree = [0] * self._n
self._all_sum = self._build(data)
def _build(self, data):
acc = [0] * (self._n+1)
for i in range(1, self._n+1):
acc[i] = acc[i-1] + data[i-1]
self._tree[i-1] = acc[i] - acc[i-(-i&i)]
return acc[-1]
def __len__(self):
return self._n
def get(self, i):
return self._data[i]
def __getitem__(self, i):
return self.get(i)
def add(self, i ,x):
"""i番目にxを足す"""
self._add(i, x)
def set(self, i, x):
"""加えるではなく、更新"""
self._add(i, x-self._data[i])
def __setitem__(self, i, x):
self.set(i, x)
def sum(self, l, r):
"""[l,r)の和"""
return self._sum(l, r)
def all_sum(self):
return self._all_sum
def bisect_left(self, x):
"""累積和がx以上になるindex"""
return self._bisect_left(x)
def bisect_right(self, x):
"""累積和がxを超えるindex"""
return self._bisect_right(x)
def __str__(self):
return f'FenwickTree {self._data}'
def _add(self, i, x):
self._data[i] += x
self._all_sum += x
i += 1
while i <= self._n:
self._tree[i-1] += x
i += -i & i
def _prefix_sum(self, i):
sum = 0
while i > 0:
sum += self._tree[i-1]
i -= -i & i
return sum
def _sum(self, l, r):
return self._prefix_sum(r) - self._prefix_sum(l)
def _bisect_left(self, x):
i = 1 << self._n.bit_length()-1
val = 0
while not i & 1:
if i-1 < self._n and val + self._tree[i-1] < x:
val += self._tree[i-1]
i += (-i & i) >> 1
else:
i -= (-i & i) >> 1
return i-1 + (val + self._tree[i-1] < x)
def _bisect_right(self, x):
i = 1 << self._n.bit_length()-1
val = 0
while not i & 1:
if i-1 < self._n and val + self._tree[i-1] <= x:
val += self._tree[i-1]
i += (-i & i) >> 1
else:
i -= (-i & i) >> 1
return i-1 + (val + self._tree[i-1] <= x)
#aiを参照している岩井の数 * ai 加算
#l~rの和を加算
#u~vの和を減算
#->BIT
n,m = map(int,input().split())
ft = FenwickTree(m)
ft2 = FenwickTree(m+1) #何人から参照されてるか
home = []
l = []
r = []
a = []
for i in range(n):
aa,ll,rr = map(int,input().split())
home.append(i)
l.append(ll-1)
r.append(rr-1)
a.append(aa)
ft.add(i, aa)
ft2.add(ll-1, 1)
ft2.add(rr, -1)
ans = 0
for i in range(n):
ans += a[i] * (r[i]-l[i]+1) - ft.sum(l[i], r[i]+1)
for _ in range(int(input())):
x,y,u,v = map(lambda x:int(x)-1,input().split())
ans -= a[x] * (r[x]-l[x]+1)
ans += ft.sum(l[x], r[x]+1) #自分が参照してる分はここで
ft2.add(l[x], -1)
ft2.add(r[x]+1, 1)
ans += a[x] * ft2.sum(0, home[x]+1)
ft.add(home[x], -a[x])
ft.add(y, a[x])
home[x] = y
ans += a[x] * (v-u+1)
ans -= ft.sum(u, v+1)
ans -= a[x] * ft2.sum(0, y+1)
ft2.add(u, 1)
ft2.add(v+1, -1)
l[x] = u
r[x] = v
print(ans)