thảo luận Leetcode + Codeforces, Competitive programming contest. Đường tới Guardian + Candidate Master.

  • Người tạo chủ đề Người tạo chủ đề freedom.9
  • Ngày bắt đầu Ngày bắt đầu
Q4 tiếc quá, nghĩ ra thuật rồi không code kịp :( do n <= 10^15 nên sau bước popcount đầu tiên chỉ có thể có ra các số <= 50. Popcount cho từng số bé hơn 50 với k-1 lần rồi xem thằng nào về 1 thì đếm tổ hợp của nó :v dính đoạn DP digit
UKiCiKh.png
UKiCiKh.png
UKiCiKh.png
Nhớ trừ 1 nếu có 1 nhé k là bug
Câu 3 làm mất thời gian quá chứ câu 4 ngoáy 15p xong r
Nay 4 câu 1 bug dư 10p vẫn top 700, chứng tỏ đề cũng dễ
 
Bài 4 này khoai thật
Tìm hình thang thì xử lý cho đuae về cạnh song song (dùng set bằng ptdt để check)
Tìm hình bình hành check đếm số trung điểm trùng nhau
Nhưng cái lỏ ở chỗ check hình bình hành thì còn case 4 điểm thẳng hàng nữa :ah: .phát cuối code k kịp chứ xử lý 4 điểm thẳng hàng bù trừ thôi :surrender:

class Solution:
def countTrapezoids(self, points: List[List[int]]) -> int:
def get_line_equation(x1, y1, x2, y2):
a = y2 - y1
b = x1 - x2
c = x2 * y1 - x1 * y2
gcd = math.gcd(math.gcd(abs(a), abs(b)), abs(c))
if a == 0:
return 0.0, 1.0, c/b
else:
return 1.0, 0.0 if b == 0 else b/a, c/a

n = len(points)
lines = defaultdict(set)
for i in range(n):
for j in range(i+1, n):
a, b, c = get_line_equation(points[0], points[1], points[j][0], points[j][1])
lines[(a, b, c)].add((points[0], points[1]))
lines[(a, b, c)].add((points[j][0], points[j][1]))
parallel = defaultdict(list)
for key, value in lines.items():
parallel[(key[0], key[1])].append(len(value))
total_count = 0
for _, value in parallel.items():
total = 0
total_sqr = 0
for count in value:
pairs = (count*(count-1))//2
total+= pairs
total_sqr+= pairs*pairs
total_count+=((total*total-total_sqr) // 2)

def count_parallelogram()->int:
count = defaultdict(int)
for i in range(n):
for j in range(i+1, n):
mid_point = (points[0]+points[j][0], points[j][1]+points[1])
count[mid_point]+=1
total_parallelogram = 0
for _, value in count.items():
if value >= 2:
total_parallelogram += value*(value-1)//2

for _, point in lines.items():
p = len(point)
if p < 4:
continue
else:
mids = defaultdict(int)
point_line = list(point)
for i in range(p):
for j in range(i+1, p):
mid_point = (point_line[0]+point_line[j][0], point_line[j][1]+point_line[1])
mids[mid_point]+=1
for _, value in mids.items():
if value >= 2:
total_parallelogram -= value*(value-1)//2
return total_parallelogram

return total_count - count_parallelogram()


Không khó lắm nhưng dài, thôi an phận top 888 zay, húp dc bài này là lên 2 lốp:beat_brick:
 
Bài 4 này khoai thật
Tìm hình thang thì xử lý cho đuae về cạnh song song (dùng set bằng ptdt để check)
Tìm hình bình hành check đếm số trung điểm trùng nhau
Nhưng cái lỏ ở chỗ check hình bình hành thì còn case 4 điểm thẳng hàng nữa :ah: .phát cuối code k kịp chứ xử lý 4 điểm thẳng hàng bù trừ thôi :surrender:

class Solution:
def countTrapezoids(self, points: List[List[int]]) -> int:
def get_line_equation(x1, y1, x2, y2):
a = y2 - y1
b = x1 - x2
c = x2 * y1 - x1 * y2
gcd = math.gcd(math.gcd(abs(a), abs(b)), abs(c))
if a == 0:
return 0.0, 1.0, c/b
else:
return 1.0, 0.0 if b == 0 else b/a, c/a

n = len(points)
lines = defaultdict(set)
for i in range(n):
for j in range(i+1, n):
a, b, c = get_line_equation(points[0], points[1], points[j][0], points[j][1])
lines[(a, b, c)].add((points[0], points[1]))
lines[(a, b, c)].add((points[j][0], points[j][1]))
parallel = defaultdict(list)
for key, value in lines.items():
parallel[(key[0], key[1])].append(len(value))
total_count = 0
for _, value in parallel.items():
total = 0
total_sqr = 0
for count in value:
pairs = (count*(count-1))//2
total+= pairs
total_sqr+= pairs*pairs
total_count+=((total*total-total_sqr) // 2)

def count_parallelogram()->int:
count = defaultdict(int)
for i in range(n):
for j in range(i+1, n):
mid_point = (points[0]+points[j][0], points[j][1]+points[1])
count[mid_point]+=1
total_parallelogram = 0
for _, value in count.items():
if value >= 2:
total_parallelogram += value*(value-1)//2

for _, point in lines.items():
p = len(point)
if p < 4:
continue
else:
mids = defaultdict(int)
point_line = list(point)
for i in range(p):
for j in range(i+1, p):
mid_point = (point_line[0]+point_line[j][0], point_line[j][1]+point_line[1])
mids[mid_point]+=1
for _, value in mids.items():
if value >= 2:
total_parallelogram -= value*(value-1)//2
return total_parallelogram

return total_count - count_parallelogram()

Không khó lắm nhưng dài, thôi an phận top 888 zay, húp dc bài này là lên 2 lốp:beat_brick:
Mình thì ko biết tính cái hình bình thang mà có 4 cạnh song song như thế nào để loại, đen vl.
Đm bài 3 optimize tí chỗ tính length mà code ngu dính cái bug mãi mới nhìn thấy :ah:
 

Tệp đính kèm

  • 1752985509576.png
    1752985509576.png
    27,9 KB · Lượt xem: 21
Mình thì ko biết tính cái hình bình thang mà có 4 cạnh song song như thế nào để loại, đen vl.
Đm bài 3 optimize tí chỗ tính length mà code ngu dính cái bug mãi mới nhìn thấy :ah:
Em trễ bài cuối đúng 1p, thốn vl.
Căn bản đếm hbh nó phải đấm theo hướng khác chứ theo từ hướng hình thang khó lắm. Khả năng chết hết chỗ đó do cứ chày cối đếm từ hình thang lên
 

Thống kê chủ đề

Ngày tạo
freedom.9,
Người trả lời cuối
deple20k,
Trả lời
1.686
Lượt xem
107.080
Quay lại
Lên đầu trang