لینک‌های مفید برای شرکت در مسابقه:

راه‌حل‌ها و راهنمایی‌های نهایی اضافه شدند.
این راهنمایی‌ها را می‌توانید در انتهای سوالات مشاهده کنید.
. می‌توانید سوالات خود را از قسمت "سوال بپرسید" مطرح کنید.

جدی


  • محدودیت زمان:‌ ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

بابای حسنی به حسنی سوالی را داده و به او گفته تا این سوال را حل کند. اما چون حسنی زیاد علاقه‌ای به حل سوال ندارد، از شما خواسته تا این سوال را برای او حل کنید.

آرایه‌ای به نام aa به طول n n داریم. می‌خواهیم بلندترین زیردنباله‌ای از آرایه را پیدا کنیم که صعودی-نزولی باشد.

حسنی به دنباله b0,b1,...,bk1 b_0, b_1, ... , b_{k-1\ } صعودی-نزولی می‌گوید اگر سه شرط زیر برای آن برقرار باشد:

  • به ازای برای هر ii فرد که 0<i<k1 0 \lt i \lt k-1 داشته باشیم : bi1<bi>bi+1  b_{i-1} \lt b_{i} \gt b_{i+1} \
  • به ازای برای هر ii زوج که 0<i<k1 0 \lt i \lt k-1 داشته باشیم : bi1>bi<bi+1  b_{i-1} \gt b_{i} \lt b_{i+1} \
  • برای ii برابر با صفر هم داشته باشیم: b0<b1b_0 \lt b_1

حال شما باید طول بلندترین زیردنباله‌ای از آرایه aa که صعودی-نزولی است را پیدا کنید و آن را چاپ کنید.

نکته: به آرایه bb یک زیردنباله از آرایه aa می‌گوییم اگر بتوان با حذف تعدادی عضو از آرایه aa به آرایه bb رسید.

ورودی🔗

در اولین خط ورودی عدد nn و در خط بعدی nn عدد امده است که عدد ii ام مقدار خانه ii ام آرایه است. 1n100 000 1 \le n \le 100\ 000 ai109 |a_i| \le 10^9

خروجی🔗

در تنها خط خروجی طول بلندترین زیردنباله صعودی-نزولی را بگویید.

مثال🔗

ورودی نمونه ۱🔗

7
5 1 9 2 3 6 2
Plain text

خروجی نمونه ۱🔗

5
Plain text

برای مثال دنباله <1,9,2,3,2><1, 9, 2, 3, 2> یکی از جواب‌های ممکن است.

ورودی نمونه ۲🔗

4
1 2 1 2
Plain text

خروجی نمونه ۲🔗

4
Plain text

در این حالت کل آرایه aa صعودی-نزولی است.

وروی نمونه ۳🔗

4
2 1 2 1
Plain text

خروجی نمونه ۳🔗

3
Plain text

راهنمایی ۱

اگر دو عنصر متوالی و مساوی وجود داشت، می‌توانیم یکی را به دلخواه حذف کنیم چون در جواب مسئله تاثیری ندارد.

اگر سه عنصر متوالی وجود داشته باشد که صعودی باشند یعنی اولی کمتر از دومی و دومی کمتر از سومی باشد می‌توانیم عنصر دوم را حذف کنیم. (چرا؟)

اثبات راهنمایی ۱

اگر دنبال بهینه‌ای وجود داشته باشد که عنصر وسط (یعنی دوم) در این دنباله باشد طبق تعریف دنباله صعودی-نزولی، ممکن نیست هر سه عنصر در این دنباله باشند. پس می‌توان جای عنصر دوم یکی از دو عنصر که استفاده نشده را قرار داد. (در صورتی که این عنصر، اندیس فرد داشت جای آن عنصر بعدی که بزرگ‌تر است (و در نتیجه بهتر است) را قرار می‌دهیم و در غیر این صورت عنصر دیگر)

راهنمایی ۲

اگر k عنصر متوالی صعودی وجود داشت طبق راهنمایی قبل فقط اولی و اخری را نگه می‌داریم و بقیه را حذف می‌کنیم.
همینطوری اگر k عنصر متوالی نزولی وجود داشت اولی و اخری را نگه می‌داریم و بقیه را حذف می‌کنیم.

راه حل

بعد از حذف عنصر‌های اضافه که در راهنمایی ۲ گفته شد، می‌توانید مشاهده کنید که دنباله باقی‌مانده، یک دنباله صعودی-نزولی است. البته ممکن است نیاز باشد اولین عنصر را نیز حذف کنید در صورتی که عنصر اولی بزرگتر از عنصر بعدی باشد.

دنباله جدید صعودی - نزولی است چون عضو دوم بزرگتر از عضو اول است و اگر عنصر سوم بزرگتر از دومی باشد سه عنصر متوالی صعودی پیدا شده که تناقض دارد. پس عنصر سوم کوچک‌تر از عنصر دومی است. حالا اگر عنصر چهارم کوچک‌تر از عنصر سوم باشد دوباره سه عنصر متوالی نزولی پیدا شده که تناقض دارد پس عنصر چهارم بزرگ‌تر از عنصر سوم است.
اگر همین روال را ادامه بدهیم می‌بینیم که دنباله صعودی-نزولی است.

از طرفی این دنباله بلندترین است چون دنبال بهینه‌ای وجود داشته باشد که عنصر وسط (یعنی دوم) در این دنباله باشد طبق تعریف دنباله صعودی-نزولی ممکن نیست هر سه عنصر در این دنباله باشند پس می‌توان جای عنصر دوم یکی از دو عنصر که استفاده نشده را قرار داد (در صورتی که این عنصر، اندیس فرد داشت جای آن عنصر بعدی که بزرگ‌تر است (و در نتیجه بهتر است) را قرار می‌دهیم و در غیر این صورت عنصر دیگر)

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.