from typing import Optional
def solve(n: int, m: int, mat: list[list[str]]) -> tuple[int, int]:
longest_rowi: int = -1
longest_len: int = 0
for rowi in range(n):
manlen: int = sum(1 if x == "#" else 0 for x in mat[rowi])
if manlen > longest_len:
longest_len = manlen
longest_rowi = rowi
li: Optional[int] = None
ri: Optional[int] = None
for coli in range(m):
if mat[longest_rowi][coli] != "#":
continue
if li is None:
li = coli
ri = coli
# because of the nature of Manhattan circle, `ri + li` is always even
midi = (ri + li) // 2
return longest_rowi + 1, midi + 1
for _ in range(int(input())):
n, m = map(int, input().split())
mat = []
for i in range(n):
mat.append(list(input()))
res: tuple[int, int] = solve(n, m, mat)
print(f"{res[0]} {res[1]}")
t <= 10 ^ 4
and n <= 2 * 10 ^ 5
, so I
needed to come up with a O(n)
solution.
I thought of an approach that checks sum // 2 in prefix
using set
or dict
, so that the check should be
doen in O(1)
and O(n)
in total.
However, that approach exceeded the time limit on test 10. My
suspicion is that, the number of elements I needed to hold in a hash
table was too large, facing collisions, and the time complexity of the
lookup became > O(1)
(~=O(n)
?), making the
total time complexity exceed O(n)
.
The fact I could not notice is that I only need to track the maximum
number in a prefix because only the maximum number in a prefix can be
sum // 2
. Other values cannot be satisfy the condition
because the remaining part already contains a value bigger than the
value, thus the value is always smaller than the sum, including the
maximum element.
from collections import defaultdict
def solve(n: int, a: list[int]) -> int:
su: int = 0
ma: int = 0
ans: int = 0
for x in a:
su += x
ma = max(ma, x)
if ma * 2 == su:
ans += 1
return ans
for _ in range(int(input())):
n: int = int(input())
a: list[int] = list(map(int, input().split()))
ans: int = solve(n, a)
print(ans)
The parity of each number changes after an operation. That means that if 2 numbers have the same parity, they will always have the same parity. If they had different parity, their parities stay different.
(2, 2, 2)
->
(3, 1, 1)
->
(2, 0, 2)
So, for any digit, the count can be decreased to
x mod 2
. Considered the fact that the difference of
parities of any 2 numbers don't change on the operations, the solution
is,
for _ in range(int(input())):
a, b, c = map(int, input().split())
ans: tuple[int] = (
1 if b % 2 == c % 2 else 0,
1 if a % 2 == c % 2 else 0,
1 if a % 2 == b % 2 else 0,
)
print(f"{ans[0]} {ans[1]} {ans[2]}")
This is the second time I tackled this problem.
The most important thing (for me) is
There are 𝑛 coins on the table forming a circle, and each coin is either facing up or facing down.
Because it took me a long time to realize that I did not have to consdier edge cases.
Removing a coin only flips the parity (mod 2
) by 1
because
(two adjacent coins)
(U, U), (D, D) 0 mod 2 -> (D, D), (U, U) 0 mod 2
(U, D), (D, U) 1 mod 2 -> (D, U), (U, D) 1 mod 2
The parity of each player does not change until the operation before the last one.
for _ in range(int(input())):
n: int = int(input())
s: list[str] = list(input())
parity: int = sum(1 if x == "U" else 0 for x in s) % 2
if parity == 0:
print("NO")
else:
print("YES")
for _ in range(int(input())):
k, q = map(int, input().split())
a: list[int] = list(map(int, input().split()))
q: list[int] = list(map(int, input().split()))
a.sort()
amin: int = a[0]
ans: list[int] = []
for n in q:
if n < amin:
ans.append(n)
else:
ans.append(amin - 1)
print(" ".join([str(x) for x in ans]))
for _ in range(int(input())):
n: int = int(input())
a: list[int] = list(map(int, input().split()))
if 0 in a:
print(0)
continue
negs: int = sum(1 if x < 0 else 0 for x in a)
if negs % 2 == 0:
print(1)
print("1 0")
else:
print(0)
Ketone 40 mg/dl // I'm taking Keto suppliments, and I bet the Keto is not something generated by my body.
Bacon Egg 0g Salad 20g Pistachio 10g Protein shake 10g
Total carbohydrate 40g
MUST:
cyclon
, updating a
function with Result<> (20240728)TODO: