جمع دو عدد


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

در این سوال به شما دو عدد صحیح مثل aa و bb داده می‌شود. از شما می‌خواهیم برنامه‌ای بنویسید که مقدار aa و bb را دریافت کند و a+ba + b را چاپ کند.

ورودی🔗

در تنها سطر ورودی، دو عدد صحیح aa و bb که با یک فاصله از هم جدا شده‌اند، داده می‌شود.

1a,b1001 \leq a, b \leq 100

خروجی🔗

در تنها سطر خروجی، مقدار a+ba + b را چاپ کنید.

مثال‌ها🔗

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

3 5
Plain text

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

8
Plain text

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

1 1
Plain text

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

2
Plain text
اگر نمره‌ی کامل این سوال را نگرفتید، اینجا را بخوانید.

به احتمال زیاد، شما با سیستم داوری مسابقات برنامه‌نویسی آشنایی ندارید.

بنابراین ابتدا اینجا را بخوانید و اگر بازهم مشکل شما حل نشد به ما پیام دهید.

راهنمایی اول

مسئله را به سه قسمت تقسیم کنید:

  • دریافت دو عدد از ورودی
  • محاسبه‌ی جمع آن دو عدد
  • چاپ کردن حاصل در خروجی

برای آشنایی بیشتر درباره‌ی نحوه‌ی دریافت ورودی این لینک را مطالعه کنید.

راهنمایی دوم

از چاپ کردن موارد اضافه هنگام دریافت ورودی مثل please enter a number: و چیزهای مشابه آن پرهیز کنید.

راهنمایی سوم

توجه کنید ورودی در یک خط داده می‌شود. بنابراین اگر از زبان‌هایی مثل پایتون برای برنامه‌نویسی استفاده می‌کنید، باید یکبار با کمک input ورودی بگیرید و سپس رشته بدست آمده را دو قسمت کنید.

آبمیوه


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

امین وارد یک آب‌میوه فروشی می‌شود. معده امین VV لیتر ظرفیت آب‌میوه دارد!

در این آب‌میوه فروشی nn نوع آب‌میوه وجود دارد. انواع آب‌میوه را با اعداد 11 تا nn شماره‌گذاری می‌کنیم. از آب‌میوه‌ی نوع iiام (1in1 \leq i \leq n) به اندازه‌ی viv_i لیتر در مخزن آن وجود دارد.

امین می‌داند که اگر همه‌ی ظرف آب‌میوه‌ی موجود در مخزن iiام را بنوشد، به اندازه‌ی hih_i خوشحال می‌شود. همچنین اگر هر کسری از این ظرف را بخورد به همان نسبت خوشحالی بدست می‌آورد. (برای مثال اگر 13vi\frac{1}{3} v_i لیتر بنوشد به‌اندازه‌ی 13hi\frac{1}{3} h_i خوشحالی بدست می‌آورد.)

حال امین می‌خواهد از هر نوع آب‌میوه مقداری بنوشد. (این مقدار می‌تواند هر عدد حقیقی نامنفی باشد!) به طوری که مجموع خوشحالی او بیشینه باشد.

از شما می‌خواهیم برنامه‌ای بنویسید که این مقدار بیشینه را محاسبه و چاپ کند.

ورودی🔗

در سطر اول ورودی، عدد صحیح و مثبت nn و VV داده می‌شود. 1n1000001 \leq n \leq 100 \, 000 1V1091 \leq V \leq 10^9

در nn سطر بعدی، در هر سطر، دو عدد hih_i و viv_i که با یک فاصله از هم جدا شده‌اند. 1hi,vi1091 \leq h_i, v_i \leq 10^9

خروجی🔗

در تنها سطر خروجی، حداکثر مجموع خوشحالی که امین می‌تواند بدست بیاورد را چاپ کنید.

خروجی برنامه را با دقت دقیقاً یک رقم بعد از اعشار چاپ کنید.

مثال‌ها🔗

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

3 400
100 200
150 140
100 300
Plain text

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

270.0
Plain text

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

1 10
500 30
Plain text

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

166.7
Plain text
راهنمایی اول

ابتدا مسئله را برای حالت n=2n = 2 حل کنید.

راهنمایی دوم

اکنون که می‌توانید تصمیم بگیرد بین دو آبمیوه کدامیک الویت دارد. سعی کنید با همین روش همه‌ی آبمیوه‌ها را مرتب کنید.

