یه راه حل دارم nlgn با سگمنت تری + sweep line ... راه آسون تر داره؟
2015-01-03 03:38:39 -0600 محمد مهدیاولین باره که به کاهو میای؟ راهنمای سایت رو حتما بخون!
یه سوال خوب دیگر ...............
وبسایت مسابقههای برنامه نویسی
یافتن کوتاه ترین دور در گراف ساده
کد مساله هشت وزیر با استفاده از الگوریتم ژنتیک
مرجع فارسی برای الگوریتم های هندسی و 2sat
نظریه اعداد لازم برای المپیاد کامپیوتری ها
برای مرحله سوم، تا چه سطحی باید برنامه نویسی بلد باشیم؟
اولین جمله از دنباله ی فیبوناچی که 1000رقم داشته باشد چیست؟
در این قسمت میتونی به یک پرسش پاسخ بدی. اگه میخوای در مورد پرسش بحث و اظهار نظر کنی از قسمت «ثبت نظر» استفاده کن.
پاسخت رو دقیق و کامل بنویس، از عکس استفاده کن و اگه لازمه به منابع (کتاب یا سایت) ارجاع بده.
اگه پرسش یا پاسخها مفید هستند حتما بهشون رای بده تا پرسشها و پاسخهای خوب مشخص بشن.
توی قسمت پیشنمایش میتونی ببینی متنی که نوشتی چجوری روی سایت دیده میشه.
خیلی مهم: برای اینکه به خط بعد بری باید دوتا Enter بزنی.
میتونی از تگهای معمولی و سادهی html هم استفاده کنی.
با دکمههایی که بالای ویرایشگر قرار دارند کلی کار میشه کرد. از عکسگذاشتن بگیر تا لیست شمارهدار. حتما امتحانشون کن.
برای نوشتن علائم ریاضی میتونی از Mathjax استفاده کنی.
راهنمای Mathjax رو از سایت
math.stackexchange
بخون.
برای نوشتن عبارت ریاضی وسط جمله، اون عبارت رو بین دوتا $ قرار بده.
برای نوشتن عبارت ریاضی تو یه خط جدید اون رو بین دوتا $$ قرار بده.
n تا از خانه های محور های مختصات دارای الماس هستند .
می خواهیم بیشترین ارزش یه معدن p . q را پیدا کنیم.
ورودی
اول p q رو میده (حداکثر 10000) (p طول ضلعی که موازی x هاست و q موازی y ها ; قابل چرخش نیست)
بعدش یه n میده (حداکثر 15000)
بعد x , y خانه های الماس دار رو میده (بین 30000- و 30000)
خروجی یه عدد که بیشترین ارزش معدن باشه
Timelimit : 0,40 s
و چیزی که سختش می کنه :)
Memory limit : 32 MB
وقتی حل شد برچسب ایده هاش رو اضافه می کنم
سوال خوبیه ارزش فکر کردن داره :)
مثال
2 3
12
0 0
1 1
2 2
3 3
4 5
5 5
4 2
1 4
0 5
5 0
2 3
3 2
خروجی : 4
یه راه حل دارم nlgn با سگمنت تری + sweep line ... راه آسون تر داره؟
2015-01-03 03:38:39 -0600 محمد مهدیسوال خوبی بود فقط جاج نداشتم .
برام تستر بنویسی ممنون میشم.
یکمم توضیح برای افزایش رضایت مندی :)
اول برحسب x ها sort کردمو که بتونم swipe line بزنم بعدش توی سگمنت یه خونه دارم که ارزش مزرعه ای که این گوشه چپ پایینشه .
بعد swipe line رو اینطور می زنم که الان از بازه ی k تا k +p دارم یعنی بعدش می شه k+1 و k+p+1 بعد تمامم الماس هارو روبازه ای که شامل این خونه میشوند(این تو معدشون قرار داره ) اضافه می کنند:
بعدش توی segment tree ماکسیمم رو هم دارم و بعد از این که swipe line ام یه دونه رفت جلو با ماکسمم جواب ماکسیمم می گیرم دقت کنید که اگه lazy نمیزدم تایم میشدم
در ضمن به ازای هر الماس(با ارزش +1) q تا جلوتر یه خونه با ارزش -1 گذاشتم که وقتی که الماسه رفت بیرون منفی اش میاد تو :|
بهتون پیشنهاد می کنم که حتما یه بار خودتون بزنید هم segment tree Lazy داره هم swipe line.
واقعن سوال خوبی بود. کد من رو هم تست کنی ممنون میشم!
راه حل همون راه تاکسیران هست ... فقط $nlgn$ هست و $lazy$ نداره.
برای اینکه راه بشه $nlgn$ و مستقل از مختصات ها بشه, اینکارو میکنیم : قبول دارین کلن $n$ تا $x$ داریم که تو کل برنامه ازشون استفاده میکنیم؟ (و همچنین $n$ تا $y$) $x$ ها رو میشه همون کاری که تاکسیران کرد (نقاط رو بر حسب $x$ سورت کنیم و بر حسب اون دونه دونه اضافه و حذف کنیم) $O(N)$ کرد. برای $y$ ها هم میتونیم همه ی این $y$ های بدرد بخور رو تو یه آرایه بریزیم و سورت کنیم و یونیک کنیم (عناصر تکراری رو حذف کنیم). برای کار با این خونه ها, هر وقت خونه ای با مختصات $y$ رو کار داشتیم کافیه رو اون آرایه هه باینری سرچ بزنیم تا پیداش کنیم!
ما برای انجام دادن این دو تا کار از سگمنت تری استفاده میکنیم : ۱. به تمامی اعضای بازه ی $[l, r)$ , مقدار $val$ رو اضافه کن. و ۲. بزرگترین عضو آرایه ؟
برای هر راس سگمنت تری, دو تا عدد نگه میداریم : مجموع $val$ هایی که به کل بازه اش اضافه کردیم و بزرگترین عضو در بین زیر درختش بجز خودش. بزرگی این راس هم میشه مجموع این دو تا عدداش. برای کار نوع ۱ کافیه عدد اولی بازه های لازم رو بروز کنیم و عدد دوم اجدادشون رو بروز کنیم و برای کار نوع ۲ هم بزرگی ریشه ی درخت رو خروجی بدیم! $^_^$
پی نوشت: دوستانی که با سگمنت تری و یا سویپلاین آشنایی کامل ندارن این ها منابع خوبی هستن :
سگمنت تری - کاهو
سویپ لاین - تاپکدر