Skip to content

Commit ba98609

Browse files
committed
abc341
1 parent 3826080 commit ba98609

File tree

8 files changed

+392
-0
lines changed

8 files changed

+392
-0
lines changed
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
from typing import Callable, List
2+
3+
4+
class SegTree:
5+
def __init__(self, n: int, e: int, op: Callable) -> None:
6+
"""
7+
Args:
8+
n (int): 要素数
9+
e (int): 単位元
10+
op (Callable): 演算
11+
"""
12+
self.n = n
13+
self.e = e
14+
self.lv = (self.n - 1).bit_length()
15+
self.tree_size = 2**self.lv
16+
self.tree_value = [self.e] * (2 * self.tree_size)
17+
self.tree_lazy = [None] * (2 * self.tree_size)
18+
self._op = op
19+
20+
def gindex(self, l, r):
21+
"""
22+
lazy load
23+
Args:
24+
l (_type_): _description_
25+
r (_type_): _description_
26+
Yields:
27+
_type_: _description_
28+
"""
29+
L = (l + self.tree_size) >> 1
30+
R = (r + self.tree_size) >> 1
31+
lc = 0 if l & 1 else (L & -L).bit_length()
32+
rc = 0 if r & 1 else (R & -R).bit_length()
33+
for i in range((self.n - 1).bit_length()):
34+
if rc <= i:
35+
yield R
36+
if L < R and lc <= i:
37+
yield L
38+
L >>= 1
39+
R >>= 1
40+
41+
def propagates(self, *ids):
42+
"""lazy load
43+
"""
44+
for i in reversed(ids):
45+
v = self.tree_lazy[i - 1]
46+
if v is None:
47+
continue
48+
self.tree_lazy[2 * i - 1] = self.tree_value[2 * i - 1] = self.tree_lazy[
49+
2 * i
50+
] = self.tree_value[2 * i] = v
51+
self.tree_lazy[i - 1] = None
52+
53+
def build(self, init_array: List[int]) -> None:
54+
"""
55+
Use if you have initial values array
56+
Args:
57+
init_array (List[int]): array
58+
"""
59+
for i in range(len(init_array)):
60+
self.tree_value[i + self.tree_size - 1] = init_array[i]
61+
# build
62+
for i in range(self.tree_size - 2, -1, -1):
63+
self.tree_value[i] = self._op(
64+
self.tree_value[2 * i + 1], self.tree_value[2 * i + 2]
65+
)
66+
67+
def update(self, x: int, value: int) -> None:
68+
"""
69+
Args:
70+
x (int): position x
71+
value (int): value
72+
"""
73+
# 更新
74+
self.update_range(l=x, r=x, value=value)
75+
76+
def update_range(self, l: int, r: int, value: int) -> None:
77+
"""
78+
[l, r] range update
79+
Args:
80+
l (int): left
81+
r (int): right
82+
value (int): value
83+
"""
84+
r += 1
85+
(*ids,) = self.gindex(l, r)
86+
self.propagates(*ids)
87+
L = self.tree_size + l
88+
R = self.tree_size + r
89+
while L < R:
90+
if R & 1:
91+
R -= 1
92+
self.tree_value[R - 1] = value
93+
self.tree_lazy[R - 1] = value
94+
if L & 1:
95+
self.tree_value[L - 1] = value
96+
self.tree_lazy[L - 1] = value
97+
L += 1
98+
L >>= 1
99+
R >>= 1
100+
for i in ids:
101+
self.tree_value[i - 1] = self._op(
102+
self.tree_value[2 * i - 1], self.tree_value[2 * i]
103+
)
104+
105+
def query(self, l: int, r: int) -> int:
106+
"""
107+
[l, r] range query
108+
Args:
109+
l (int): left
110+
r (int): right
111+
112+
Returns:
113+
int: _description_
114+
"""
115+
self.propagates(*self.gindex(l, r))
116+
L = self.tree_size + l
117+
R = self.tree_size + r
118+
119+
s = self.e
120+
while L < R:
121+
if R & 1:
122+
R -= 1
123+
s = self._op(s, self.tree_value[R - 1])
124+
if L & 1:
125+
s = self._op(s, self.tree_value[L - 1])
126+
L += 1
127+
L >>= 1
128+
R >>= 1
129+
return s
130+
131+
132+
if __name__ == "__main__":
133+
n, q = map(int, input().split())
134+
a = list(map(int, input().split()))
135+
lr = []
136+
for _ in range(q):
137+
l, r = map(int, input().split())
138+
lr.append((l, r))
139+
tree = SegTree(n, 10**10, lambda x, y: min(x, y))
140+
tree.init(a)
141+
ans = []
142+
for l, r in lr:
143+
ans.append(tree.query(l, r))
144+
print(*ans, sep="\n")