راهنمایی سوم

برای اینکه این مرتب‌سازی سریع باشد، سعی کنید از روش‌های مرتب‌سازی مقایسه‌ای مثل merge sort یا quick sort استفاده کنید تا به‌اندازه‌ی کافی راه‌حل شما سریع باشد.

جمع براکت‌ها


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

به شما عدد صحیح nn و عدد اعشاری xx داده می‌شود. از شما می‌خواهیم برنامه‌ای بنویسید تا حاصل عبارت زیر را محاسبه کند.

[x]+[x+1n]+[x+2n]++[x+n1n]\left[x\right] + \left[x + \frac{1}{n}\right] + \left[x + \frac{2}{n}\right] + \dots + \left[x + \frac{n-1}{n}\right]

که در این‌جا [x]\left[x\right] به معنای براکت xx است و مقدار آن بزرگ‌ترین عدد صحیح کم‌‌تر یا مساوی xx است.

ورودی🔗

در سطر اول تعداد سناریوها داده می‌شود. 1t1001 \leq t \leq 100

در سطر اول هر سناریو، عدد صحیح و مثبت nn داده می‌شود. 1n1091 \leq n \leq 10^9

در سطر دوم هر سناریو، عدد اعشاری xx داده می‌شود. 100<x<100-100 \lt x \lt 100

عدد اعشاری xx دقیقاً با دقت حداکثر ۷ رقم بعد از اعشار داده می‌شود.

خروجی🔗

در تنها سطر خروجی، یک عدد صحیح که برابر پاسخ مسئله است را چاپ کنید.

مثال‌ها🔗

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

3
2
7.1561
3
2.71
1
3.14
Plain text

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

14
8
3
Plain text

سناریو اول. [7.1561]+[7.1561+0.5]=7+7=14[7.1561] + [7.1561 + 0.5] = 7 + 7 = 14

سناریو دوم. [2.71]+[2.71+0.333...]+[2.71+0.666...]=2+3+3=8[2.71] + [2.71 + 0.333...] + [2.71 + 0.666...] = 2 + 3 + 3 = 8

سناریو سوم. [3.14]=3[3.14] = 3

راهنمایی اول

توجه کنید مقدار هر براکت [x][x] یا [x]+1[x] + 1 است.

راهنمایی دوم

مقدار nn براکت داده شده، به ترتیب صعودی است. پس می‌توانید با استفاده binary search آخرین براکتی که [x][x] است را پیدا کنید.

راهنمایی سوم

با همان استدلال می‌توان ثابت کرد پاسخ مسئله برابر [nx][nx] است.

تبدیل به درخت


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

یک گراف ساده به نام GG با nn راس و mm یال داریم. راس‌های این گراف با اعداد 11 تا nn شماره‌گذاری شده‌اند. در هر عملیات می‌توانیم یکی از دو عدد صحیح و مثبت مثل uu و vv را انتخاب کنیم به طوری که 1uvn1 \leq u \neq v \leq n و یکی از دو عملیات زیر را انجام دهیم اگر یال uvuv در GG موجود است، آن را حذف کنیم. اگر یال uvuv در GG موجود نیست، آن را به GG اضافه کنیم.

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

ورودی🔗

در سطر اول ورودی، دو عدد صحیح nn و mm که با یک فاصله از هم جدا شده‌اند، داده می‌شود.

1n1000001 \leq n \leq 100 \, 000 0m5000000 \leq m \leq 500 \, 000

در mm سطر بعدی،‌ در هر سطر، دو عدد صحیح uu و vv که با یک فاصله از هم جدا شده‌اند داده می‌شود. uvuv یک یال از GG است.

1u<vn1 \leq u \lt v \leq n

خروجی🔗

کمترین تعداد عملیات لازم برای تبدیل GG به یک درخت.

مثال‌ها🔗

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

5 4
1 2
1 3
2 3
4 5
Plain text

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

2
Plain text

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

3 2
1 2
1 3
Plain text

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

0
Plain text
راهنمایی اول

گراف GG درخت است اگر و تنها اگر همبند باشد و هیچ دوری نداشته باشد.

راهنمایی دوم

اگر GG دارای cc مولفه‌ی همبندی باشد، به حداقل c1c - 1 یال نیاز داریم که آن را همبند کنیم.

