<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://zipdang04.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://zipdang04.github.io/" rel="alternate" type="text/html" /><updated>2026-05-04T21:56:22+00:00</updated><id>https://zipdang04.github.io/feed.xml</id><title type="html">Hesll.cpplus</title><subtitle>Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.</subtitle><entry><title type="html">tràng nước mắt sinh nhật số 2</title><link href="https://zipdang04.github.io/diary/2026/03/12/secondtears.html" rel="alternate" type="text/html" title="tràng nước mắt sinh nhật số 2" /><published>2026-03-12T17:00:00+00:00</published><updated>2026-03-12T17:00:00+00:00</updated><id>https://zipdang04.github.io/diary/2026/03/12/secondtears</id><content type="html" xml:base="https://zipdang04.github.io/diary/2026/03/12/secondtears.html"><![CDATA[<p>(note: bài này phải tận ngày 26 mới viết xong, để ngày 13/3 cho vui thôi)</p>

<p>thực ra là hậu sinh nhật, một ngày sau đó.
đố quý độc giả, cảnh nào?</p>

<p>tl;dr: hesll trong tâm thế lần đầu xem phim của đạo diễn làm nghề tử tế kể lại cho mọi người trải nghiệm xem phim, bào chữa + đưa ra nguyên nhân + giải pháp cho việc khán giả không hiểu được sự vô lý xuất phát từ cái tôi của Hoài, cũng như tại sao hesll thích cái vibe nghiêng về tình bạn của cặp đôi Hoài-Hiếu.</p>

<hr />
<p><strong>[dẫn chuyện]</strong></p>

<p>điện ảnh Việt Nam mà tôi được tiếp xúc xưa giờ chỉ gồm hai loại phim.
đầu tiên là phim thánh trần. ngoại trừ Nhà bà Nữ, phim của anh ta gần như không có sạn, vì nó là một bãi biển cmnr, khác là thay tiếng sóng vỗ bằng tiếng người.
thứ hai là phim cúng cụ. xếp hạng thì Đào, phở và piano ~&lt; Mưa đỏ &lt; Địa đạo « Tử chiến trên không, k hiểu sao lại đem bộ phim nhiều sạn như Mưa đỏ đi tranh giải Oscar. mà kệ, sạn có thể nhiều hay ít, nhưng ít ra là phim có cấu trúc – có dữ dội, có khoảng lặng đàng hoàng.</p>

<p>lúc mà tôi check threads và thấy mọi người nói rất nhiều về Cảm ơn người đã thức cùng tôi, tôi cũng nhủ trong lòng nhất quyết đi xem. sẵn tiện sinh nhật tháng 3 được CGV tặng free bỏng nước, vào đúng buổi chiều thứ 6 ngày 13, tôi dùng thêm quyền U23 và tặng bản thân một trải nghiệm xem phim thoải mái nhất có thể với 100k: bắp mix vị phô mai caramel thay cho ăn trưa + một chỗ ngồi êm ái trong rạp phim vắng vẻ.</p>

<p>…holy moly! đây là bộ phim duy nhất tôi cảm thấy may mắn vì đã xem một mình.
(chứ cái lúc đấy mà có người ngồi cạnh thì dị lắm)</p>

<hr />
<p><strong>[lời mở đầu]</strong></p>

<p>nghe tới thể loại phim nhạc kịch cũng lâu, nhưng chưa xem bao giờ, càng không bao giờ nghĩ Việt Nam sẽ có một bộ phim như thế.</p>

<p>tóm tắt toàn thể bài viết này là, với khả năng cảm thụ nghệ thuật non nớt của tôi, 
mặc dù tôi cảm thấy nguồn gốc mâu thuẫn chưa được làm rõ, dẫn tới việc phải tự diễn giải nguyên nhân dẫn tới cao trào, 
nhưng vì phần cuối phim làm tôi khóc ngon lành giữa rạp, và lần đầu tôi thấy tư tưởng tương đối woke xuất hiện trong một bộ phim điện ảnh Việt Nam,
tôi chấm 8.5/10.</p>

<p>tôi nghĩ là những lời khen có cánh, chỉ ra khuyết điểm hay là phân tích ẩn ý thì có nhan nhản trên mạng rồi, nên nếu viết để thuần review thì viết lại cũng thừa.
lý do tôi viết bài này,</p>
<ul>
  <li>đầu tiên là để bênh bà Hoài một đoạn và đề xuất một cách cài đặt mâu thuẫn khác</li>
  <li>thứ hai là ghi lại cảm xúc và suy nghĩ của bản thân,</li>
  <li>và sau đó, đặt trong bối cảnh series hai tràng nước mắt sinh nhật, là để ghi lại một chuỗi hiện tượng kỳ lạ không thường xảy ra với một dịp mà người ta thường ăn mừng – nếu không có những gì đã xảy ra vào một ngày trước đó, tôi không nghĩ mắt tôi hôm đó sẽ ướt nhẹt như vậy.</li>
</ul>

<p>dưới đây là toàn bộ những cảm nhận của tôi, từ những thứ tôi note lại, từ đầu phim tới cuối.
CẢNH BÁO: NẾU CHƯA XEM, MUA VÉ ĐI XEM HẾT HAI TIẾNG RƯỠI PHIM ĐI RỒI ĐỌC TIẾP.</p>

<hr />
<p><strong>[đầu phim]</strong></p>

<p>phân cảnh nhạc kịch mở đầu với tôi khá là khó xem. tôi không rõ là chủ ý hay là tay nghề y hệt góc quay – không vững, nên bị loạn, xem hơi chóng mặt.
tôi bất ngờ vì anh Lâm của Balanha là một thằng cộc cằn vụng về nhưng có trái tim yêu thương, chứ tôi không biết ảnh nhảy tự tin như vậy :P
chị Tâm với cái đầm, đầu phân cảnh ngoại cuối cùng nó Marilyn Monroe thế nào í.
sau đấy thì tới chị Hoài. cũng như nhiều khán giả khác, tôi cũng sợ Hoài có một cái kết buồn.</p>

<p>đoạn này phát ra bài Họa sĩ bầu trời của Gác Mái.
tôi có phức cảm với hoài niệm. tôi có cảm giác gắn bó đặc biệt với thứ âm nhạc từ các nghệ sĩ độc lập ở giai đoạn xưa cũ ấy (cụ thể là cách đây 5-7 năm), tới mức mà kể cả giữa chốn đông người, miễn là những bài hát tôi yêu thích được phát lên, mồm tôi sẽ tự động mấp máy.</p>

<p>tôi thấy mọi người bảo phim nhiều sạn. ban đầu tôi không thấy sạn đâu cả, tôi thấy phục trang và bối cảnh khá đồng bộ với từng cột mốc thời điểm của phim. 
ở bối cảnh tầm 201x, lúc nhìn thấy chiếc điện thoại mỏng mỏng có nút nguồn tròn tròn nhỏ nhỏ xinh xinh, tôi chợt nhớ lại cái thời cứ về đêm lại đợi mẹ ngủ để lén lấy chiếc Xperia của mẹ ra chơi. “uầy, đạo cụ đúng thời điểm thật”.
btw nhìn chị Trang rap nó Suboi í, 201x cực kỳ.</p>

<p>tôi nhìn thấy anh Phương Nam. tôi cứ nghĩ sẽ làm hề.
nhưng cuối cùng thì miếng hài không hề nằm ở anh Nam, nên tôi có cảm giác không quen
à quên, tôi đang xem phim được làm nghiêm túc.</p>

<p>tôi đã nghĩ “uầy, tình tiết cũng không khó đoán”.
phim setup cho hai người gặp lại nhau trên chuyến tàu là tôi đã biết cái bầu của Hoài là từ đâu ra.
từ khi nhìn thấy đôi mắt của đạo diễn Khang, cách mà anh ta chú ý và giúp đỡ Hoài (và easter egg hẹn 4h nhưng tới từ 3h), tôi đã biết sẽ còn có gì sau đó nữa.</p>

<p>nhưng mà thế thì tôi đã không viết một bài dài như thế này.
điều bất ngờ, bỏ qua những điểm vô lý trong cách xây dựng mâu thuẫn, thì đến từ những tình tiết nhỏ nhặt trong phim.</p>

<p>lúc Hoài ra Sài Gòn đi học, ba dò Hoài 3 điều ba dạy bảo, Hoài dò ba 3 điều Hoài dặn ba
tôi bất ngờ là trước lúc Hiếu đi Hàn, có cảnh 3 điều chúng mình dặn nhau.</p>

<p>tôi bất ngờ (dù thực ra không đáng để bất ngờ) khi mà con ghệ Hoài bay sang Hàn để gây bất ngờ cho Hiếu, và Hiếu về sớm một hôm hù cho Hoài hết hồn.
tôi cũng bất ngờ vì màn quảng cáo đánh răng bất ngờ =))
cảm ơn Closeup đã quyết định đầu tư để tôi có thể khóc toác cả mồm, lộ hết cả hàm răng đẹp nhờ Colgate với P/S :P</p>

<hr />
<p><strong>[mâu thuẫn]</strong></p>

<p>hóa ra sạn ở đây là sạn về kịch bản, chứ không nhẽ cài cắm easter egg đủ kiểu mà không nhận ra nam Bắc nữ Nam ở miền Trung ngay trước mặt, cái đấy không phải là sạn :)</p>

<p>tôi biết là thằng Hiếu viết bài này nếu vào mâu thuẫn thì cũng sẽ cãi nhau ngu không khác gì ông Hiếu trên phim ảnh, và đầu óc cũng không thể nghĩ thoáng ra khi nhận được tin mừng giữa cơn bão nợ nần, nếu không có bé Hoài khai sáng (sau khi cãi nhau)
nhưng ít ra thì cái mâu thuẫn số 1 còn có đầu có đuôi. cùng nhau phân tích mâu thuẫn số 2 thôi.</p>

<p>Hiếu nghĩ Hiếu đáng lẽ có thể bảo “thì giờ anh gia công là để luyện tay nghề cho tinh, sau này mới làm nên cuốn truyện hoàn hảo được!”. nhưng mà thế thì “and then they fkd”, hết phim.</p>

<p>có thể mọi người nghĩ Hoài quá đáng khi cái mặt xị ra mỗi lần Hiếu “không vẽ cái mình muốn”.
rõ là với cùng bối cảnh tương tự, ngoài đời thì không có ai như thế hết, việc đầu tiên là ăn mừng hôn hít chí chóe cái đã (cái này tí tôi nói sau).
nhưng lý do tôi bảo là tôi “tự diễn giải” nguyên nhân mâu thuẫn thay vì bảo “mẹ, cãi nhau con nít xàm lờ” là vì như sau:</p>

<p>tôi có thằng bạn học code, nhưng tâm hồn cũng hướng nghệ thuật, cũng có thực hành viết văn chương, cụ thể hơn là truyện ngắn.
khi tôi nhìn Hoài, tôi nghĩ tới nó – một đứa có tư duy khác người (nhưng mask làm người thường cũng giỏi), có những suy nghĩ mà một người không có tư duy đủ mở nghe vào sẽ thấy trái với lẽ thường, nếu không muốn nói là hâm.
hôm trước, tôi review cho nó toàn bộ phim. mặc dù nó vẫn chửi Hoài quá đáng, nhưng sau khi kiểm chứng để đảm bảo tôi không nhớ nhầm, thì đúng là tư duy nghệ thuật thì vẫn same same: vẫn là một đứa có cái tôi và tiêu chuẩn nghệ thuật cao, vẫn là một đứa áp cái tiêu chuẩn đấy lên những người mà nó tin tưởng sẽ có tương lai, và cũng là một đứa muốn được chứng kiến sự phát triển của người khác.
tóm lại, không biết mọi người như nào, nhưng tôi hiểu cách mà Hoài nghĩ về công việc mới nhận của Hiếu.</p>

<p>nhưng có hai thứ.
một là Hoài không nhận ra Hoài có nhiều đặc quyền hơn Hiếu.
tuy mất mẹ sớm và bố điếc, nhưng ít ra bố Hoài không phá, Hoài cũng không bao giờ phải lo lắng nhiều về tiền nong.
Hiếu thì ngược lại, gánh nợ hộ mẹ; tưởng là trả hết nợ thì lại phải nai lưng ra trả tiếp.
khi bụng bạn đói thì việc đầu tiên cần làm là lấp đầy bụng
khi đó mới tiếp tục với sáng tạo được.</p>

<p>hai là chính Hoài là người tự chỉ điểm mâu thuẫn trong việc áp đặt quan điểm bản thân lên Hiếu.
trước khi có vai chính, Hoài cũng đi đóng quảng cáo.
Hoài cũng là người mở mồm ra câu “em là đạo diễn, em có quyền thay đổi kịch bản đâu”
cuối cùng thì cũng là để hiện thực hóa ước mơ của người khác, chứ có phải là kịch bản của Hoài hay của Hiếu đâu. vậy thì Hoài lấy tư cách gì?</p>

