حالت نمایش:
خانه مخازن و جزوات علمی وبلاگ مدرسه اخبار و اطلاعیه‌ها جشنواره خوارزمی برترین‌های تحصیلی انجمن علمی گفتگوی آنلاین ورود به حساب

فایل‌های پیوست، جزوات PDF، تصاویر و ویدیوها

1 فایل
دفترچه کدهای پیشرفته الگوریتم و گراف سمپاد.pdf
599 B · 2 ساعت پیش
README.md
رندر شده با Markdown سمپاد

مخزن جامع المپیاد کامپیوتر - الگوریتم‌های گراف و داده‌ساختارهای پیشرفته

معرفی مخزن

این مخزن آموزشی ویژه دانش‌پژوهان المپیاد کامپیوتر و علاقه‌مندان به برنامه‌نویسی رقابتی در دبیرستان استعدادهای درخشان علامه حلی ملارد گردآوری شده است. تمرکز کدهای این مخزن بر تحلیل مرتبه زمانی بهینه، پیاده‌سازی تمیز در شرایط مسابقه و رعایت استاندارد ++C20 می‌باشد.

سرفصل‌های اصلی مخزن:

  1. ساختارهای داده پیشرفته:
  2. درخت سگمنت (Segment Tree) با انتشار تنبل (Lazy Propagation)
  3. جدول اس‌تی (Sparse Table) برای پرس‌وجوی مینیمم بازه‌ای (RMQ) در زمان $O(1)$
  4. ساختار داده اتحاد-پیدا کردن (Disjoint Set Union) با بهینه‌سازی رتبه و فشرده‌سازی مسیر
  5. الگوریتم‌های بهینه گراف:
  6. الگوریتم دایکسترا با صف اولویت استاندارد و تحلیل $O((V+E)\log V)$
  7. الگوریتم تارجان (Tarjan) برای یافتن مولفه‌های قویاً همبند (SCC) و پل‌ها
  8. الگوریتم دینیک (Dinic) برای مسئله جریان بیشینه (Max-Flow) در زمان $O(V^2 E)$

جدول مقایسه مرتبه زمانی داده‌ساختارها

ساختار داده زمان ساخت پرس‌وجو (Query) به‌روزرسانی (Update) کاربرد اصلی
Segment Tree $O(N)$ $O(\log N)$ $O(\log N)$ جمع و مینیمم بازه‌ای پویا
Sparse Table $O(N \log N)$ $O(1)$ $O(N)$ پرس‌وجوی ایستا RMQ و GCD
Fenwick (BIT) $O(N)$ $O(\log N)$ $O(\log N)$ جمع پیشوندی با کدنویسی کم
DSU $O(N)$ $O(\alpha(N))$ $O(\alpha(N))$ بررسی همبندی و الگوریتم کروسکال

پیاده‌سازی استاندارد درخت سگمنت با پایتون ۳

class SegmentTree:
    def __init__(self, data):
        self.n = len(data)
        self.tree = [0] * (4 * self.n)
        if self.n > 0:
            self._build(data, 1, 0, self.n - 1)

    def _build(self, data, node, start, end):
        if start == end:
            self.tree[node] = data[start]
            return
        mid = (start + end) // 2
        self._build(data, 2 * node, start, mid)
        self._build(data, 2 * node + 1, mid + 1, end)
        self.tree[node] = self.tree[2 * node] + self.tree[2 * node + 1]

    def query(self, node, start, end, l, r):
        if r < start or end < l:
            return 0
        if l <= start and end <= r:
            return self.tree[node]
        mid = (start + end) // 2
        p1 = self.query(2 * node, start, mid, l, r)
        p2 = self.query(2 * node + 1, mid + 1, end, l, r)
        return p1 + p2

نکته المپیادی: در مسائل مرحله دوم، همواره ثابت زمانی حافظه و پدیده Cache Locality را مد نظر قرار دهید؛ بردار خطی معمولاً تا ۳ برابر سریع‌تر از ماتریس دو بعدی اشاره‌گری پردازش می‌شود.


برای دانلود کدهای کامل ++C و تست‌کیس‌های مرجع، از بخش فایل‌های پیوست بالای صفحه اقدام فرمایید.

دیدگاه‌ها، پرسش‌ها و نظرات دانش‌آموزان (3)

taha_safari
طاها صفاری ۲۲:۰۱ · 2 ساعت پیش

برای مسائل المپیاد مرحله دوم، مثال‌های بخش جریان بیشینه خیلی گره‌گشا هستند. ممنون از انتشار.

armin_khazaei
آرمین خزایی ۲۲:۰۱ · 2 ساعت پیش

تست‌کیس‌های لبه‌ای که اضافه کردی بسیار عالی بودن.

parsa_ebrahimi
پارسا ابراهیمی ۲۲:۰۱ · 2 ساعت پیش

سیدحسین جان پیاده‌سازی Segment Tree با Lazy Propagation فوق‌العاده تمیز و بهینه بود. خداقوت!