اگر یک مولفه‌ی همبندی GG دارای nin_i راس و mim_i یال باشد، باید یک زیردرخت فراگیر آن که شامل ni1n_i - 1 یال است را نگه‌داریم و mini+1m_i - n_i + 1 یال دیگر را از آن مولفه‌همبندی حذف کنیم. (با وجود این یال‌ها دور گراف به‌وجود می‌آید.)

راهنمایی سوم

اگر مجموع یال‌های مورد نیاز برای حذف را محاسبه کنید،‌ می‌بیند که فقط به مقدار cc نیاز دارید و می‌توانید آن را با استفاده از الگوریتم‌های مثل dfs، bfs یا dsu بدست آورید.

فیبوجمع


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

یک آرایه از اعداد صحیح مثل a1,a2,,ana_1, a_2, \dots, a_n\, داریم. در qq مرحله یک عملیات مثل زیر روی آن انجام می‌دهیم.

دو عدد صحیح مثل \ell و rr انتخاب می‌کنیم که 1rn1 \leq \ell \leq r \leq n باشد و سپس مقدار

  • a=a+fib1a_{\ell} = a_{\ell} + fib_1
  • a+1=a+1+fib2a_{\ell + 1} = a_{\ell + 1} + fib_2
  • \dots
  • ar=ar+fibr+1a_r = a_r + fib_{r-\ell + 1}

می‌شود که منظور از fibifib_i جمله‌ی iiام دنباله فیبوناچی است. دنباله فیبوناچی به صورت زیر تعریف می‌شود:

fibn={1n=11n=2fibn1+fibn2n>2 fib_n = \begin{cases} 1 & n = 1 \\ 1 & n = 2 \\ fib_{n - 1} + fib_{n - 2} & n > 2 \end{cases}

از شما می‌خواهیم بعد از پایان این عملیات‌ها، مقدار نهایی اعضای آرایه را چاپ کنید. چون این مقدار می‌تواند خیلی بزرگ باشد. صرفاً باقی‌مانده هر عدد آرایه را بر 109+710^9 + 7 چاپ کنید.

ورودی🔗

در سطر اول ورودی، دو عدد صحیح و مثبت nn و qq که با یک فاصله از هم جدا شده‌اند، داده می‌شود. 1n,q1000001 \leq n, q \leq 100 \, 000

در سطر دوم ورودی، nn عدد صحیح a1,a2,,ana_1, a_2, \dots, a_n\, که با یک فاصله از هم جدا شده‌اند داده می‌شود. 1ai1091 \leq a_i \leq 10^9

در qq سطر بعدی، در هر سطر دو عدد صحیح \ell و rr داده می‌شود که نشان‌دهنده‌ی بازه‌ی عملیات است. 1rn1 \leq \ell \leq r \leq n

خروجی🔗

در تنها سطر خروجی، nn عدد صحیح که با یک فاصله از هم جدا شده‌اند را چاپ کنید که وضعیت نهایی آرایه‌ی aa را نشان می‌دهد.

چون ممکن است مقدار اعداد آرایه خیلی بزرگ شود، باقی‌مانده‌ی این اعداد را بر 109+710^9 + 7 چاپ کنید.

مثال‌ها🔗

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

5 3
1 2 3 4 5
2 4
1 3
5 5
Plain text

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

2 4 6 6 6
Plain text

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

3 2
2 4 1
1 3
2 3
Plain text

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

3 6 4
Plain text
راهنمایی اول

نیازی نیست همه‌ی تغییرات را در لحظه روی آرایه اعمال کنیم. می‌توانیم همه را دریافت کنیم و با ترتیبی مناسب آن‌ها را روی آرایه اعمال کنیم.

راهنمایی دوم

اگر لحظه‌ی شروع و پایان هر بازه که باید تغییر کند را روی آرایه در نظر بگیریم و به ترتیب از چپ آرایه (اندیس ۰) شروع کنیم و به سمت راست (اندیس n1n - 1) حرکت کنیم و همه‌ی تغییرات را به همین ترتیب روی آرایه اعمال کنیم. به این ایده sweep line می‌گویند.

راهنمایی سوم

با توجه به رابطه بازگشتی فیبوناچی که برای همه یکی هست می‌توان اتفاق این تغییرات را جمع کرد. یعنی اگر چند تغییر روی یک خانه اتفاق می‌افتد می‌توان همه‌ی آن‌ها را باهم جمع کرد.