<p>lúc tôi đặt ra câu hỏi này, tôi thấy cân cấn.
có lẽ tư cách ở đây là khi nào Hoài cũng nuôi giấc mơ về việc làm nghệ thuật chân chính, còn suy nghĩ của Hiếu hiện tại là phải no đủ đã.
với tôi không biết việc gia công vẽ truyện tranh như nào, nhưng tôi nhớ là diễn viên nhiều khi cũng góp một phần nhỏ chỉnh sửa kịch bản, và vẫn có thể thổi hồn vào đó.
nhưng một giảng viên tôi ghét đã từng bảo “ở đại học thì các em chỉ việc làm theo thôi, sáng tạo đợi đến khi đi làm đi”. tôi kịch liệt phản đối quan điểm này trên mặt chữ, nhưng nếu mở rộng góc nhìn ra, rõ là ở giai đoạn tập sự thì thật là ít có sự sáng tạo mà chủ yếu là học theo chỉ đạo của người khác, và thực ra việc luyện nhuần nhuyễn các khâu cơ học dù sao vẫn là tốt thôi.</p>

<p>như tôi bảo, mâu thuẫn này với tôi không hề phi thực tế, và tôi thấy vấn đề mà đạo diễn đặt ra cũng tương đối thú vị. bản thân tôi cũng là một người có cái tôi cực kỳ cao mà.
tuy nhiên, bối cảnh mà đạo diễn cài nhân vật vào thì nó vô lý, và cũng không được đẩy lên mức mọi người cảm thấy căng thẳng đến ngộp thở, nên người xem không thể cảm được cảm xúc và suy nghĩ của hai người trong cuộc cãi vã, hoặc chỉ thương hại anh nam chính thôi chứ không hiểu tại sao Hoài lại vô lý như vậy.</p>

<p>tôi nghĩ đáng nhẽ biên kịch phải làm một trong hai việc sau: hoặc lý giải nguồn gốc cho cái quan điểm nghệ thuật cực kỳ cực đoan của cổ; hoặc phương án dễ hơn là phải đợi cuộc sống hai đứa nó đủ rồi, nhưng Hiếu vẫn không dám mơ lớn, và mâu thuẫn giữa hai quan điểm nghệ thuật dưới một mái nhà xảy ra.</p>

<p>cơ mà, dù sao phim này là để chữa lành, chứ không phải là tuyên ngôn nghệ thuật hay gì cả. 
chủ đề nghị luận được anh 3C đặt ở đấy rồi về nhà anh em tự đặt vấn đề tự suy luận.</p>

<p>(25/3 – bổ sung) ôm qua xem phỏng vấn trên Made By Vietnam thì lại càng bối rối nữa, vì 3C bảo là thực ra Hoài là một người rất thực tế. 
tóm lại là có hai con người đang sống trong thế giới thực tế; nhưng từ khi gặp lại, hai ông bà này nhắc nhau đừng bao giờ quên ước mơ của mình.
sau khi nghe diễn giải gốc thì tôi kiểu “uh… cũng hợp lý” khi nhìn cách hai con người này cãi nhau, nhưng vẫn chưa thuyết phục lắm…</p>

<p>giờ thì quay lại với mạch truyện.</p>

<hr />
<p><strong>[người mẹ… có ước mơ?]</strong></p>

<p>tôi cảm thấy run sợ khi Hoài bước vào phòng khám.
tôi không run cho tương lai của Hoài, đạo diễn đã cài cho Hiếu cắm vào rồi, đạo diễn cũng muốn nói về “đứa trẻ bên trong” (lướt threads xem cinetour mới biết  &lt;(“) ), nên tôi thừa biết kiểu gì Hoài cũng giữ đứa bé. 
tôi chỉ sợ 1 phút nữa tôi sẽ thất vọng vì giáo điều pro-life.</p>

<p>pheww, quên mất nhỉ, không phải tự nhiên mà người ta seeding phim như vậy.
tôi quên mất tường tận chi tiết đoạn hội thoại giữa Hoài và Trang để phân tích đoạn này.
nhưng tôi nhớ chắc chắn rằng, sau khi đoạn hội thoại kết thúc, tôi cảm thấy nhẹ nhõm.</p>

<p>nhưng tôi rất thắc mắc với quyết định của Hoài. thông thường, ngay nghe lúc nghe tin, kể cả đã chia tay, bà mẹ sẽ liên hệ ông bố để tính chuyện. đứa con cũng là của thằng cha, giấu nhẹm mấy năm như thế tôi thấy không ổn.
tôi không rõ Hoài quyết định chọn làm single mom để làm gì.</p>

<p>ý là cũng không hẳn là không hiểu được.
tôi có tưởng là có khi nào bả thương ông Hiếu tới mức không muốn ổng chịu cực?
đoạn cuối phim, Hoài có bảo không muốn chỉ quay lại vì nghĩa.
lúc chia tay, Hoài nghĩ Hoài chỉ thương thằng bé đam mê vẽ truyện tranh cháy bỏng trong Hiếu. vậy là cũng vì sợ trái quan điểm nuôi con, sợ con bé sống trong gia đình không hạnh phúc, nên thà mình tự lo còn hơn?</p>

<p>tôi thấm lời cô ta nói lắm.
nhưng dù sao, với đầu óc hạn hẹp của một người chưa làm ai có bầu bao giờ, thì tôi vẫn kiểu “sis, you could’ve chosen smth better than this”.</p>

<p>có một sạn nhỏ, nếu như tôi nhớ chi tiết dưới đây không nhầm
cái lúc Trang về rủ Hoài đi du học, Hoài trách Trang hồi đấy khuyên giữ con, sao giờ lại đòi bả xa con. cơ mà hình như Trang từng nói lời nào như kiểu khuyên giữ con hay không.</p>

<hr />
<p><strong>[tại sao lại thế?]</strong></p>

<p>cái lúc quay lại cảnh đầu tiên, tôi nhìn đồng hồ thì mới được 2/3 phim.
đúng là phim chữa lành không bao giờ có cái kết tệ.</p>

<p>cái lúc mà ông Năm vào thăm chị Hoài, tôi chợt nghĩ
lý do xây dựng một ông bố điếc thay vì một bà mẹ điếc
là vì hình tượng chung của một ông bố là ít nói 
mà chủ yếu yêu thương bằng hành động?</p>

<p>…ông Năm hỏi “con dự định như nào”.
ông Năm hỏi lại “không, dự định của bản thân con á”
một khung cảnh bình dị, màu tươi sáng, không hề lâm li bi đát, 
chỉ là một câu hỏi hơi khó trả lời với chị Hoài.</p>

<p>ỦA WTF TÔI KHÓC?
tôi nghĩ chắc chẳng có ai nghe câu đấy lại bật khóc như tôi.
tôi vẫn chưa lý giải được cảm xúc của tôi lúc đó.</p>

<p>giai đoạn này
tôi cũng tự vấn về tương lai của bản thân
tôi đang hoài nghi về năng lực của chính mình
tôi vẫn chưa thoát khỏi bóng ma quá khứ
tôi cũng sợ tôi không là một ai.</p>

<p>tôi có chợt nghĩ,
“ô thế ví dụ như hai cha con mà giận dỗi cãi nhau thì như nào nhỉ”
tôi nghĩ là kể cả ông Năm không bị điếc thì đôi tai cũng không bị tra tấn như cả nhà tôi đợt COVID.</p>

<p>và suốt mấy chục phút sau đó, nước mắt tôi giàn giụa liền tù tì.
chắc những ai đã theo dõi sát sao tôi từ đầu sẽ không khó hiểu tại sao tôi lại khóc.</p>

<hr />
<p><strong>[đoàn tụ]</strong></p>

<p>lúc chỉ về, con bé mất một lúc lâu mới dám tin vào mắt mình.
tôi cũng bất ngờ (nghĩ lại thì cũng không bất ngờ lắm) khi chị bé không la mắng đánh con khi con bé đột ngột cắt cọng tóc vì muốn nhận vai hoàng tử. 
chưa kịp dừng đã trào lại. nay dễ bị kích động quá.</p>

<p>vì đây là phim, tôi biết kiểu gì Hiếu cũng sẽ gặp lại con. 
tôi chỉ không biết là phản ứng của anh ta như thế nào. tôi tưởng ảnh có bồ mới.
hóa ra ảnh lén chăm con bấy lâu nay. 
ảnh cũng chả có bồ, tặng hoa cho con, con bảo đăng thì đăng thôi. liêm hệt thằng bạn tôi.
xử lý khá an toàn, nhưng cũng hợp lý.</p>

<p>(đạo diễn dàn dựng cho) hai cha con lên kế hoạch tác chiến hay ghê, đoán trước mẹ nó sẽ chưa chấp nhận vội, nên cài sẵn quả bom quyển truyện số 2 (quên tiêu đề rồi) làm một cú chốt hạ. 
vậy là từ hoài nghi, sau 15 phút, con ghệ Hoài lập tức hối hận vì đã đuổi đứa trẻ chưa bao giờ chết đấy đi. chỉ chờ có thế, canh đúng số phút, anh ta lập tức lùi xe, và bước ra từ xe như một soái ca.
đúng là đỉnh vl.</p>

<p>nghe bảo anh trai lần đầu đọc kịch bản thì khóc.</p>

<hr />
<p><strong>[recurring symbols]</strong></p>

<p>và hình ảnh cuối cùng là hộp bút, lúc này là để cầu hôn.</p>

<p>một trong những đặc trưng của hài độc thoại nước ngoài mà tôi nhận thấy sau bao nhiêu năm, đó là một câu punchline nhắc lại một tình tiết trước đó, thường nằm ở kết bài.
tôi đoán rằng thực ra việc cho một hình ảnh (biểu tượng hoặc ngẫu nhiên(nhưng vẫn có hàm ý?)) xuất hiện lại ở những thời điểm quan trọng thực ra là một điều khá bình thường với những tín đồ của bộ môn nghệ thuật thứ 7.</p>

<p>nhưng đây là bộ phim Việt đầu tiên mà tôi thấy được những hình ảnh, vật thể có phương thức xuất hiện trở lại, hoặc tuần hoàn kiểu như thế (hoặc ít nhất là lần đầu tiên tôi để ý)
nên thật ra chẳng bất ngờ gì, chỉ là thay vì cơm nguội với rau thì giờ cơm nóng có thịt.</p>

<hr />
<p><strong>[không giống người yêu?]</strong></p>

<p>cuối cùng là việc mọi người bảo hai người không ra dáng người yêu, không có chemistry.
và đúng là 3C bảo hai người này lúc casting ra vibe bạn bè thân thiết hơn là người yêu.
chưa kể là Kaycee có chồng có con rồi, dân tay ngang nhảy vào điện ảnh thì mấy cái này cũng nguy hiểm, dễ gây mất hạnh phúc gia đình lắm.</p>

<p>không hiểu sao nhưng tôi lại thích cái vibe này, nên tôi phản đối quan điểm của mọi người.</p>

<p>sau mấy năm dữ dội, tôi đang thèm khát những giây phút yên bình.
tất nhiên, bản chất của tôi vẫn là một thằng d^đ~, nên tôi vẫn thèm những cái chạm, những cái ôm, những cái khác nữa.
nhưng tôi cũng nhận ra những thiếu sót của bản thân,
khiến cho trước đây mình chưa tận hưởng nhiều khoảnh khắc tầm thường như thế,
khiến cho trước đây mình chưa nhận ra được những ẩn ý, những sự quan tâm của người khác dành cho mình,
khiến cho trước đây mình cũng không/không-thể/không-đủ-khả năng/(???) thể hiện sự quan tâm của mình tới người khác, mà chỉ đứng yên quan sát.</p>

<p>người ta chỉ thèm khát cái điều mà mình không làm được.
và vì thế, tôi yêu cái sự bình yên của cặp đôi này.
tôi yêu cái vẻ ngoài, cái hành xử đụt đụt, nhưng hành động vô cùng thực chất, đầy ấm áp của ông anh. (tôi chỉ có nửa đầu thôi)
tôi yêu cô gái có cái tiêu chuẩn kèm cái tôi cao tới mức muốn nửa kia của mình cũng phải đạt được như thế. dù sao thì cổ cũng luôn muốn ngày mai sẽ tiếp tục thấy thêm một phiên bản tốt hơn của người ta.
tôi yêu việc hai người đặt ưu tiên việc hiện thực hóa ước mơ của người kia lên trước cái ước mơ của mình. 
tôi yêu việc những gì được thể hiện qua màn ảnh là những cái ôm, những niềm vui sẻ chia cùng nhau, những cử chỉ quan tâm.</p>

<p>tôi yêu cái tình yêu softcore, platonic, thuần khiết mà 3C đã chủ đích lựa chọn.</p>

<hr />
<p><strong>[kết bài]</strong></p>

<p>tóm lại, tôi thấy cả Hoài lẫn Hiếu trong tôi.
tôi thấy Hoài trong phần hoài bão của tôi
tôi thấy Hiếu trong cái đống lo âu của tôi.
tôi thấy hai người trong cái tương lai hụt của tôi.</p>

<p>dù không phải chi tiết nào cũng được phát triển trọn vẹn vì phải gói gọn tầm 2 thập kỷ xuống 2 tiếng rưỡi, 
“Cảm ơn người đã thức cùng tôi” trước tiên đã cho tôi nhìn thấy một hy vọng cho nền điện ảnh thương mại Việt Nam: phim hay, có ý nghĩa, tư tưởng đủ woke, vẫn có thể có chỗ đứng trong thị trường. 
sau đó là phim đã thành công đổ thêm dầu vào sự đau đầu của một bạn trẻ vừa mới bước qua tuổi 22 được ngày thứ 2.</p>