atcoder/abc/abc301-400/abc341/a.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
n = int(input())
2+
ans = []
3+
4+
for i in range(n):
5+
ans.append(1)
6+
ans.append(0)
7+
ans.append(1)
8+
9+
print(*ans, sep="")

atcoder/abc/abc301-400/abc341/b.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
n = int(input())
2+
a = list(map(int, input().split()))
3+
st = []
4+
for i in range(n - 1):
5+
s, t = map(int, input().split())
6+
st.append((s, t))
7+
8+
for i in range(n - 1):
9+
cnt = a[i] // st[i][0]
10+
if cnt > 0:
11+
a[i] -= st[i][0] * (cnt)
12+
a[i + 1] += st[i][1] * (cnt)
13+
# print(a)
14+
print(a[-1])

atcoder/abc/abc301-400/abc341/c.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
h, w, n = map(int, input().split())
2+
t = list(input())
3+
4+
s = []
5+
for i in range(h):
6+
s.append(list(input()))
7+
8+
# 全探索
9+
count = 0
10+
for i in range(1, h - 1):
11+
for j in range(1, w - 1):
12+
pos = [i, j]
13+
flag = 1
14+
for ti in t:
15+
if s[pos[0]][pos[1]] == "#":
16+
flag = 0
17+
break
18+
if ti == "U":
19+
pos[0] -= 1
20+
elif ti == "D":
21+
pos[0] += 1
22+
elif ti == "L":
23+
pos[1] -= 1
24+
elif ti == "R":
25+
pos[1] += 1
26+
if s[pos[0]][pos[1]] == "#":
27+
flag = 0
28+
break
29+
count += flag
30+
print(count)

atcoder/abc/abc301-400/abc341/d.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import math
2+
3+
n, m, k = map(int, input().split())
4+
nm = math.lcm(n, m)
5+
6+
7+
# x以下の数のnの倍数 + mの倍数 - lcm nmの倍数の数
8+
def calc(x):
9+
v1 = x // n
10+
v2 = x // m
11+
v3 = x // nm
12+
return v1 + v2 - 2 * v3
13+
14+
15+
l = 0
16+
r = 10 ** 19
17+
18+
while r - l > 1:
19+
mid = (l + r) // 2
20+
if calc(mid) < k:
21+
l = mid
22+
else:
23+
r = mid
24+
25+
print(r)

