Editorial for Урт палиндром


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: admin

🔴 Editorial --- Kingdom Defense Planning (Сурагчдад ойлгомжтой тайлбар)

📖 Бодлогын зорилго

Бидэнд мод (tree) өгөгдөнө. Хот бүр үнэ цэнэтэй.

Бид яг K хот сонгоно.

👉 Нийт оноо: - Сонгосон хотуудын value нийлбэр - Хоорондын зай (distance)-г хасна


🧠 Энгийнээр ойлговол

  • Илүү их value авахыг хүснэ ✅
  • Гэхдээ хол байрласан хотууд penalty өгнө ❌

👉 Иймээс: "ойрхон, ашигтай хотуудыг сонгох"


❗ Яагаад хэцүү вэ?

Хэрвээ бүх хосыг шалгавал: - O(K²) болно ❌


💡 Гол санаа (хамгийн чухал!)

Tree дээр зайг edge бүрээр тооцож болно.

👉 Нэг edge (зам) авч үзье:

Хэрвээ: - нэг талд i хот - нөгөө талд j хот байвал

👉 penalty = i × j × w


🔥 DP санаа

dp[u][k] = u-ийн subtree-с k хот сонгох хамгийн их оноо


🔄 Merge хийх

Child-уудыг нэгтгэхдээ:

dp[u][i] + dp[v][j] - i × j × w


🌳 DFS ашиглана

dfs(u): dp[u] эхлүүлнэ child бүр дээр merge хийнэ


⚡ Яагаад optimization хэрэгтэй вэ?

Naive merge: → O(K²) ❌

👉 Small-to-large ашиглана: - жижиг vector-г том руу merge


🧪 Жишээ ойлголт

Хоёр хэсэг: - 2 хот - 3 хот

👉 хооронд penalty: 2 × 3 × w


⚠️ Алдаа гаргах магадлалтай

  • ❌ overflow (i × j × w)
  • ❌ merge буруу
  • ❌ dp хэмжээ хэтрэх

🎯 Хариу

dp[root][K]


🎓 Дүгнэлт

Энэ бодлогоор:

  • Tree DP
  • Merge
  • Optimization

сурна.

👉 Олимпиадын түвшний бодлого 🚀


Comments

There are no comments at the moment.