<p>và vì thế, tràng nước mắt số 2 tuôn trào, 
2 chiếc vé cho 2 suất chiếu từ 2 rạp khác nhau,
khi nào rảnh thì sẽ đọc lại hoàng tử bé lần hai,
và hy vọng sẽ không còn phải tự hỏi “ai cho em lần thứ hai”.</p>]]></content><author><name></name></author><category term="diary" /><summary type="html"><![CDATA[(note: bài này phải tận ngày 26 mới viết xong, để ngày 13/3 cho vui thôi)]]></summary></entry><entry><title type="html">[CP - Luyện] 2025/12/22 - NA East Division 2025</title><link href="https://zipdang04.github.io/cp/icpc/2025/12/22/naeast25.html" rel="alternate" type="text/html" title="[CP - Luyện] 2025/12/22 - NA East Division 2025" /><published>2025-12-22T07:27:18+00:00</published><updated>2025-12-22T07:27:18+00:00</updated><id>https://zipdang04.github.io/cp/icpc/2025/12/22/naeast25</id><content type="html" xml:base="https://zipdang04.github.io/cp/icpc/2025/12/22/naeast25.html"><![CDATA[<p>Chuyện là, <a href="/cp/icpc/2025/12/18/swerc25.html">ngài</a> ấy rủ mình virtual một contest 5 tiếng.</p>

<h1 id="giới-thiệu">Giới thiệu</h1>

<p>Khu vực Bắc Mỹ có tổng cộng 11 kỳ thi Regional khác nhau. Khác với khu vực Đông Nam Á – Thái Bình Dương<sup id="fnref:asiapacific" role="doc-noteref"><a href="#fn:asiapacific" class="footnote" rel="footnote">1</a></sup> với mỗi kỳ thi Regional tổ chức một thời điểm khác nhau, 11 Regionals này được gộp thành 4 miền (division): miền Đông, miền Tây, miền Nam, và miền Trung; các Regionals cùng miền sẽ được tổ chức cùng một ngày và thi chung một bộ đề, nhưng cơ chế chọn đội đi tiếp vào NA Championship hiển nhiên vẫn độc lập với nhau.</p>

<p>Miền Đông của khu vực Bắc Mỹ có ba điểm thi: Đông Bắc, Đông Trung, và khu vực Ba Bang<sup id="fnref:tristate" role="doc-noteref"><a href="#fn:tristate" class="footnote" rel="footnote">2</a></sup> 🐧. Nơi đây có sự góp mặt của rất nhiều trường lớn như: Đông Bắc có MIT – đội vô địch toàn miền, Harvard; Đông Trung có Carnegie Mellon, Waterloo, Toronto, Purdue; GNY thì có Princeton, Cornell, Yale.</p>

<p>Bạn nào muốn virtual kèm bảng điểm gốc thì click vào <strong><a href="https://vjudge.net/contest/776412#overview">đây</a></strong> (chưa bao gồm khu Greater New York).<br />
Nào, bắt tay vào code thôi.</p>

<h1 id="diễn-biến">Diễn biến</h1>

<table>
  <thead>
    <tr>
      <th>Rank 27/264<sup id="fnref:combined" role="doc-noteref"><a href="#fn:combined" class="footnote" rel="footnote">3</a></sup></th>
      <th>A</th>
      <th>B</th>
      <th>C</th>
      <th>D</th>
      <th>E</th>
      <th>F</th>
      <th>G</th>
      <th>H</th>
      <th>I</th>
      <th>J</th>
      <th>K</th>
      <th>L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>8</strong> bài</td>
      <td>+</td>
      <td>+</td>
      <td> </td>
      <td>+</td>
      <td>+6</td>
      <td>+1</td>
      <td>+2</td>
      <td> </td>
      <td>+1</td>
      <td> </td>
      <td>+1</td>
      <td> </td>
    </tr>
    <tr>
      <td><strong>985</strong> phút</td>
      <td>6</td>
      <td>103</td>
      <td> </td>
      <td>21</td>
      <td>298</td>
      <td>13</td>
      <td>54</td>
      <td> </td>
      <td>70</td>
      <td> </td>
      <td>200</td>
      <td> </td>
    </tr>
  </tbody>
</table>

<p><strong>[H-2]</strong> <a href="https://open.kattis.com/contests/naeast25open">Mirror gốc</a> nằm ở trên Kattis, nhưng hệ thống chấm bài này không hề có cơ chế virtual. Vì có bạn làm chung nên mình quyết định bỏ ra 15 phút để tổng hợp bảng điểm rồi đẩy lên VJudge, virtual cho nó giống thật nhất có thể. Mỗi tội là VJudge không có chức năng đóng băng bảng điểm, nên 1 tiếng cuối bảng điểm vẫn tiếp tục cập nhật.</p>

<h3 id="hai-tiếng-trơn-tru-đầu-tiên">Hai tiếng trơn tru đầu tiên</h3>

<p><strong>[0:00]</strong> Bắt đầu từ bài A. Lúc này thì mình đang nghe hơn nửa quyển For the beginning, L của anh Thành <strike>Loot</strike>Luke.</p>
<blockquote>
  <p>Bài A: Có ba cỡ hộp bánh Pizza: hộp S 6 miếng, hộp M 8 miếng, hộp L 12 miếng. Cho \(n\) hộp bánh Pizza, mỗi hộp có cỡ bánh và số miếng còn thừa khác nhau. Ta cần gom các miếng thừa từ hộp bánh cùng cỡ lại với nhau, hỏi cần ít nhất bao nhiêu hộp?</p>
</blockquote>

<p><strong>[0:06]</strong> <strong style="color:green">AC</strong> bài A.</p>
<blockquote>
  <p>Bài F: Cho dãy \(1, 2, 2\frac{1}{2}, 3, \frac{1}{3}, \frac{2}{3}, 4, 4\frac{1}{4}, 4\frac{1}{2}, 4\frac{3}{4}, 5, \dots\); nói cách khác là \(\bigcup\limits_{i=1} \bigcup\limits_{j=0}^{i-1} \left\{i + \frac{j}{i}\right\}\).<br /> Tìm số thứ \(n\) trong dãy, phân số phải viết dưới dạng tối giản.</p>
</blockquote>

<p><strong>[0:11]</strong> <strong style="color:red">WA</strong> bài F vì sai trường hợp \(n=1\), nhỡ in ra thành <code class="language-plaintext highlighter-rouge">1 0/1</code> thay vì chỉ <code class="language-plaintext highlighter-rouge">1</code>.<br />
<strong>[0:13]</strong> <strong style="color:green">AC</strong> bài F.</p>

<blockquote>
  <p>Bài D: Cho một cuộc bầu cử theo format <a href="https://en.wikipedia.org/wiki/Instant-runoff_voting">Instant-runoff</a>:</p>
  <ul>
    <li>Mỗi lá phiếu là một hoán vị, ban đầu chỉ tính mỗi lá phiếu cho người được xếp trên cùng;</li>
    <li>Người giành được <em>hơn</em> 50% số phiếu là người giành chiến thắng.</li>
    <li>Trong khi chưa có người chiến thắng, lần lượt chọn ra người giành được ít phiếu nhất, gạch tên họ ra và tính lại; nói cách khác là chuyển các lá phiếu của người giành được ít phiếu nhất cho những người còn lại.</li>
  </ul>

  <p>Cho \(n\) người, mỗi người đang giành được một số phiếu khác nhau. Trong viễn cảnh đẹp nhất, phải loại đi ít nhất bao nhiêu người để người đang đứng ở rank 2 thắng cuộc bầu cử?</p>
</blockquote>

<p>Rõ ràng là giả sử người thua dồn hết phiếu cho người đang đứng ở rank 2.<br />
<strong>[0:21]</strong> <strong style="color:green">AC</strong> bài D.</p>

<blockquote>
  <p>Bài G: Cho \((p, q)\), tìm một bộ \((r, g)\) sao cho \(r\leq 10^6\) và \(\frac{2rg}{(r+g)(r+g-1)} = \frac{p}{q}\).</p>
</blockquote>

<p>Phân giải ra thì thành một đa thức hai biến \(r, g\): \(pr^2 + 2(p-q) rg + pg^2 - pr -pg = 0\), mình bắt đầu loay hoay chuyển hệ trục tọa độ. Tìm cách chuyển được tầm 10 phút thì mới nhận ra \(r \leq 10^6\), tức là chỉ cần duyệt \(r\) rồi quy về phương trình bậc 2 biến \(g\), với \(a = p, b = 2r(p-q), c = pr(r-1)\).</p>

<p><strong>[0:46]</strong> <strong style="color:red">WA</strong> bài G. Sau một hồi debug thì phát hiện ra lỗi ở đây:</p>
<pre><code class="language-cpp=">ll sqrtDelta = sqrt(delta) - 20;
while ((sqrtDelta+1) * (sqrtDelta+1) &lt;= delta) sqrtDelta++;
</code></pre>
<p>Sợ sai số nên trừ một ít rồi hiệu chỉnh lại, cơ mà trừ lố về âm, mà âm bình phương lại ra dương, tức là có khi vòng <code class="language-plaintext highlighter-rouge">while</code> không chạy ngay từ đầu. Thế là phải sửa thành <code class="language-plaintext highlighter-rouge">sqrtDelta = max(0ll, ...)</code>.<br />
<strong>[0:54]</strong> <strong style="color:gray">TLE</strong> bài G vì quên xóa <code class="language-plaintext highlighter-rouge">cerr</code>.<br />
<strong>[0:54]</strong> <strong style="color:green">AC</strong> bài G.</p>

<blockquote>
  <p>Bài I: Cho kim tự tháp gồm \(n\) hàng (minh họa \(n=6\) như hình dưới) với một số ô trống, một kim tự tháp hợp lệ phải có số ở trên bằng tổng hai số ở dưới, và mỗi số nằm trong khoảng \([-99; 99]\). Kiểm tra xem có một nghiệm duy nhất, vô số nghiệm, hay vô nghiệm.
<img src="/assets/2025-12-22-naeast25/pyramid.png" alt="ái chà" /></p>
</blockquote>

<p>Có vẻ là đoạn này hết audiobook rồi, choke hẳn =))</p>

<p>Về cơ bản, cứ thấy nhóm 3 ô mà có 2 số đã điền thì điền số còn lại thôi. Mình ước tính số lượt chạy quanh quanh \(\mathcal{O}(n)\).<br />
<strong>[1:04]</strong> <strong style="color:red">WA</strong> bài I. Mình quên, nhỡ đâu trong input đề cho có nhóm 3 ô sai từ đầu, kiểu như \((5;8,2)\).<br />
<strong>[1:10]</strong> <strong style="color:green">AC</strong> bài I. <span style="color:lightgray">Cơ mà mình khá nghi ngờ thuật này nó không có chuẩn.</span></p>

<blockquote>
  <p>Bài B: Cho một cây biểu thức gồm các node phép <code class="language-plaintext highlighter-rouge">and</code>, phép <code class="language-plaintext highlighter-rouge">or</code>, lá <code class="language-plaintext highlighter-rouge">true</code>, lá <code class="language-plaintext highlighter-rouge">false</code>. Cần phải đổi giá trị của ít nhất bao nhiêu lá để giá trị của cây biểu thức thay đổi?</p>
</blockquote>

<p>Một bài DP đơn giản, mỗi node chỉ cần: (1) số nhánh T/F, (2) chi phí để đổi giá trị mỗi nhánh. Phần khó nhất của bài này nằm ở việc parsing đầu vào.<br />
<strong>[1:43]</strong> <strong style="color:green">AC</strong> bài B.<br /></p>

<h3 id="ba-tiếng-đọc-nhầm-đề">Ba tiếng đọc nhầm đề???</h3>

<blockquote>
  <p>Bài K: Cho \(w\leq 52; d\leq 10\). Đếm số dãy độ dài \(w\), mỗi phần tử \(\in \{A, B, C\}\) sao cho:</p>
  <ol>
    <li>Không có hai phần tử \(A\) hoặc hai phần tử \(C\) hoặc ba phần tử \(B\) đứng kề nhau</li>
    <li>Chênh lệch số phần tử của hai loại bất kỳ không quá \(d\)</li>
    <li>Dãy không đối xứng (non-palindromic).</li>
  </ol>
</blockquote>

<p>Ép hàm DP khá dễ:</p>
<ul>
  <li>Gọi \(dp[a][b][c][last]\) là số dãy độ dài \(a+b+c\); gồm \(a, b, c\) phần tử mỗi loại; và ký tự cuối cùng \(last\) là \(A, B, C,\) <strong>hay là hai chữ \(B\) liên tiếp</strong>.
Chuyển trạng thái thì dựa vào <code class="language-plaintext highlighter-rouge">last</code>:
    <ul>
      <li>\(A \rightarrow B, C\);</li>
      <li>\(B \rightarrow A, BB, C\);</li>
      <li>\(C \rightarrow A, B\);</li>
      <li>\(BB \rightarrow A, C\);</li>
    </ul>
  </li>
  <li>Trừ bớt dãy palindrome thì duyệt \(a, b, c, last\) (và nếu \(w\) lẻ thì thêm \(center \in \{A, B, C\}\) chứ không gồm \(BB\)), rồi check số lượng + điều kiện trùng ký tự ở khu vực trung tâm, nếu thỏa mãn thì trừ đi \(dp[a][b][c][last]\) (với mỗi \(center\) thỏa mãn, nếu \(w\) lẻ).</li>