atcoder/abc/abc301-400/abc341/e.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
from math import gcd
2+
from typing import List
3+
4+
n, q = map(int, input().split())
5+
s = list(map(int, list(input())))
6+
7+
queries = []
8+
9+
class SegTree:
10+
def __init__(self, n: int, mode: str = "min") -> None:
11+
self.mode = mode
12+
unit_elements = {
13+
"min": 10**13,
14+
"max": -(10**13),
15+
"sum": 0,
16+
"mul": 1,
17+
"gcd": 0,
18+
}
19+
self.e = unit_elements[self.mode] # 単位元
20+
self.tree_size = 2 ** (n - 1).bit_length() # n以上の最小の2のべき乗数
21+
self.tree_value = [self.e] * 2 * self.tree_size
22+
23+
def __str__(self) -> str:
24+
if self.tree_size > 2**4:
25+
return "Segtree size too big"
26+
out = ""
27+
i = 0
28+
j = 0
29+
count = 1
30+
while i < self.tree_size - 1:
31+
if self.tree_value[i] == self.e:
32+
s = "-"
33+
else:
34+
s = str(self.tree_value[i])
35+
s = s.center((self.tree_size * 2) // count, " ")
36+
out += s
37+
i += 1
38+
j += 1
39+
if j == count:
40+
count *= 2
41+
j = 0
42+
out += "\n"
43+
return out
44+
45+
def _op(self, a: int, b: int) -> int:
46+
if self.mode == "min":
47+
return min(a, b)
48+
elif self.mode == "max":
49+
return max(a, b)
50+
elif self.mode == "sum":
51+
return a + b
52+
elif self.mode == "mul":
53+
return a * b
54+
elif self.mode == "gcd":
55+
return gcd(a, b)
56+
57+
raise "no method defined"
58+
59+
def init(self, init_val: List[int]) -> None:
60+
# 初期値が指定されている場合
61+
# logNの処理をまとめて実行するので、随時追加するのに比べてO(logN)程度高速
62+
# updateを使った初期化: O(NlogN)
63+
# initを使った初期化: O(N + logN)
64+
# set_val
65+
for i in range(len(init_val)):
66+
self.tree_value[i + self.tree_size - 1] = init_val[i]
67+
# built
68+
for i in range(self.tree_size - 2, -1, -1):
69+
self.tree_value[i] = self._op(
70+
self.tree_value[2 * i + 1], self.tree_value[2 * i + 2]
71+
)
72+
73+
def update(self, pos: int, value: int) -> None:
74+
pos += self.tree_size - 1
75+
self.tree_value[pos] = value
76+
while pos:
77+
pos = (pos - 1) // 2
78+
self.tree_value[pos] = self._op(
79+
self.tree_value[pos * 2 + 1], self.tree_value[pos * 2 + 2]
80+
)
81+
82+
def query(self, l: int, r: int) -> int:
83+
r += 1
84+
if r <= l:
85+
return self.e
86+
l += self.tree_size - 1
87+
r += self.tree_size - 2
88+
res = self.e
89+
while r - l > 1:
90+
if l & 1 == 0:
91+
res = self._op(res, self.tree_value[l])
92+
if r & 1 == 1:
93+
res = self._op(res, self.tree_value[r])
94+
r -= 1
95+
l = l // 2
96+
r = (r - 1) // 2
97+
if l == r:
98+
res = self._op(res, self.tree_value[l])
99+
else:
100+
res = self._op(self._op(res, self.tree_value[l]), self.tree_value[r])
101+
return res
102+
103+
tree = SegTree(n - 1, "sum")
104+
105+
for i in range(len(s) - 1):
106+
if s[i] != s[i + 1]:
107+
tree.update(i, 1)
108+
queries = []
109+
for _ in range(q):
110+
query_type, l, r = map(int, input().split())
111+
queries.append((query_type, l - 1, r - 1))
112+
113+
ans = []
114+
for query_type, l, r in queries:
115+
if query_type == 1:
116+
if l > 0:
117+
vl = tree.query(l - 1, l - 1)
118+
tree.update(l - 1, 1 - vl)
119+
if r < n - 1:
120+
vr = tree.query(r, r)
121+
tree.update(r, 1 - vr)
122+
else:
123+
v = tree.query(l, r - 1)
124+
if r - l == v:
125+
ans.append("Yes")
126+
else:
127+
ans.append("No")
128+
# print(*out, sep=" ")
129+
130+
print(*ans, sep="\n")

0 commit comments

Comments
 (0)