اولین باره که به کاهو میای؟ راهنمای سایت رو حتما بخون!

ورود ثبت‌نام راهنما درباره‌ی کاهو
پرسش‌ها برچسب‌ها کاربر‌ها سوال بپرسید!

آمار پرسش:

  • پرسیده شده: 2016-05-09 09:02:18 -0500
  • مشاهده شده: 365 بار
  • بروز شده: 2016-05-10 10:09:31 -0500

نکاتی در مورد نوشتن پاسخ:

در این قسمت می‌تونی به یک پرسش پاسخ بدی. اگه می‌خوای در مورد پرسش بحث و اظهار نظر کنی از قسمت «ثبت نظر» استفاده کن.
پاسخت رو دقیق و کامل بنویس، از عکس استفاده کن و اگه لازمه به منابع (کتاب یا سایت) ارجاع بده.
اگه پرسش یا پاسخ‌ها مفید هستند حتما بهشون رای بده تا پرسش‌ها و پاسخ‌های خوب مشخص بشن.

استفاده از ویرایشگر:

توی قسمت پیش‌نمایش می‌تونی ببینی متنی که نوشتی چجوری روی سایت دیده میشه.
خیلی مهم: برای اینکه به خط بعد بری باید دوتا Enter بزنی.
می‌تونی از تگ‌های معمولی و ساده‌ی html هم استفاده کنی.
با دکمه‌هایی که بالای ویرایش‌گر قرار دارند کلی کار می‌شه کرد. از عکس‌گذاشتن بگیر تا لیست شماره‌دار. حتما امتحان‌شون کن.

علائم ریاضی:

برای نوشتن علائم ریاضی می‌تونی از Mathjax استفاده کنی. راهنمای Mathjax رو از سایت math.stackexchange بخون.
برای نوشتن عبارت ریاضی وسط جمله، اون عبارت رو بین دوتا $ قرار بده.
برای نوشتن عبارت ریاضی تو یه خط جدید اون رو بین دوتا $$ قرار بده.

جمع اعداد متمایز بخش پذیر بر ۳ + کوئری

1

سلام . سوال اینه که یه آرایه از اعداد داریم و ۲ نوع کوئری

کوئری نوع اول میاد می گه که مقدار یکی از خونه های آرایه رو عوض کنیم . یعنی یه x و یه v بهمون می ده و خونه ی x ام آرایه , می شه v

کوئری نوع دوم هم میاد یه بازه بهمون می ده و می گه توی این بازه از آرایه ,جمع اعداد متمایزی که بر ۳ بخش پذیر هستن چنده

طول آرایه و تعداد کوئری ها کوچک تر مساوی با ۱۰ به توان ۵ هست

محدودیت زمانی هم ۶ ثانیه

اینم لینک سوال :

https://toph.ws/p/distinct-dishting

2016-05-09 09:02:18 -0500
دان م 61 ● 2 ● 3 ● 7
پاک‌کردن   ویرایش سوال
نظرات

به نظرم با یه سگمنت تری راحت حل میشه ولی بازم کدشو میزنم

2016-05-09 09:58:24 -0500 سیاوش

فقط حواستون باشه که اعداد متمایز رو می خوایم D:

2016-05-09 10:21:49 -0500 دان م

یکم که فکر میکنم خیلی سخت شد

باز اگه آرایه اولیه نداشت میشد یه کاریش کرد ولی الان اصلا ایده ای ندارم

2016-05-10 00:14:01 -0500 سیاوش

خوب اگر منظورتونو درست فهمیده باشم , شما می تونین توی آرایه ی اولیه همه ی اعداد رو 0 بذارین ... یکی یکی بیاین آپدیت کنین به مقدار اصلیشD:

2016-05-10 00:19:55 -0500 دان م

سخته چقد :))

2016-05-10 03:26:11 -0500 حمیدرضاه

1 پاسخ

3

یه کم زیاده، کم کم مینویسم که هینت هم باشه!

۱ـ میشه فرض کرد عددا از ۱ تا n+q هستن

۲ـ عددایی که به ۳ بخشپذیر نیستن، مهم نیستن پس به جاشون -۱ بذار. سوال میشه این: جمع اعداد نا منفی متمایز یه بازه چنده؟

۳ـ میشه دو بخش کرد ۲ رو. اول اینکه جمع اعداد نا منفی یه بازه رو بدست بیاریم، بعدش تکراری ها رو کم کنیم.

۴ـ بخش اول ۲ که بدیهیه

۵ـ برای بخش دوم: فرض کن k تا خونه آرایه برابر با x باشن. k - 1 تا بازه مینیمال بینشون وجود داره. به ازای هرکدوم این بازه ها که تو بازه [l, r] می افته، باید x تا از جواب کم کنیم.

۶ـ تعداد بازه هایی که تو ۵ بهشون اشاره کردیم، کلا از O(n+q) هست.

۷ـ یه دور برنامه رو ران کن، این بازه ها رو به ازای هر x در بیار. بعد برحسب L مرتبشون کن و یه سگمنت بساز که هر برگش، یه بازه برای یه x ای باشه.

۸ـ به ازای هر راس این سگمنته، یه فنویک بگیر که سایز اش برابر با تعداد برگ های زیرشه. بعد برگ های زیرش رو بر حسب R مرتب کن و هر خونه این فنویکه رو به یکیشون نسبت بده. خونه متناظر با بازه [l, r] و x برابر با ۰ هست اگر این بازه فعال نباشه. وگرنه برابر با x هست.

۹ـ حالا یه query رو که میخوای جواب بدی، جمع اعداد نامنفی بازشو حساب کن، بعد به ازای هر بازه ای که توی [l, r] می افته، مقداری که تو اون سگمنته بهش نسبت دادیم رو کم کن. چجوری؟ بازه ها تو اون سگمنته بر حسب L مرتب شدن، پس یه سری خونه متوالی تو اون سگمنته هستن که L اشون توی [l, r] می افته. برای یه راس سگمنت هم که میخوایم جواب بدیم، توی فنویک اون راس بازه ها بر حسب R مرتب شدن، L اشون هم که تو بازه [l, r] هست. پس از اول تا یه جایی از فنویکه، R بازه ها توی [l, r] هست. پس میشه جمعشون زد دیگه.

در کل تو اردر O(nlg^2) اجرا میشه. مموری هم از o(nlg)

2016-05-10 08:19:18 -0500
کسیمیدونه 31 ● 2
پاک‌کردن   ویرایش پاسخ
نظرات

صرفن می‌تونم بگم که خسته نباشی :|

2016-05-10 08:28:36 -0500 احسان

صبر داشته باش!!

2016-05-10 08:32:21 -0500 کسیمیدونه

ممنون D: اکسپت شد D:

2016-05-11 09:13:19 -0500 دان م

پاسخ شما

فقط در صورتی که پاسخی برای این پرسش دارید، آن را اینجا بنویسید و برای بحث کردن از قسمت «ثبت‌ نظر» استفاده کنید. شما می‌توانید قبل از وارد شدن به سایت پاسخ خود را بنویسید. این پاسخ ذخیره می‌شود و زمانی که شما وارد سایت شدید یا ثبت‌نام کردید منتشر می‌شود.

پیش‌نمایش:

کلیه‌ی حقوق این سایت متعلق به کمیته‌ی ملی المپیاد کامپیوتر است.