</ul>

<p><strong>[2:15]</strong> <strong style="color:red">WA</strong> bài K.<br />
Mình đọc code phải tầm 2-3 lần không thấy sai, nên mình quyết định <a href="https://github.com/zipdang04/cp_solutions/tree/main/contest/icpc/regional25_nac_naeast/tools">code trâu</a> rồi so sánh. <br />
Vì input khá nhỏ nên mình duyệt hết, đây là script <code class="language-plaintext highlighter-rouge">bigcheck.sh</code>:</p>
<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="o">((</span>w <span class="o">=</span> 2<span class="p">;</span> w &lt;<span class="o">=</span> 52<span class="p">;</span> w++<span class="o">))</span> <span class="c"># thực tế thì i = 15 là ngủm rồi, trâu 3^ mà</span>
<span class="k">do
    for</span> <span class="o">((</span>k <span class="o">=</span> 0<span class="p">;</span> k &lt;<span class="o">=</span> w <span class="o">&amp;&amp;</span> k &lt;<span class="o">=</span> 10<span class="p">;</span> k++<span class="o">))</span>
    <span class="k">do
        </span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$w</span><span class="s2"> </span><span class="nv">$k</span><span class="s2">"</span> | <span class="nb">cat</span> <span class="o">&gt;</span> input.txt
        <span class="nb">echo</span> <span class="s2">"checking"</span> <span class="nv">$w</span> <span class="nv">$k</span>
        ./check.sh             <span class="c"># là một script khác chạy hai code rồi diff</span>
        <span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> <span class="nt">-ne</span> 0 <span class="o">]</span>
        <span class="k">then
            </span><span class="nb">echo</span> <span class="s2">"******!!!!"</span> <span class="c"># hơi bực mình, censored ^^</span>
        <span class="k">fi
    done
done</span>
</code></pre></div></div>

<p>Mình rất bối rối vì chạy tới \(w=16\) rồi mà <code class="language-plaintext highlighter-rouge">diff</code> vẫn không báo sai. Không nhẽ mình trâu sai?<br />
Đọc lại đề, mình mới phát hiện ra… lại đọc nhầm đề rồi.</p>
<blockquote>
  <p>Bài K: The same panel cannot be highlighted during two consecutive weeks, except for the middle panel (B) […] can be highlighted during two consecutive weeks<span style="color:lightgray">, but not during three or more consecutive weeks. Mình đọc thiếu mất phần này rồi??????</span></p>
</blockquote>

<p>Lật đật sửa lại cả code full lẫn code trâu, <code class="language-plaintext highlighter-rouge">./bigcheck.sh</code> phát nữa cho chắc.<br />
<strong>[3:20]</strong> <strong style="color:green">AC</strong> bài K.</p>

<blockquote>
  <p>Bài E: Cho \(n \leq 10\) quân cờ, mỗi nước đi được ghi lại dưới dạng <code class="language-plaintext highlighter-rouge">ô 1 -&gt; ô 2</code>. Tìm dãy \(n-1\) nước đi có thứ tự từ điển nhỏ nhất, sao cho cả \(n-1\) nước đều ăn quân.</p>
</blockquote>

<p>Ban đầu mình tính DP kiểu gì đấy, nhưng sau tầm 2 phút thì mình nhận ra không thể tách đồ thị thành các cây. 5 phút sau linh cảm bảo mình rằng hoặc 
là không gian trạng thái nhỏ, hoặc nếu không gian lớn thì nhiều nghiệm nên nghiệm nhỏ nhất tới rất nhanh. Thế là quay lui thôi.</p>

<p>Để giảm thời gian duyệt thì phải tìm cách liệt kê nghiệm theo thứ tự, nên mình sắp xếp các quân cờ theo thứ tự từ nhỏ tới lớn. Ban đầu mình nghĩ có thể ép được lượt thứ \(i\) quân \(i\) ăn quân khác, nhưng sau đó chạy không ra nghiệm, vậy là buộc phải duyệt <code class="language-plaintext highlighter-rouge">for (killer) for (victim != killer)</code>.</p>

<p><strong>[4:02]</strong> <strong style="color:red">WA</strong> bài E.<br />
Bắt đầu ngồi đọc code xem thiếu chỗ nào, rồi là một mớ <code class="language-plaintext highlighter-rouge">cerr</code>, rồi là một mớ test nhỏ chạy thử. Mình sợ thứ tự duyệt của mình bị sai, nên thôi tìm tất cả nghiệm rồi so sánh lấy thằng có thứ tự nhỏ nhất.<br />
<strong>[4:22]</strong> vẫn <strong style="color:red">WA</strong> bài E.<br /></p>

<p>Sau khi đọc lại đề, mình mới nhớ ra: Xe, Tượng, Hậu không thể ăn quân <strong>nếu có quân khác chắn đường</strong>. Lại tốn thêm một vòng <code class="language-plaintext highlighter-rouge">for (mid != killer và victim)</code> để kiểm tra xem có quân nào cản đường không. Với bản tính vừa code vừa nghĩ thì mình sai logic khá nhiều lần:<br />
<strong>[4:42]</strong> <strong style="color:red">WA</strong> bài E.<br />
<strong>[4:47]</strong> <strong style="color:red">WA</strong> bài E.<br />
<strong>[4:48]</strong> <strong style="color:red">WA</strong> bài E.<br />
<strong>[4:49]</strong> <strong style="color:red">WA</strong> bài E.<br />
<strong>[4:54]</strong> <strong style="color:red">WA</strong> bài E, đổi lại logic chứ rối nhùi. Vẫn là tính chênh lệch hàng và cột giữa <code class="language-plaintext highlighter-rouge">victim</code> và <code class="language-plaintext highlighter-rouge">mid</code> so với <code class="language-plaintext highlighter-rouge">killer</code>, sau đó xét các trường hợp sau:</p>
<ul>
  <li>Nếu so hàng (hoặc cột), một cái \(=0\) và một cái \(\neq 0\) thì bỏ qua <code class="language-plaintext highlighter-rouge">mid</code>.</li>
  <li>Nếu so hàng (hoặc cột), một cái âm và một cái dương (tích âm) thì bỏ qua <code class="language-plaintext highlighter-rouge">mid</code></li>
  <li>Lúc này thì chắc chắn <code class="language-plaintext highlighter-rouge">victim</code> và <code class="language-plaintext highlighter-rouge">mid</code> cùng hướng, nếu <code class="language-plaintext highlighter-rouge">abs(d_mid) &lt; abs(d_victim)</code> thì tức là <code class="language-plaintext highlighter-rouge">mid</code> chen ngang.</li>
</ul>

<p><strong>[4:57]</strong> <strong style="color:red">WA</strong> bài E, nhận ra <code class="language-plaintext highlighter-rouge">for(mid)</code> nhưng không dùng <code class="language-plaintext highlighter-rouge">mid</code> tí nào vì gõ nhầm?<br />
<strong>[4:58]</strong> <strong style="color:green">AC</strong> bài E.<br /></p>

<h3 id="những-bài-còn-lại">Những bài còn lại</h3>
<p>Bài H đọc không hiểu đề lắm, chưa cài thử, nhưng có vẻ là Dijkstra \(d[u][prv]\)</p>

<h1 id="phân-tích">Phân tích</h1>
<h3 id="vấn-đề-cài-đặt">Vấn đề cài đặt</h3>
<p>Lỗi của bài F giống lỗi của bài L ở HCMC Regional vừa rồi; phương án giải quyết là <strong>để ý kỹ các edge case nhỏ</strong>, nhất là với \(n=1, 2\).</p>

<p>Bài D mình bị ám ảnh với sai số của số thực, chứ thực ra hàm <code class="language-plaintext highlighter-rouge">sqrt</code> không chênh tới mức đấy. Nếu sợ thì lần sau nên sửa thành <code class="language-plaintext highlighter-rouge">sqrtDelta = max(0, sqrt(delta) - 1)</code> để tránh âm và giảm kiểm tra.</p>

<p>Mình tự tin tư duy tổng quát hóa để cài đặt khá ổn – bài B, I, K và E code khá nhanh, cơ mà mấy cái phải <strong>casework thì chậm rì</strong>, không biết có phải vì không nháp kỹ ra để khỏi phải động não lúc cài rồi phải cài lại hay không.</p>

<p>Cuối cùng là hai quả <strong>đọc nhầm đề</strong>, dẫn tới việc phải debug rất nhiều, và thậm chí là phải sinh test. Cơ bản là đề dài, não lag, nên mình đọc lướt, cơ mà khoảng tầm 15-20% số bài là mình sẽ bỏ sót chi tiết. Cũng may là trình độ tiếng Anh của mình bây giờ không thể dịch nhầm nữa rồi, ghét CollegeBoard tư bản ăn chặn tiền học sinh nhưng phải cảm ơn nó đã tạo ra phần Evidence-Based R+W trong SAT.</p>

<h3 id="vấn-đề-chiến-thuật">Vấn đề chiến thuật</h3>
<p>Như các bạn có thể thấy, cứ mỗi khi bị cấn một bài cài đặt nặng, mình sẽ mắc kẹt rất lâu, ít nhất là 1 tiếng.</p>

<p>Hồi virtual luyện tập cho HCMC’25, có một lần cả team mình virtual với Đăng đề Seoul. Bỏ qua chuyện ngài ấy code khỏe vãi, thì trong khi mình bị phân tâm giữa 2-3 bài có thể giải được, ngài đơn giản là bám theo bảng điểm và tập trung từng bài một.</p>

<p>Mình nhiều khi không biết có nên hy sinh một tí cẩn thận lấy 2-3 phút penalty \(\times\) số bài hay không, máu hơi liều.</p>

<h3 id="về-đề-thi">Về đề thi</h3>
<p>Không rõ cả khu Bắc Mỹ mọi năm như nào, nhưng ít nhất với miền Đông năm nay, đề thi thiên hoàn toàn vào việc cài đặt, meta khác hẳn các đề thi của khu ĐNÁ-TBD chúng ta. Nhìn chung là hợp để luyện Leetcode.</p>

<p>Nếu xét độ khó thuật toán, mình không rõ 3 bài khó nhất như thế nào, nhưng 8 bài mà mình làm được chỉ ngang bài thứ 5-6 của APAC, bài H thứ 9 nếu đúng là Dijkstra thì sẽ là bài 6 HCMC’25.
Gần như không phải đụng tới cấu trúc dữ liệu, mấy bài tầm của mình thì chủ yếu là DP nhưng không quá khó để gọi hàm và xét chuyển trạng thái, nhận xét tính chất thì cũng không có nhiều, không có tí tham lam nào.</p>

<p>Tuy nhiên, các mô hình bài toán theo mình khá xấu, điển hình như: bài B xử lý input hơi rườm rà, bài K chỉ là gò công thức DP nhưng xử lý A C khác B + palindrome nên cài cũng cực, bài E xét quá nhiều trường hợp. Mình không biết nên đánh giá độ khó cài đặt như nào nhưng bài E ở trên cũng tương đương <a href="https://qoj.ac/contest/2673/problem/15469">bài I của Seoul’25</a>.</p>

<p>Nếu như ở APAC, giải được Leetcode Hard(est) không giúp bạn đứng được nửa trên bảng xếp hạng; thì Leetcode chỉ… chưa đủ để bạn thành công ở East Division, nhưng ít ra nó cũng giúp bạn phần nào trong việc luyện cách tư duy tổng quát hóa, lên giàn cấu trúc code.</p>

<p>Một trong những đặc điểm khác của đề thi là giới hạn đưa ra thường khá nhỏ, con số các bạn thường thấy sẽ vào khoảng 2-3 chữ số, thay vì ép giới hạn biến sát giới hạn thời gian như chúng ta thường thấy. Bài E mà ép như thường thấy thì kiểu 3 for trên còn bị TLE nữa chứ không chỉ WA.</p>

<h1 id="ghi-chú">Ghi chú</h1>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:asiapacific" role="doc-endnote">
      <p>Có lẽ là cách dịch chuẩn nhất của khu Asia Pacific, vì bình thường cụm “Châu Á – Thái Bình Dương” sẽ bao gồm toàn bộ châu Á. <a href="#fnref:asiapacific" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:tristate" role="doc-endnote">
      <p>Northeast, East Central, và <a href="https://en.wikipedia.org/wiki/New_York_metropolitan_area">Greater New York</a> <a href="#fnref:tristate" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:combined" role="doc-endnote">
      <p>Sau khi gộp cả ba Regional vào. Nếu tách riêng ra thì mình sẽ đứng ở vị trí 16/87 ở East Central, 9/97 ở Northeast, và 4/82 ở Greater New York. <a href="#fnref:combined" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><category term="cp" /><category term="icpc" /><summary type="html"><![CDATA[Chuyện là, ngài ấy rủ mình virtual một contest 5 tiếng.]]></summary></entry><entry><title type="html">[CP - Chiến] 2025/12/12 - The 2025 ICPC Asia HCMC Regional Contest (edited)</title><link href="https://zipdang04.github.io/cp/icpc/2025/12/20/hcmc25.html" rel="alternate" type="text/html" title="[CP - Chiến] 2025/12/12 - The 2025 ICPC Asia HCMC Regional Contest (edited)" /><published>2025-12-20T12:35:00+00:00</published><updated>2025-12-20T12:35:00+00:00</updated><id>https://zipdang04.github.io/cp/icpc/2025/12/20/hcmc25</id><content type="html" xml:base="https://zipdang04.github.io/cp/icpc/2025/12/20/hcmc25.html"><![CDATA[<h1 id="mở-đầu">Mở đầu</h1>
<p>Mình có thể không phải là người giỏi nhất (dù cũng từng có thời gian được đánh giá như vậy), nhưng chắc chắn là người có thể tạo ra những kỷ lục vô tiền khoáng hậu. Nếu ở THPT mình đã là người duy nhất tham dự cả 3 mùa HSGQG và THTTQ và đạt cùng một loại giải (you know what it is), thì đây là năm thứ 8<sup id="fnref:0" role="doc-noteref"><a href="#fn:0" class="footnote" rel="footnote">1</a></sup> mình từng tham dự một kỳ ICPC (và sẽ cố gắng nâng con số lên thành 10).</p>

<p>Năm nay, đội hình vẫn giữ nguyên. Điều duy nhất khác biệt là mình đã có cà phê hỗ trợ một phần, team đã có luyện tập nên có tí chiến thuật, và đứng sát ranh giới APAC hơn bao giờ hết.</p>

<p>Hôm nay, chúng ta sẽ cùng nhau mổ xẻ diễn biến phòng thi của team Hesll, và phân tích tại sao mình đã tuột tay nắm cửa của ICPC Asia-Pacific Championship *sầm*.</p>

<h1 id="diễn-biến">Diễn biến</h1>

<table>
  <thead>
    <tr>
      <th>Rank <strong>32</strong></th>
      <th>A</th>
      <th>B</th>
      <th>C</th>
      <th>D</th>
      <th>E</th>
      <th>F</th>
      <th>G</th>
      <th>H</th>
      <th>I</th>
      <th>J</th>
      <th>K</th>
      <th>L</th>
      <th>M</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>6</strong> bài</td>
      <td>+1</td>
      <td> </td>
      <td> </td>
      <td>+</td>
      <td>+</td>
      <td>-1</td>
      <td> </td>
      <td>-2</td>
      <td> </td>
      <td> </td>
      <td>+</td>
      <td>+3</td>
      <td>+13</td>
    </tr>
    <tr>
      <td><strong>1110</strong> phút</td>
      <td>223</td>
      <td> </td>
      <td> </td>
      <td>12</td>
      <td>19</td>
      <td> </td>
      <td> </td>
      <td> </td>
      <td> </td>
      <td> </td>
      <td>16</td>
      <td>202</td>
      <td>98</td>
    </tr>
  </tbody>
</table>

<p><strong>[0:00]</strong> Bắt đầu thời gian làm bài. 
Mình không đọc đề từ đầu, mà dành ra 2p đầu tiên để:</p>
<ul>
  <li>Đầu tiên là bật chức năng auto-save</li>
  <li>Tiếp theo là chỉnh lại đường dẫn trình biên dịch. Hôm thi Siêu CUP thì mình phát hiện ra ban Tổ chức config nhầm đường dẫn compiler C++ từ <code class="language-plaintext highlighter-rouge">/usr/bin/g++</code> thành <code class="language-plaintext highlighter-rouge">/usr/bin/gcc</code>, nên tính năng gợi ý code của IntelliSense hoàn toàn không hoạt động được, hôm nay chỉnh liền.</li>
  <li>Cuối cùng là gõ sơ bộ vài dòng template ban đầu.</li>
</ul>

<p>Cơ bản là đằng nào cũng chỉ có một mình mình code, nên:</p>
<ul>
  <li>Nếu mình đọc đề trước:
    <ul>
      <li>nếu chưa gặp được bài dễ mà đồng đội ném bài dễ sang thì mình tốn mấy phút đọc đề lãng phí + thời gian setup trước khi code</li>
      <li>nếu mình gặp bài không đủ dễ + mình lag thì toang penalty.</li>
    </ul>
  </li>
  <li>Thay vào đó, vài phút đầu tiên setup, giao hẳn bộ đề cho đồng đội sẽ không có thời gian thừa
    <ul>
      <li>khalachackeo tới lúc setup xong đã tìm ra bài để code luôn, với độ khó của Regional.</li>
      <li>tầm nửa giai đoạn đầu, solution sẽ được feed liên tục cho mình, mình chỉ cần việc code thôi.</li>
    </ul>
  </li>
</ul>

<p>Chiến thuật đấy giúp team mình luôn nằm trong top đầu bảng rank suốt một tiếng
đầu tiên, làm bàn đạp cho 4 tiếng tiếp theo. Ở Regional thì đề khó hơn nhưng
đoạn đầu feed 3 bài còn mượt hơn cả National.</p>

<h3 id="20-phút-đầu">20 phút đầu</h3>
<p>Đức nhìn thấy bài D dễ nhất, nên ném đề cho mình đọc.</p>
<blockquote>
  <p><strong>Bài D</strong>: Cho bảng trống \(n \times n\), điền các số sao cho có nhiều nhóm \(k\) ô liên tiếp theo chiều ngang hoặc dọc có tổng chia hết cho \(k\), với \(k \leq n\).</p>
</blockquote>

<p>Mình nghĩ ra ngay chuyện xếp liên tiếp (k số liên tiếp chia hết cho k) nhưng không biết offset như nào, hỏi Nana thì Nana bảo chỉ cần là cấp số cộng, nên làm luôn.<br />
<strong>[0:12]</strong> <strong style="color:green">AC</strong> bài D.</p>

<p>Tiếp theo thì Nana tóm tắt đề bài K, đơn giản là check xem biên bản ván đấu có chuẩn không.<br />
<strong>[0:16]</strong> <strong style="color:green">AC</strong> bài K.</p>

<p>Sau đó Nana vẽ một cái đồ thị và phán chỉ cần lo các cạnh nối giữa nhóm 1-2, 2-3, 3-4, 4-1.<br />
<strong>[0:19]</strong> <strong style="color:green">FIRST SOLVE</strong> bài E.</p>

<p><img src="/assets/2025-12-20-25hcmc/scoreboard_20m.jpg" alt="ái chà" />
<em><center>ngài Đăng chụp lại. hóa ra chúng tôi vô địch trong vòng 4 phút</center></em></p>

<h3 id="180-phút-kinh-hoàng">180 phút kinh hoàng</h3>
<p>Đầu tiên bọn mình tính đấm F với thuật tham lam chuyển hết B thành A. <br />
<strong>[0:47]</strong> <strong style="color:red">WA</strong> bài F. Sau một hồi thì cũng tìm được edge cases. Mình quyết định bỏ bài đấy, nhưng có hỏi Nana xem có luôn chuyển xâu về hoặc full xen kẽ <code class="language-plaintext highlighter-rouge">ABAB...</code>, hoặc full A (+B đầu/đuôi) hay không.</p>

<p>Sau đó thì có A và L.</p>
<blockquote>
  <p><strong>Bài AA</strong>: Cho \(n\) ụ nước \(a_1, a_2, \dots, a_n\) và hàm \(f(x)\), giá trị của cả hệ thống là \(\sum f(a_i)\). 
Lần lượt chọn ra hai ụ nước kề nhau tùy ý và gộp lại, hãy tìm cách gộp để mảng \(a\) còn đúng \(k\) ụ nước, sao cho giá trị của hệ thống là lớn nhất.</p>

  <p><strong>Bài L</strong> – một bài Interactive: Cho một danh sách liên kết đơn độ dài \(n\), nhưng liên kết của node cuối thay vì là <code class="language-plaintext highlighter-rouge">null</code> thì là một trong các node trước đó, tạo thành một chu trình. Ban đầu bạn đứng ở <code class="language-plaintext highlighter-rouge">node = head</code> và không biết trước \(n\) hay độ dài của chu trình, nhưng trước mỗi lượt di chuyển <code class="language-plaintext highlighter-rouge">node = node.next</code> bạn được phép đánh dấu vĩnh viễn node hiện tại. Xác định độ dài chu trình trong không quá \(3n\) lượt di chuyển.</p>
</blockquote>

<p>Không nhớ là làm AA hay làm L trước, nhưng cụ thể là như này:</p>
<ul>
  <li>L thì nhìn là biết sẽ có một cái marking pattern nào đấy, phase 1 cứ mark, tới khi thăm một ô marked thì sang phase 2 tìm chu trình. Có hai pattern trong đầu: theo 2 mũ, hoặc theo mod 3.</li>
  <li>A thì lúc đấy thấy nhiều đội làm được, mình nghĩ là thuật của AA sẽ dễ thôi – kiểu như tìm chênh lệch sau khi bỏ một cột, rồi sort lại. Đức bảo bài A này tìm kiếm nhị phân, cơ mà mình không tin lắm tại nhìn AA không quy về bài toán kiểm tra được.</li>
</ul>

<p>Lúc mình viết bài này thì mình không nhớ code AA trước hay L trước, nhưng nếu phải tận phút 135 mới có lần nộp bài tiếp theo thì chắc là code AA trước. Sai test ví dụ, mình nhờ Nana check công thức. Nana đưa ra một công thức khác, mình code theo, lại sai test ví dụ.</p>
<ul>
  <li>Thực ra lúc vẽ công thức ra đã thấy sai sai, hình như công thức không độc lập với từng cột.</li>
  <li>Cơ mà trong phòng thi mình cũng không tỉnh táo lắm, nên vẫn nghĩ thuật là như vậy.</li>
</ul>

<p>Thế là mình chuyển qua L. Có vẻ như trong phòng thi mình khá dở – mình không có check kỹ số câu được hỏi của ý tưởng chiến thuật, mà phang đại mod 3. <br />
<strong>[2:15]</strong> <strong style="color:gray">TLE</strong> bài L. <br />
<strong>[2:16]</strong> <strong style="color:red">WA</strong> bài L. <br /></p>

<p>Mình không nhớ mình lại tiếp tục đấm A hay tiếp tục cố chấp L, nhưng sau đó Nana đưa bài H và bảo là xóa cạnh lớn nhất.<br />
<strong>[2:37]</strong> <strong style="color:red">WA</strong> bài H. <br />
<strong>[2:38]</strong> <strong style="color:red">WA</strong> bài H sau khi sửa lại gì đấy. <br />
Mình phát hiện ra trường hợp sai là hình thoi siêu dài, khi đó đường đi không nằm trên bao lồi mà sẽ có đi chéo. Bảng điểm lúc đó rất ít đội làm được H, nên mình nghĩ đây là bài khó. Mình ném lại bài H cho Nana và tiếp tục debug bài L, nếu xong hết vẫn chưa có thuật thì mình sẽ nghĩ sau (xem phần <strong>Hesll có bỏ lỡ điều gì không?</strong>)</p>

<p>Mình quyết định test trâu bài L: đặt \(t = 100\), rồi thử hết các trường hợp \((n, l)\) từ \((1, 1)\) trở đi, vì mình biết nếu có tạch giới hạn \(3n\) thì chỉ tạch trong đống test nhỏ thôi. Đúng là sai thật, đầu tiên mình điều chỉnh về đánh dấu ngay ô đầu tiên – vẫn quá. Sau đó thì phát hiện ra mod 2 vẫn chơi được – mình sợ trường hợp ba ô liên tiếp ở đuôi nhưng có vẻ là không thể xảy ra (lag mà), sửa lại.</p>

<h3 id="55-phút-lấy-lại-bình-tĩnh">55 phút lấy lại bình tĩnh</h3>
<p><strong>[3:22]</strong> <strong style="color:green">AC</strong> bài L.</p>

<p>Lúc này đã có 17 đội AC bài H, nhưng một mớ đội AC bài A rồi. Mình quyết định đề Nana tiếp tục nghĩ thuật tham bẩn bài H, trong khi đó mình chuyển sang nghĩ bài AA vì có quá nhiều đội AC rồi.</p>

<p>Đoán xem tại sao Đức mới đọc đề đã biết A là tìm kiếm nhị phân nào? <br /> 
Đọc một chặp mới biết là đề yêu cầu một thứ hoàn toàn khác. Mình và Nana hiểu thành:</p>
<blockquote>
  <p><strong>AA</strong>: Giá trị của cả hệ thống là <strong>tổng</strong> của các hồ chứa. Hãy gộp các hồ chứa để làm tổng này <strong>lớn</strong> nhất.</p>
</blockquote>

<p>Trong khi nó phải là…</p>
<blockquote>
  <p><strong>A</strong>: Giá trị của cả hệ thống là <strong>max</strong> của các hồ chứa. Hãy gộp các hồ chứa để làm tổng này <strong>nhỏ</strong> nhất.</p>
</blockquote>

<p>Đọc kiểu gì nhìn thấy chữ max mà không thấy chữ min. Tìm min của max thì đúng tìm kiếm nhị phân thật, đúng là Đức rất giỏi nhận diện dạng bài. Sau tầm 1-2 phút ép thuật, mình bắt đầu code.<br />
<strong>[3:42]</strong> <strong style="color:red">WA</strong> bài A. Check lại code thì thấy đặt sai cận trên – đáp án \(\leq 2 \times 10^{17}\) nhưng mình để \(10^{12}\). <br />
<strong>[3:43]</strong> <strong style="color:green">AC</strong> bài A.</p>

<p>Hôm nay đọc lại đề mới nhớ là có một đoạn Nana phân tích bài I nữa, mình nghe thuật thấy cũng gần hợp lý. Tuy nhiên, xử lý DP hoán vị không tường minh bằng DP chữ số, hoán vị lặp như bài này càng khó hơn; cài có vẻ nặng trong khi mình cài yếu, với mình cũng không hiểu tường tận Nana đang nói gì – đang lag, nên mình quyết định bỏ qua luôn. Trong phòng thi có <a href="https://icpcvn.github.io/2025/regional/scoreboard.html">mỗi mình đội 193637</a> của Dế là AC bài này.</p>

<p>Cuối cùng thì mình quyết định làm M, vì bằng cách nào đó mà mình thấy mô hình của M dễ nghĩ hơn.</p>
<blockquote>
  <p><strong>Bài M</strong>: Cho danh sách \(n\) ma trận. Bạn được phép xóa hai ma trận \(p \times q\) và \(q \times r\) để thêm vào ma trận \(p \times r\). Tìm cách thực hiện một số phép nhân ma trận để tổng số phần tử các ma trận sau cùng lớn hơn tổng số phần tử của \(n\) ma trận ban đầu.</p>
</blockquote>

<p>Nhìn vào thì mình thấy ngay phải khử trùng để tránh một mớ bè từ ma trận \(n \times n\), số cạnh cuối cùng mình áng chừng quanh \(\mathcal{O}(n)\). 
Sau khi nhận ra thêm một chuỗi phép nhân ma trận là một đường đi thì mình tiến hành code… vì nghĩ rằng sẽ xử lý toàn bộ \(10^6\) đỉnh, mà Dijkstra trên \(10^3\) đỉnh ban đầu thì có vẻ hơi khoai, nếu WA tính sau.
Trước khi submit thì não mình tỉnh lại tí: “ơ kìa, phải là thà TLE thì sửa lại thuật khác sau, chứ WA \(\rightarrow\) TLE \(\rightarrow\) +2 đấm à?”, thế là sửa lại.</p>

<p><strong>[4:15]</strong> <strong style="color:red">WA</strong> bài M.<br />
<strong>[4:17]</strong> <strong style="color:red">WA</strong> bài M.</p>

<h3 id="45-phút-hoảng-loạn-cuối-cùng">45 phút hoảng loạn cuối cùng</h3>
<p>Mình bắt đầu hoảng “ơ đ* m* sao lại WA?” và bắt đầu ném vào một mớ <code class="language-plaintext highlighter-rouge">assert</code> để debug.</p>

<p><strong>[4:21]</strong> <strong style="color:red">WA</strong> bài M.<br />
<strong>[4:37]</strong> <strong style="color:red">WA</strong> bài M.<br />
<strong>[4:38]</strong> <strong style="color:red">WA</strong> bài M.<br />
<strong>[4:41]</strong> <strong style="color:red">WA</strong> bài M.<br />
<strong>[4:44]</strong> <strong style="color:red">WA</strong> bài M.<br />
<strong>[4:48]</strong> <strong style="color:red">WA</strong> bài M.</p>

<p>Đố các bạn lỗi nằm ở đâu?</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">bool</span> <span class="n">found</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-&gt;</span> <span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-&gt;</span> <span class="n">n</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="n">satisfied</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">found</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span> <span class="n">print</span> <span class="n">the</span> <span class="n">result</span><span class="p">;</span>
    <span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Sau khi sửa thành <code class="language-plaintext highlighter-rouge">not found and satisfied</code> và spam nhiều phát nữa:<br />
<strong>[4:54]</strong> <strong style="color:gray">TLE</strong> bài M.<br />
<strong>[4:54]</strong> <strong style="color:gray">TLE</strong> bài M.<br />
<strong>[4:56]</strong> <strong style="color:red">WA</strong> bài M.<br />
<strong>[4:57]</strong> <strong style="color:gray">TLE</strong> bài M.<br />
<strong>[4:57]</strong> <strong style="color:gray">TLE</strong> bài M.<br />
<strong>[4:58]</strong> <strong style="color:green">AC</strong> bài M.</p>

<p>Một lần nữa, lại là một pha AC phút 298.</p>

<h3 id="hesll-có-bỏ-lỡ-điều-gì-không">Hesll có bỏ lỡ điều gì không?</h3>
<p><strong>[1 ngày sau]</strong> Mình lên kênh Discord của VNOI tải đề về ngẫm.</p>
<blockquote>
  <p><strong>Bài H</strong>: Cho một bao lồi \(n\) đỉnh, tìm đường đi Hamilton ngắn nhất đi qua \(n\) đỉnh này.</p>
</blockquote>

<p>Đây là não mình trong phòng thi, ngay sau khi nghĩ cái edge case hình thoi:</p>
<ol>
  <li>maybe bài này có thể tham được, có thể là lần lượt thêm cạnh vào rồi xóa bớt gì đấy</li>
  <li>cơ mà nếu <em>như mọi bài chu trình tròn khác</em>, chắc phải nhân đôi số đỉnh trải ra mảng và vì thế khả năng cao là xử lý \((l; r)\) gì đấy.</li>
  <li>\(n \leq 3000\) thì khả năng cao là DP rồi, xử lý \((l; r)\) tức là các đỉnh đấy luôn nằm trên một vòng cung.</li>
  <li>ơ nhưng mà đầu mình <em>lag</em> quá, cái head đường đi ở đâu, \(l\) với \(r\) ở đâu như nào nhỉ?</li>
  <li>giờ còn A với L chưa làm, nghĩ thêm bài H hơi mệt. thôi cứ ném cho Nana, biết đâu lại có thuật tham nào đó.</li>
</ol>

<p>Sau khi nuối tiếc hơn một ngày trời, trên máy bay, mình bắt đầu đọc lại đề.</p>
<ul>
  <li>Mình vẫn tin là các đỉnh của đường đi sẽ nằm trên một vòng cung, nhưng nghĩ lại thì chắc gì?</li>
  <li>Đây là não mình của 15s sau:</li>
</ul>

<p><img src="/assets/2025-12-20-25hcmc/m_imagination.png" alt="ái chà" /></p>

<p>Hóa ra cái đuôi đường đi có thể là \(l\) hoặc \(r\), và bước tiếp theo <strong>bắt buộc phải là \(l-1\) hoặc \(r+1\)</strong>! Nếu chọn các điểm khác, các điểm còn lại bị chia thành hai phần, sang trái là không sang phải được nữa và ngược lại.</p>

<p>Mình mới réo lên với Đức (không nhớ nguyên văn đoạn hội thoại lắm):</p>
<ul>
  <li>H: Mày ơi, hóa ra bài H dễ vl mày ạ. &lt;đọc ra tính chất đường đi + công thức DP&gt;</li>
  <li>Đ: Ơ bạn Nana cũng ra được tính chất này nè</li>
  <li>H: uh… wtf?</li>
  <li>Đ: Nhưng mà lúc đó tao thấy mày đang cặm cụi code rồi.</li>
</ul>

<p>Ừ cũng đúng. Mấy ngày sau đó mình vẫn ngồi tiếc bài H, tại sao trong phòng thi đã thấy bảng điểm cũng không ít đội làm được nhưng thế đ* nào vẫn nghĩ bài này khó.</p>

<p>Mình có nghĩ “giờ bình tõm lại mày mới nghĩ được vậy chứ chắc gì trong phòng thi đã nghĩ ra?”, cơ mà nếu trên máy bay mình còn nhìn ra được trong 15 giây, thì trong phòng thi vẽ nháp kiểu gì cũng ra thôi, chưa kể là Nana nháp chill chill cũng ra được tính chất đó rồi – áp DP là xong.</p>

<p><strong>Mình chỉ không biết nếu mình code H trước thì đội có lên được 7 bài không, hay là vẫn 6 bài nhưng là H thay vì M…</strong> 
Chưa kể là các đội than bài M ép giới hạn bộ nhớ khá chặt, biết đâu lại hoảng hệt bài M vì MLE?</p>

<p>(update 2025/12/22) <a href="https://youtu.be/56SHuTzQN5c?si=O8KGRmarDhgOP4F2">Hôm nay mình có thử bấm giờ xem nếu mình làm bài H trong phòng thi thì sẽ như nào</a>. Sau khoảng tầm 30 phút đầu thì về căn bản mình đã cài đặt xong với mảng <code class="language-plaintext highlighter-rouge">dp[l][r][head]</code> với bộ nhớ \(10 \times (6000^2 \times 2) \approx\) 686MB, cơ mà vì từ đầu mình quyết định để <code class="language-plaintext highlighter-rouge">long double</code> 10 bytes dù sai số cho phép \(10^{-6}\) cũng không quá chặt, nên mình phải khai báo lại <code class="language-plaintext highlighter-rouge">dp[l][len][head]</code> – chiều thứ hai giảm còn một nửa để đủ giới hạn 512MB, nên phải tới phút 40 mới nộp bài.</p>

<p><img src="/assets/2025-12-20-25hcmc/h.png" alt="ái chà" /></p>

<p>12 phút sau đó mình chật vật với <strong style="color:#E0E000">RTE</strong>. Đấm đầu tiên thì sai thật, tại mình đổi cách gọi chiều DP nhưng quên sửa lúc truy gốc đáp án. Đấm thứ hai trở đi là thuần <strong style="color:#E0E000">MLE</strong>, nhưng theo <a href="https://ccs-specs.icpc.io/2023-06/ccs_system_requirements#judge-responses">quy chuẩn của ICPC</a> thì sẽ quy về <strong style="color:#E0E000">RTE</strong> hết. Mình không biết điều đấy, với lại với tính toán ở trên thì mình vẫn qua được giới hạn bộ nhớ, nên mình check trường hợp tràn mảng bằng cách sinh ra hai test \(n = 3000\) mà vẫn thấy code chạy ổn. Mình mới nghi ngờ là thực ra bộ nhớ mình hơi lớn quá, đổi lại thành <code class="language-plaintext highlighter-rouge">double</code> thì <strong style="color:green">AC</strong>.</p>

<h3 id="một-số-bài-khác">Một số bài khác</h3>

<h1 id="phân-tích">Phân tích</h1>
<p>Vẫn như mọi năm, một tiếng đầu thể hiện khá ổn. Năm nay thậm chí có cả chuyện Nana đọc thuật xong first solve bài E. Mình nghĩ chiến thuật dưới đây khá ổn, năm sau mình sẽ áp dụng tiếp, các đội ở tầm trung có thể tham khảo:</p>
<ul>
  <li>Một người (A) ngồi máy setup ngay từ đầu, <strong>hoàn toàn không động vào đề</strong>. Chú ý check kỹ:
    <ol>
      <li>Thiết lập của compiler trong IDE</li>
      <li>Thiết lập của IDE</li>
      <li>Gõ template và các script cần thiết</li>
    </ol>
  </li>
  <li>Hai người còn lại (B và C) gỡ đinh ghim và chia đôi đề, đọc đề và chọn ra (những) bài dễ nhất, setup xong thì đọc thuật code luôn.
    <ul>
      <li>Thường thì sẽ rất nhanh chóng chọn được 1-2 bài như thế.</li>
    </ul>
  </li>
  <li>Hết giai đoạn vài chục phút đầu thì tùy, nhưng nhìn chung thì B và C nên xác định cách chia phần đề còn lại cho A, và nhìn bảng điểm để chọn bài tiếp theo (nếu là đội bám đuổi).</li>
</ul>

<p>Tuy nhiên, sau đó vỡ trận, đến từ mấy lỗi sau:</p>
<ol>
  <li>Chưa hoàn tất suy nghĩ đã bắt tay vào code.
    <ul>
      <li>Bài L đáng nhẽ phải đảm bảo giới hạn \(3n\) trước khi cài đặt, và test kỹ các trường hợp nhỏ.</li>
      <li>Bài M cũng tương tự, mình bị TLE vì sau khi cài một chặp mình mới phát hiện ra chỉ cần Dijkstra \(n\) lần thay vì ném hết cả \(n\) đỉnh ban đầu vào Dijkstra; chưa kể quả lỗi thiếu break.</li>
    </ul>
  </li>
  <li>Não đứng, dẫn tới việc:
    <ul>
      <li>Không quản lý được các biến đối với những bài code dài, dẫn tới bug sml</li>
      <li><span style="color:lightgray">Rất may là năm nay không bị, nhưng với các năm trước, trong đầu nhìn ra idea nhưng mất rất lâu để case work, hoặc thậm chí không triển khai được thành thuật toán cụ thể.</span> Nhưng năm nay vẫn bị đứng khá lâu ở bài A (một phần do đọc lộn đề).</li>
    </ul>
  </li>
  <li>Tâm lý phòng thi chưa vững
    <ul>
      <li>Lỗi số 1 có lẽ tới từ việc sợ bị thiếu thời gian.
        <ul>
          <li>Lúc virtual, dù là đánh team hay tự luyện thì luôn trong tình trạng code không kịp nghĩ.</li>
          <li>Nhưng sau này, lúc làm <a href="/cp/icpc/2025/12/18/swerc25.html">SWERC’25</a> với tâm thế thoải mái thì có vẻ ổn.<br />
  \(\Rightarrow\) Cần tính kỹ lại chiến thuật.</li>
        </ul>
      </li>
      <li>Không bình tĩnh xử lý bài M khi thấy WA thay vì TLE
        <ul>
          <li>Đúng là bài M khó sinh ra test hai nghiệm để bắt lỗi sai đấy</li>
          <li>Đáng nhẽ nên đọc kỹ code một lượt thay vì một mớ assert.</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Chưa có kinh nghiệm/chiến thuật cho những tình huống đã xảy ra trong phòng thi vừa rồi
    <ul>
      <li>Bị stuck 3 tiếng đồng hồ liền.</li>
      <li>Không dứt khoát làm một việc, bị luân phiên (debug bài L và nghĩ bài A) nên quá tải.</li>
      <li>Underrate bản thân quá đáng, dẫn tới việc không dám dành thời gian suy nghĩ bài H.</li>
    </ul>
  </li>
</ol>

<p>Chuyện tránh <code class="language-plaintext highlighter-rouge">break</code> thiếu thì có lẽ nên thử hai quả sau:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">bool</span> <span class="n">found</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-&gt;</span> <span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-&gt;</span> <span class="n">n</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="n">satisfied</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">found</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span> <span class="n">print</span> <span class="n">the</span> <span class="n">result</span><span class="p">;</span>
    <span class="k">goto</span> <span class="n">abc</span><span class="p">;</span>
<span class="p">}</span>
<span class="nl">abc:</span>
</code></pre></div></div>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-&gt;</span> <span class="n">n</span><span class="p">)</span> <span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-&gt;</span> <span class="n">n</span><span class="p">)</span> <span class="k">if</span> <span class="p">(</span><span class="n">satisfied</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">found</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span> <span class="n">print</span> <span class="n">the</span> <span class="n">result</span><span class="p">;</span>
        <span class="k">throw</span> <span class="n">something</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="n">something</span><span class="p">);</span>
</code></pre></div></div>

<p>Với việc bài H bị RTE thì hôm thử máy mình nên thử hết các trường hợp sau:</p>
<ol>
  <li><strong style="color:#E0E000">MLE</strong> – có báo lượng bộ nhớ hay không</li>
  <li><strong style="color:#E0E000">OLE</strong> – báo ra gì (cơ mà tốt nhất nên xóa hết <code class="language-plaintext highlighter-rouge">cerr</code> rồi code)</li>
</ol>

<h1 id="tâm-sự">Tâm sự</h1>

<p>Bà con thấy cấn thì xí xóa hen, sợ là spam hơi nhiều về chuyện trầm cảm.</p>

<p>Hơn bốn năm qua, mình chật vật với mớ vấn đề tâm lý tâm thần mà mình chưa đi chẩn đoán bao giờ. Chưa đi khám đàng hoàng, chưa giải quyết xong, thì lại thấy đồng trang lứa và đàn em dần dần đi lên: không kể tới chuyện Lập trình thi đấu, đứa thì kiếm được báo, đứa thì tốt nghiệp sớm, đứa thì kiếm job ngon lành, gần như đứa nào cũng học được thứ gì đó hay ho và thực chất (đọc blog jalsol mình ghen tị vcl); trong khi mình thì vẫn cứ suốt ngày nằm nhà trầm cảm, rồi procrastinate, và chả học hay làm được gì mới mẻ hay ho<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">2</a></sup>, để rồi chững lại không phát triển được, suốt ngày phải tự hỏi “4 năm qua mình đã làm cái quái gì vậy?”.</p>

<p>Cơ mà năm nay cũng dần xử lý được một phần vấn đề rồi. <br />
Thế là nhẹ người, cải thiện được nhiều thứ:<br /></p>
<ul>
  <li>Có viết nhiều thứ viết blog hơn, dù lịch vẫn còn tùy hứng.</li>
  <li>Biết nói từ chối nhiều hơn để không đẩy mình vào thế khó, dù đôi khi bằng cách im lặng…</li>
  <li>Nhưng không im lặng khi đã nhận việc nữa (vẫn còn delay)</li>
  <li>Đã có lại sức để <em>tự giác</em> bản thân luyện tập, và thậm chí là cù cả đội đi training.</li>
  <li>Đã bắt đầu có thói quen review tất cả mọi thứ. (học từ ltpq)</li>
</ul>

<p>Năm nay cũng làm nhiều thứ mới phết:</p>
<ul>
  <li>Bước đầu nhúng tay vào NCKH nè, có hẳn giải Nhì khoa với giải Ba trường.</li>
  <li>Hoàn thành biên soạn bộ tài liệu chuyên đề nè: trì hoãn ba năm làm tài liệu về Số học và Tổ hợp, thì giờ mới xong… chuyên đề Đồ thị(???)</li>
  <li>Làm chủ tọa cho một hội đồng MUN nè.</li>
  <li>Nghĩ được quả bài Interactive đầu tiên nè, mình ưng ý mô hình đề bài vl nhưng mỗi tội vì sợ đề dễ nên không chia subtask rõ nhưng thành ra không ai giải được không ai giải được trong chung kết LQDOJ Cup 2025 nè.</li>
  <li>Lên kế hoạch tác chiến cho ICPC năm nay nè, có quả First Solve E đỉnh vãi.</li>
  <li>Cài đại Jekyll để có con blog này nè.</li>
</ul>

<p>Nên mình bắt đầu tin vào năng lực của bản thân hơn, với bây giờ (tính tại thời điểm viết bài) mình còn hai cơ hội<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">3</a></sup> để vào Championship và thậm chí là World Finals mà, nếu đủ kỷ luật để chăm chỉ luyện tập.</p>

<p>Cơ mà mình vẫn còn dễ bị breakdown (ngay trước khi đi SG bị một phát nè), với lại mình còn nhiều thứ khác phải làm – all-in vào ICPC thế còn dự định học cao học thì sao? Nên mình muốn hoàn thành tâm niệm cuối cùng, dứt điểm chuyện thi đấu này càng sớm càng tốt, để tập trung vào việc kiếm intern và học nghiên cứu khoa học.</p>

<p>Thành ra, kỳ này mình quyết định all-in vào ICPC (tới mức suốt ngày ngồi ở Tiny Cafe Nguyễn Ngọc Vũ chứ không thèm đi học), mặc dù biết với điều kiện hiện tại thì điều đó quá nguy hiểm: mình thừa biết xác suất được đi tiếp không cao vì thời gian luyện tập không đủ, nếu thất bại thì vừa tụt GPA vừa quay về trạng thái breakdown một lần nữa (thành công thì chỉ tụt GPA thôi). Điều duy nhất mình có thể làm ngoài luyện tập thật nhiều là tự kỷ ám thị “mày làm được” thay vì “nhỡ tạch thì sao” như hồi cấp 3.</p>

<p>Kết quả như mọi người đã thấy. Mà thực ra toàn bộ dấu hiệu ngay trước khi mình lên máy bay đều cho thấy team mình sẽ tạch: virtual cả team (Yokohama’24, Seoul’25, Taichung’25) ở các Regional khác trong Asia-Pacific thì luôn đứng ngay dưới cut-off, virtual cá nhân (Bangkok’25 và Jakarta’25) thì luôn bị choke/quá tải nên thọt. Mặc dù đã có cà phê chống đù, nhưng với khối lượng của một Regional, mình vẫn lag và quá tải từ virtual tới lúc thi thật.</p>

<p>Tuy nhiên, mình bất ngờ là sau đợt đi Sài Gòn này thì mình lại không rơi vào trạng thái trầm cảm muốn 0x2C một lần nữa, mình chỉ buồn một chút thôi. Có lẽ là vì mình thua sát nút chứ không đứng quá xa, có thể nói là thua do sai chiến thuật chứ không phải chỉ vì choke nặng như các năm trước, và mình còn năm sau để gỡ, nên mình tràn trề hy vọng chứ không quá suy nữa.</p>

<p>Để xem năm sau như nào, giờ thì training đàng hoàng thôi.</p>

<p>Cuối cùng, mình cảm ơn Nana vì đã là một cánh tay đắc lực trong team, và cảm ơn Đức vì đã support tinh thần tao trong suốt 4 năm qua. Em (và cả đội) cảm ơn cô Yến, thầy Dũng và thầy Minh đã đồng hành và hỗ trợ đội tuyển trong mấy tháng vừa rồi, và chấp thuận cho em xuyên 2 đêm giải sầu sau khi thi ạ ^^</p>

<h3 id="xàm-xí-thêm-tí">Xàm xí thêm tí</h3>
<p>Mình cứ có cảm giác là đề HCMC năm nay dễ hơn so với các regional khác, nhưng có vẻ nó chỉ đơn giản là các bài tầm trung meta hợp với mình hơn thôi:</p>
<ul>
  <li>Bảng điểm năm ngoái nhiều bài hơn</li>
  <li>Các team đi các regional khác thọt HCMC dù rank khá cao ở nước ngoài: PTIT, FPT thua mình; UIT.KHQ.JobSeekers không biết phải seed 1 không nhưng thua hai team UIT khác.</li>
</ul>

<p>Năm nay chụp hơi ít ảnh, không tận hưởng được mấy vì hơi tự áp lực bản thân. Cơ mà cũng đi chơi nhiều nơi, có hai hôm xuyên đêm uống cocktail + tám xàm ngoài công viên, chill vãi.</p>

<p>HCMC Metro &gt; Hanoi Metro, cụ thể là HCMC 1 &gt; HN 3 &gt; HN 2A. Nhìn tuyến 2A Cát Linh-Hà Đông với tuyển 3 Nhổn-Ga Hà Nội đã thấy cách biệt về ngôn ngữ thiết kế rồi, đi Sài Gòn xong mới thấy ngán ngẩm với anh Tàu hơn nữa.</p>

<h1 id="ghi-chú">Ghi chú</h1>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:0" role="doc-endnote">
      <p>Năm lớp 9 có đi ké team LQĐ-ĐN để thi National’18 (tại có một anh nghỉ, quy định là không cho thế người nhma không ai biết hihi), không code nhưng mình nhớ là có một bài góp idea bè 3 đỉnh. <a href="#fnref:0" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:1" role="doc-endnote">
      <p>Thực ra là cũng làm được nhiều thứ hay ho phết, chạy LQDOJ Cup rồi OLP MTTN rồi H3T, rồi làm chủ tọa MUN nữa. Nhưng đúng là chuyên môn thì không học được gì mới thật, trừ năm ngoái đi NCKH (và vẫn procrastinate, tới giờ vẫn chưa nộp kết quả cho thầy nữa). Thực tế thì ai cũng thấy mình chững mà, ít ra vẫn còn tự tin mình có năng lực mà còn cơ hội phát triển tiềm năng, chứ chưa ngủm dưới đáy sông, là may lắm rồi. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>“A qualifying contest is one that allows teams to be promoted to a higher level and which is supervised by faculty” – ICPC bảng Không chuyên có vẻ không được tính vào vì nó độc lập với hệ thống chính nên được xem là không có cơ chế promote từ National lên World Finals? <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name></name></author><category term="cp" /><category term="icpc" /><summary type="html"><![CDATA[Mở đầu Mình có thể không phải là người giỏi nhất (dù cũng từng có thời gian được đánh giá như vậy), nhưng chắc chắn là người có thể tạo ra những kỷ lục vô tiền khoáng hậu. Nếu ở THPT mình đã là người duy nhất tham dự cả 3 mùa HSGQG và THTTQ và đạt cùng một loại giải (you know what it is), thì đây là năm thứ 81 mình từng tham dự một kỳ ICPC (và sẽ cố gắng nâng con số lên thành 10). Năm lớp 9 có đi ké team LQĐ-ĐN để thi National’18 (tại có một anh nghỉ, quy định là không cho thế người nhma không ai biết hihi), không code nhưng mình nhớ là có một bài góp idea bè 3 đỉnh. &#8617;]]></summary></entry><entry><title type="html">[CP - Luyện] 2025/12/18 - SWERC’25</title><link href="https://zipdang04.github.io/cp/icpc/2025/12/18/swerc25.html" rel="alternate" type="text/html" title="[CP - Luyện] 2025/12/18 - SWERC’25" /><published>2025-12-18T14:00:00+00:00</published><updated>2025-12-18T14:00:00+00:00</updated><id>https://zipdang04.github.io/cp/icpc/2025/12/18/swerc25</id><content type="html" xml:base="https://zipdang04.github.io/cp/icpc/2025/12/18/swerc25.html"><![CDATA[<h1 id="xàm-xí">Xàm xí</h1>
<p>Sau thất bại ở HCMC, mình tiếp tục với đam mê bằng <a href="https://codeforces.com/gym/106225/">SWERC’25</a>.</p>

<p>Đây là khu vực của ngài Đăng (2 HCV IMO, cựu teammate HUS.WFKC, thành viên team ENS Ulm 3 trên BXH).</p>

<p>Meta đề khá hợp với mình: thuật tường minh, nhận xét không quá khó, code ngắn. Đưa bộ đề này vào đánh ở APAC, bảng rank chắc cao hơn tí.</p>

<h1 id="diễn-biến">Diễn biến</h1>

<table>
  <thead>
    <tr>
      <th>Kết quả</th>
      <th>A</th>
      <th>B</th>
      <th>C</th>
      <th>D</th>
      <th>E</th>
      <th>F</th>
      <th>G</th>
      <th>H</th>
      <th>I</th>
      <th>J</th>
      <th>K</th>
      <th>L</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>8</strong> bài</td>
      <td>+</td>
      <td>+</td>
      <td>+</td>
      <td>+1</td>
      <td>+</td>
      <td>+</td>
      <td> </td>
      <td> </td>
      <td> </td>
      <td>+2</td>
      <td> </td>
      <td>+3</td>
    </tr>
    <tr>
      <td><strong>1171</strong> phút</td>
      <td>33</td>
      <td>96</td>
      <td>207</td>
      <td>37</td>
      <td>221</td>
      <td>49</td>
      <td> </td>
      <td> </td>
      <td> </td>
      <td>134</td>
      <td> </td>
      <td>274</td>
    </tr>
  </tbody>
</table>

<p><strong>[0:00]</strong> Đọc đề bài A. Thấy cũng ngon ăn nên bắt tay vào làm luôn.</p>
<ul>
  <li>Quy về mảng đếm, sau đó sử dụng một <code class="language-plaintext highlighter-rouge">set</code> và một <code class="language-plaintext highlighter-rouge">map</code> để lần lượt quản lý các giá trị \(=0\) và \(&gt;1\).</li>
  <li>Hơi vội vàng trong việc xử lý logic nên có xóa đi code lại.</li>
</ul>

<p><strong>[0:33]</strong> Sau khi nộp lần 1 thì phát hiện ra quên xóa debug, nộp lần hai thì <strong style="color:green">AC</strong> bài A ở cả hai lần nộp. Nhìn bảng điểm thấy D, E, F nhiều đội làm được, tiến hành đọc đề D trước.</p>

<p><strong>[0:37]</strong> Sau khi <strong style="color:red">WA</strong> vì quên mất \(0 \leq a_i\) thì mình đã bổ sung để <strong style="color:green">AC</strong> bài D. <br /> 
Nhìn thấy bài E công thức hơi rườm rà (???) thì mình quyết định làm F</p>

<p><strong>[0:49]</strong> <strong style="color:green">AC</strong> bài F. Lúc này thấy các đội làm B và J nhiều, mình quyết định xử lý B trước.</p>
<ul>
  <li>Ban đầu mình cho ra hai nhận xét sau:
    <ul>
      <li><strong>Nhận xét 1</strong>: Nếu chọn cược \(p \leq a_i\) thì dù \(p\) có là bao nhiêu, số điểm tăng lên vẫn là \(a_i - p\); tương tự với cược \(p \geq a_i\). Suy ra ta sẽ ưu tiên cược \(\leq\) cho \(a_i\) lớn và \(\geq\) cho \(a_i\) nhỏ.</li>
      <li><strong>Nhận xét 2</strong> (thừa): Nếu \(l \geq a_i\) hoặc \(r \leq a_i\), ta luôn chốt cược như vậy.</li>
    </ul>
  </li>
  <li>Mình loay hoay với việc chọn cái nào cược \(\geq\) cái nào cược \(\leq\), mình phát hiện ra hai nhận xét nữa:
    <ul>
      <li><strong>Nhận xét 3</strong>: Đại khái là nếu để đảm bảo điểm tăng dù \(p\) thay đổi như nào, giả sử mảng \(a\) tăng dần, cứ cược \(\geq a_i\) và \(\leq a_j\) với \(i&lt;j\) để đảm bảo số điểm tăng lên \((a_j-p)+(p-a_i)=a_j-a_i\).</li>
      <li><strong>Nhận xét 4</strong>: Sau khi chốt cược, tổng số điểm nhận về có dạng \(Y + Xp\) là hàm bậc nhất của \(p\), nên cực tiểu buộc phải nằm ở \(p=l\) hoặc \(p=r\). Cụ thể hơn, nếu \(X&lt;0\) thì cực tiểu tại \(p=r\) và ngược lại \(X &gt; 0\) thì cực tiểu ở \(p=l\).</li>
    </ul>
  </li>
  <li>Đến khi ra được NX4 thêm vài phút nữa thì mình quyết định duyệt \(X = -n \rightarrow n\).
    <ul>
      <li>Không mất tính tổng quát, giả sử \(X &lt; 0\):
        <ul>
          <li>Lhi đó chúng ta chọn \(X\) giá trị \(a_i\) lớn nhất để cộng vào \(Y\).</li>
          <li>Phần còn lại, từ nhận xét 3 suy ra cứ chia đều cho cả hai loại cược thì \(Y\) luôn tăng mà \(X\) không bị thay đổi.</li>
          <li>Vì thế, ta sẽ chọn ra \(X^+\) giá trị lớn nhất và \(X^-\) giá trị nhỏ nhất của mảng \(a\), sao cho \(X^+ + X^- = n\) và \(X^+ - X^- = X\), lấy hết hoặc có thể lẻ một phần tử.</li>
          <li>Vì đã giả sử mảng \(a\) tăng dần, tổng cần tính là một đoạn liên tiếp \(\Rightarrow\) dùng mảng tổng tiền tố</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<p><strong>[1:36]</strong> <strong style="color:green">AC</strong> bài B in one blow. Sau khi đọc C không có ý tưởng gì, và nghĩ sơ bài E vẫn lag thì mình đi kiếm <strong>J</strong>ob.</p>
<ul>
  <li>DP khá cổ điển: <code class="language-plaintext highlighter-rouge">dp[iB][iA]</code> có thể tạo bởi một trong hai hoặc cả hai trường hợp sau:
    <ol>
      <li><code class="language-plaintext highlighter-rouge">dp[iB-1][iA-1]</code> nếu <code class="language-plaintext highlighter-rouge">a[iA] == b[iB]</code></li>
      <li><code class="language-plaintext highlighter-rouge">dp[iB-1][?]</code> nếu <code class="language-plaintext highlighter-rouge">b[iB]</code> tính bằng cách gộp một đoạn</li>
    </ol>
  </li>
  <li>Câu hỏi là gộp một đoạn như nào?
    <ul>
      <li>Mình tưởng sẽ phải xem thử mỗi đoạn \((l,r)\) gộp ra số gì, cơ mà có vẻ có khả năng gộp được ra khá nhiều số</li>
      <li>Vãi cả <strong>nhận xét</strong>: mọi đoạn \((l;r)\) đều có thể gộp ra mọi số \(x\) thỏa mãn \(1 \leq x \leq r-l+1\)</li>
    </ul>
  </li>
</ul>

<p><strong>[2:06]</strong> <strong style="color:red">WA</strong> bài J. Mình không biết vì sao sai nên sửa bậy trường hợp cơ bản <code class="language-plaintext highlighter-rouge">f[0][0] = true</code> thành <code class="language-plaintext highlighter-rouge">f[0][i bất kỳ] = true</code></p>

<p><strong>[2:07]</strong> <strong style="color:red">WA</strong> bài J ngay test 1. Sau một chặp thì mình phát hiện ra sai logic, cụ thể mình đã kết luận sớm \(f[iB][iA] \Rightarrow f[iB][iA+1]\), trong khi điều này chỉ đúng với trường hợp 2.</p>

<p><strong>[2:14]</strong> <strong style="color:green">AC</strong> bài J. Mình thấy G ngon ăn, đâm đầu vào nhưng không ra, sau đó nghĩ E vẫn lag nên mình quyết định thử C.</p>
<ul>
  <li>Lúc này mình mới nhận ra mình đọc thiếu điều kiện: \(p\) là <strong>hoán vị</strong>.</li>
  <li>Thế là chỉ cần tạo mảng <code class="language-plaintext highlighter-rouge">nxt</code> để dựng đồ thị hoán vị xong xử lý bậy bạ thôi.</li>
</ul>

<p><strong>[3:27]</strong> <strong style="color:green">AC</strong> bài C. Lúc này mới nhìn lại E</p>
<ul>
  <li>Thứ tự của <code class="language-plaintext highlighter-rouge">4</code> với <code class="language-plaintext highlighter-rouge">8</code> không quan trọng.</li>
  <li>Với một xâu độ dài \(l\) có \(c_8\) ký tự <code class="language-plaintext highlighter-rouge">8</code>, điểm \((x;y)\) sẽ được mở khóa nếu \(x+y \leq l+c_8\).</li>
</ul>

<p><strong>[3:41]</strong> <strong style="color:green">AC</strong> bài E. Nhìn bảng điểm thì ngoài G còn L, mình đọc L thử</p>
<ul>
  <li>\(f(t)\) rõ ràng bằng ký tự xuất hiện nhiều lần nhất, tính được bằng 26 mảng tổng tiền tố.</li>
  <li>Giả sử một trong số đó là \(c\). Các xâu \(LFS(t)\) không thể chồng lấn lên nhau, nói cách khác, \(c\) không thể xuất hiện 2 lần trong xâu này. Lý do là vì lần xuất hiện cuối của \(c\) không còn \(c\) nào nữa.</li>
  <li>Ta cần biết giữa hai lần xuất hiện liên tiếp của \(c\), phần xâu trùng dài nhất là bao nhiêu. Cái này làm trâu được, tổng độ phức tạp cho bước này là \(\mathcal{O}(n)\).</li>
  <li>Với mỗi truy vấn \((l; r)\), ta chỉ cần tìm lần đầu và lần cuối xuất hiện của \(c\), rồi lấy \(\min\) các phần xâu trùng đã tính bằng tìm kiếm nhị phân + một CTDL cây. Chú ý <strong>xâu cuối có thể tràn khỏi \(r\)</strong>.</li>
</ul>

<p><strong>[4:14]</strong> Mình dùng Sparse Table, ban đầu khai báo mảng <code class="language-plaintext highlighter-rouge">[26][19][5e5]</code> thế là <strong style="color:gray">MLE</strong></p>

<p><strong>[4:16]</strong> Chiều cuối cùng mình sử dụng <code class="language-plaintext highlighter-rouge">vector</code> thay vì mảng thường, vậy là thành <strong style="color:red">WA</strong>.</p>

<p><strong>[4:29]</strong> Ném một mớ <code class="language-plaintext highlighter-rouge">assert</code> để đảm bảo code không bug, vẫn thành <strong style="color:red">WA</strong>.</p>

<p><strong>[4:34]</strong> Mình không chú ý tới xâu cuối, chú ý xong thì <strong style="color:green">AC</strong> bài L.</p>

<p>Cuối cùng là bài G, bài mà mình tiêu tốn khá nhiều thời gian. Mình không giải được bài này trong phòng thi.</p>
<ul>
  <li>Ban đầu mình nghĩ tới việc chia thành các block \(b \approx \sqrt{250000}\), xếp block tuần tự từ nhỏ tới lớn, mỗi block xếp ngược lại. Code một script Python ngắn chạy thử, thấy cost toàn là \(10^7\) đồng.</li>
  <li>Sau đó mình mới nghĩ ra chuyện đưa về hệ nhị phân: ưu tiên các số lẻ \(+1\), rồi các số chia 2 không chia 4, rồi các số chia 4 không chia 8, … Mỗi block như vậy tốn 125000 đồng, tầm 8 block như vậy là hết sạch 1 triệu đồng, mà \(\lfloor\log_2(250000)\rfloor = 17\). Tối ưu một tí thì cost vẫn vào khoảng 1 củ rưỡi đồng.</li>
  <li>Mình có nghĩ tới việc chuyển sang hệ tam phân, cơ mà test thử cả tam lẫn tứ phân thì cost đều vượt quá.</li>
</ul>

<p>Hết giờ đọc solution thì BTC bảo dùng hệ… \(\sqrt[3]{250000} \approx 62\).</p>

<h1 id="nhận-xét">Nhận xét</h1>

<h3 id="điểm-cộng">Điểm cộng</h3>
<ul>
  <li>Nghĩ bài tập trung hơn, chi tiết ở mức đủ để code luôn.</li>
  <li>Code tương đối nhanh, bug ở mức chấp nhận được.</li>
</ul>

<h3 id="điểm-trừ">Điểm trừ</h3>
<ul>
  <li>Thứ tự nghĩ bài không phù hợp, ảnh hưởng tới pen
    <ul>
      <li>bài E dễ hơn lại nghĩ sau</li>
      <li>bài C cũng dễ nhưng không để ý chi tiết hoán vị.</li>
    </ul>
  </li>
  <li>Cần viết rõ công thức QHĐ + tối ưu trước khi code để tránh bug
    <ul>
      <li>Maybe dần dần bỏ thói quen vừa code vừa nghĩ?</li>
    </ul>
  </li>
  <li>Cần đọc kỹ đề hơn.</li>
</ul>

<h3 id="cần-học-thêm">Cần học thêm</h3>
<ul>
  <li>Hình học</li>
</ul>

<p>Tính viết học thêm về hệ cơ số, tại quả hệ 62-phân thì mình khá bất ngờ. Cơ mà nếu cho thêm 5 tiếng nữa thử nghiệm thì chắc là được, tại mình vẫn chưa khám phá kỹ chi phí của các hệ cơ số, chứ mình nghĩ kiến thức về hệ cơ số như vậy là ổn.</p>]]></content><author><name></name></author><category term="cp" /><category term="icpc" /><summary type="html"><![CDATA[Xàm xí Sau thất bại ở HCMC, mình tiếp tục với đam mê bằng SWERC’25.]]></summary></entry></feed>