Professional Documents
Culture Documents
0 B0 U OHynlj 5 e 7 C XBad 2 G 3 B 0 Wye FE
0 B0 U OHynlj 5 e 7 C XBad 2 G 3 B 0 Wye FE
সম া ও সমাধান
} বই - ১
সে র, ২০১৭
১
২
সূচীপ
২ সহজ িকছু সম া ১৩
২.১ অ শীলনী . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ২৩
২.১.১ সম া . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ২৩
২.১.২ িহ ট . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ২৩
৩ STL াকিটস ২৫
৩.১ অ শীলনী . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ৩৪
৩.১.১ সম া . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ৩৪
৩.১.২ িহ ট . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ৩৪
৪ Mathematics স িকত সম া ৩৭
৪.১ অ শীলনী . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ৬৯
৪.১.১ সম া . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ৬৯
৭ Greedy ৯৭
৭.১ অ শীলনী . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ১০৬
৭.১.১ সম া . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ১০৬
৩
১০ Adhoc ১৪৯
১০.১ অ শীলনী . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ১৬৪
১০.১.১ সম া . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ১৬৪
১১ Geometry ১৬৫
১১.১ অ শীলনী . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ১৭৭
১১.১.১ সম া . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ১৭৭
৪
নকশা তািলকা
৫
৬
সারণী তািলকা
৭
৮
অধ ায় ১
৯
তুলনায় এসব খুবই সহজ। আমার মূল ল িছল সসব কিঠন িজিনস িনেয় বই িলখার। যমন- fft, nft,
persistent data structure, link cut tree ইত ািদ। কারণ আমার মেন হেয়েছ সহজ িবষয় িল
তা এক জন চাইেলই নট থেক পেড় িশখেত পারেব িক এই কিঠন িবষয় িল ইংেরিজেতই ভাল
কের নাই। ভাল কের কাথাও থাকেলও এক জায়গায় সব নই। তাই বাংলায় িলখেল হয়েতা যারা
বাংলােদেশর advanced contestant তােদর জ ভাল হত। িক সই বই িলখেত িগেয় মেন
হেয়েছ য আসেল সহজ িবষেয়র উপেরও বই দরকার। এজ না য আমােদর দেশ advanced
contestant এর সংখ া খুবই কম, বরং এজ য আিম যখন advanced িবষেয়র উপর িলখব
তখন যন এটা মেন না হয়, আের এই িবষয় িক ওরা জােন? অমুক টকিনক িক ওরা জােন? এসব
ভেবই আমার " া ািমং কে ট - ডটা াকচার ও অ ালগিরদম" বই িলখা। বইটা িলখা হয়
2011 সােল আর বিশর ভাগ িজিনস িলখা শষ হয় 2013 সােল। এরপর নানা রকম আলেসিম পার
কের 2015 ত তা pdf আকাের ছাড়া হয় এবং 2016 ত হাডকিপ িহসােব। কিঠন িবষেয়র উপর বই
িলখার ই া িনেয় কের 5 বছর কািটেয় িদেয়িছ সহজ িবষেয়র উপর িলেখ। িক সই বই এ ধু
theory িছল। সখােন তমন কােনা সম া িনেয় আেলাচনা িছল না, ে েমর িল ও িছল না। সিত
বলেত, ঐ বইএ আরও একিট চ া ার িছল যখােন ায় 300-400 সম া িনেয় আেলাচনা করা িছল
(যত দূর স ব 2013 সােলর সব icpc regional এর problem এবং solution িনেয় িছল, এমনিক
neerc, ceerc এবং chinese regional িলও িছল)। িক বই এর আকার এেতা িবশাল হি ল
আর সই সম ার আেলাচনা এেতা সংে েপ িছল য আিম পের ঐ অংশ মুেছ ফিল (এমিনেতই
theory আেলাচনা অংশ সংি ও বেল যই পিরমান গালাগািল হজম করেত হেয়েছ স তুলনায় ঐ
চ া ার মুেছ িদেয় ভালই হেয়েছ ব িক!)। থম বইএ থম হািতয়ার ( ান) িনেয় কথা হেলও ি তীয়
হািতয়ােরর ( চ া) কােনা িকছুই িছল না। সই জ ই আমার এই ি তীয় বই। আিম িনেজ বেলম
ক াটাগরাইেজসেন ওত অভ না। তাই এই বইেয় যত সম া আেলাচনা করা হেয়েছ তার িল িল
আিম িবিভ সাস হেত িনেয়িছ। মূল িল হল িজয়া িলউ এর এক ন র বই (সহজ বই) এর িল ।
এছাড়াও আিম timus এর beginner ে েমর একিট িল ব বহার কেরিছ। LightOJ এর টিপক
এর িল হেতও বশ িকছু সম া আিম ব বহার কেরিছ। জ ািমিতর জ বাংলােদেশর জ ািমিতর
নািফ এর একটা বেলম িল িছল আমােদর বুেয়েটর েপ সই িল ব বহার কেরিছ। Greedy
সম ার জ codeforces এর িকছু সম া ব বহার কেরিছ। এরকম নানা জায়গা হেত বেলম
িনেয় সসব িনেয় আেলাচনা করা হেয়েছ।
এই বইেয়র মূল উে যিদ তুিম মেন কর িবিভ টিপেক াি স করা তাহেল ভুল ভাবেব। মূল
উে হল, চীেনর বা া কে টে টরা িজয়া িলউ এর যই বই পেড় তােত আেলািচত বেলম েলা
তামােদর সামেন তুেল ধরা। আর বুঝােনা কন তারা এেতা ভাল পাের আর কন আমরা পাির না।
তােদর সহজ বইেয়ই যিদ এেতা কিঠন বেলম থােক তাহেল কিঠন বইেয় না িক আেছ! যিদ তামরা
সিত কােরর ভাল কে টে ট হেত চাও, তাহেল এই বইেয়র বেলম িলেক তামােদর কােছ সাজা
লাগেত হেব। আর যারা শেখর বেশ কে ট করেত চায়, খাটা খাটিন করেত চায় না, তারা এই বইেক
িনরাপদ রে দূের সিরেয় রােখা।
সাধারনত বইেয় িতিট অধ ােয় বেলম িল তােদর difficulty অ যায়ী আেছ। তরাং তুিম
একিট কের বেলম দখ আর িনেজরা তা সমাধান করার চ া কর। যিদ িনেজরা পার তাহেল তা
ভাল কথা, আর না পারেল সমাধান একটু একটু কের পেড় দখ। এক লাইন ই লাইন কের পড় আর
িনেজরা আবার িচ া কর। যিদ িনেজ
( সমাধান
) করেত পার তাহেলও(এই)বইেয়র সমাধান পড়। কারণ
দখা যােব, যিদও এই সম া O n3 এ সমাধান হয় িক এর O n2 সমাধান হয়েতা আিম বণনা
কেরিছ। বা অেনক সময় আিম নানা ছাট খাট ি েকর কথা বেলিছ তা হয়েতা অ ে েম কােজ
আসেব।
অেনক সময় এটাও হেত পাের য তুিম কােনা একিট সমাধান বুঝছ না। এরকম না হওয়াটাই
অ াভািবক (সংি ও সমাধােনর জ ই হাক বা কিঠন সম ার জে ই হাক)। এখােন অেনক
সম া আেছ য িল আমার িনেজর সমাধান করেত বা অে র সমাধান পেড় বুঝেত 4-5 িদন কের
লেগেছ। তরাং তুিম যিদ 1 িদন ব য় কেরই হাল ছেড় দাও তাহেল হেব না। কাগেজ কলেম িবিভ
কস িনেয় িচ া করেত হেব আিম িক বলিছ, বা তা কীভােব হে বা হেত পাের।
অেনেকই বেল বই আরও সহজ কের িলখেত, িক সিত বলেত এর থেকও সহজ কের িলখার
আমার সময় নই। আিম যিদ আরও সহজ কের আরও অেনক সময় িনেয় িলিখ তাহেল আমার আসল
১০
উে (কিঠন িবষয় িল শখা এবং তা িনেয় লখা) আমার কখনই পুরন হেব না। বা যারা বতমােন
advanced coder আেছ তারা কখনও কিঠন িজিনস িল িশখেত পারেব না। সহজ িবষয় িলর উপর
িলখা বা শখােনার অেনেকই আেছ িক কিঠন িজিনস িল িনেয় সংি িলখাও নই। তরাং আিম
যিদ কখনও আমার ল পুরন করেত পাির তাহেল হয়েতা কােনািদন আবার এই "কিঠন" কের িলখা
বই িরভাইজ কের সহজ কের আরও ছিব িদেয় িলখব। িক আশা কির তত িদেন আমােদর দেশ
এেতা 2400+ রিটং এর কাডার থাকেব য "এই কিঠন বই বুঝিছনা" এ কথা বলা মা েষর পিরমান
কেম যােব বা তােদর মধ হেত আর কউ সহজ কের বই িলখেব।
আেগই বেলিছ এই বইেয় UVa, Timus, Codeforces, LightOJ থেক সম া আেছ। আিম
ে েমর না ােরর পাশাপািশ ে েমর নাম িদেয়িছ যােত তামােদর খুঁেজ পেত িবধা হয়। িবেশষ
কের codeforces এর ে এই সম া বিশ দখা যায় কারণ সখােন একিট ে েমর না ার
দওয়া বশ কিঠন। আর মােঝ মােঝ আিম বেলম statement একটু পিরবতন কের িনেয়িছ।
যমন দখা যােব মূল ে েম বলা হেয়েছ য ছাগেলর কািহনী আিম িলেখিছ গাধার কািহনী। অেনক
সময় মূল ে েম বেলেছ য অমুক অমুক িডিজট ব ািতত অ সকল িডিজট ব বহার করা যােব। িক
আিম ে েম িলেখিছ য অমুক অমুক িডিজট কবল ব বহার করা যােব। এসেবর মেধ িক তমন
কােনা তফাৎ নই। তরাং আশা কির তামােদর বুঝেত সম া হেব না।
আর আমরা এই বইেয় আেলািচত সম া িলর কাড রাখার জ একিট git repository খুেলিছ
যার িলংক (https://github.com/shanto86/problem-book-1-solutions). তামরা চাইেল
তামােদর ac কাড এখােন পাঠােত পার যােত অ রা তা দেখ িশখেত পাের। আমরা চ া করব
কােনা একিট সম ার একিট মা সমাধান এখােন রাখার। তেব যিদ কউ স ূণ িভ ভােব কা-
না সম া সমাধান কের তাহেল আমরা সই নতুন সমাধানও রাখেত পাির। সই সােথ ধ বাদ
Nayeem Jahan Rafi, Evan Hossain, Rezwan Arefin, Md Sahedul Islam Sohel,
Mohtasim Bellah, Moudud Khan Shahriar, Abdullah Al Raqibul Islam, Imran
Ziad এবং Sumit Saha ক যারা বইেয়র টকিনকাল িরিভউ করেত সাহায কেরেছ।
১১
১২
অধ ায় ২
সহজ িকছু সম া
এই অধ ােয় আমরা সহজ িকছু সম া িনেয় আেলাচনা করব। আশা কির এই অধ ােয়র সম া িল
সমাধান করেত কােনা algorithm লাগেব না। তামােদর online judge (oj) আর c/c++ এর সােথ
পিরিচত করাই এই অধ ােয়র উে । তামােদর যারা ইেতামেধ ই online judge এ অ ত ১০০
িট সম া সমাধান কের ফেলছ তােদর জ হয়েতা এই অধ ায় ওত কােজ আসেব না। তামরা বরং
ঘিড় ধের এই অধ ােয়র সম া িল সমাধান করার চ া কের দখেত পার। কত কম সমেয় কত
কম পনাি েত সব সমাধান করা যায় স চ া কর। আর সব সমাধান শেষ একবার আমার বলা
সমাধান িলেত চাখ বুিলেয় িনেত পার। হয়েতা িকছু নতুন িটপস পেয় যেত পােরা!
অ শীলনী বশ অেনক িল সম া দওয়া আেছ। সব িলই মুলত c/c++ জানা থাকেলই হেব।
তরাং তামরা যারা া ািমং কে ট জগেত নতুন তােদর জ ই মুলত এই অধ ায়। আেরকটা
িজিনস, িকছু িকছু সম া আেছ য েলা হয়েতা মেন হেব কাড করা পইন। িক আমার মেত তাও
সসব সম া করা উিচত। এরকম সম া তামােদর debug করার মতা বৃি কের এবং র কের
কাড করা িশখেত সাহায কের। তরাং কােনা সম া দখেত পইনফুল হেল তােক পাশ কািটেয়
যও না। আর কােনা একিট সম া সমাধান করা হেল তামরা চাইেল নেট সাচ কের অ েদর কাড
দখেত পার। এেত কের নতুন টকিনক িশখেত পারেব।
সমাধান: খুবই সহজ সম া। তেব সরাসির কাড করেত যাবার আেগ দেখ নাও a আর b এর
িলিমট কত। ঃেখর িবষয় হেলা এই সম ায় এেদর কােনা িলিমট দওয়া নই। আেগর যুেগ এরকম
সম া ায়ই হেতা। অথাৎ দখা যায় ে েম ইনপুট ভ ািরেয়বেলর িলিমট িল দয়া নই। যিদ
এটা কে টে হয় তাহেল judge ক clarification এর মাধ েম িজ াসা কের নাও। আর যিদ এটা
offline হয় অথাৎ াকিটেসর জ online judge এ সমাধান করার সময় এরকম হেয় থােক তাহেল
েপ বা ফারােম িজ াসা কর অথবা ফারােমর পুরেনা পা একটু ঘঁেট দেখা। এরপরও যিদ না
বুঝেত পােরা কী কািহনী তাহেল আমার মেত সই সম া না চ া করাই ভাল। OJ িলেত অেনক
ভাল ভাল সম া থােক, ধু ধু একটা ambiguous সম ার পছেন সময় ব য় করার কােনা মােন
নই।
যারা কবল মা C িশখছ তারা অেনেকই ইনপুট নবার আেগ prompt ি ট কের থাক। Prompt
হেলা "please enter your number", "please input a" ইত ািদ। বলেত ি ধা নই আিম যখন
আমার জীবেনর থম সম া সমাধান কেরিছলাম (UVa 100) তখন এই কাজ কেরিছলাম। এসব
prompt দবার আসেল কােনা দরকার নই। বরং এসব prompt িদেল তুিম wrong answer (বা
কখনও কখনও output limit exceed বা presentation error) পাবা। কন? কারণটা বাঝার
১৩
জ তামােক আেগ িচ া করেত হেব online judge কীভােব কাজ কের। Online judge তামার
কাড নয়, াভািবক ভােবই তামার কাড compile কের এবং সব শেষ তার কােছ থাকা এক বা
একািধক input ফাইল তামার কাডেক দয়। তামার কাড সই ইনপুট িল standard input হেত
পেড় (অথাৎ সাধারণ scanf, cin ইত ািদ িদেয়)। কােনা কােনা oj ত অব আমােদর ফাইল হেত
পড়েত হয় (fscanf, fopen, freopen ইত ািদ ব বহার করেত হয় সে ে )। কান জােজ কীভােব
ইনপুট আউটপুট করেত হেব তা সাধারনত তােদর frequently asked question বা এই জাতীয়
সকশেন িলখা থােক। যাই হাক, ক াইল করা শেষ তামার কাড সই সব ইনপুট পেড় output
দয়। এবার তামার দয়া এই output তারা তােদর কােছ থাকা সিঠক output এর সােথ মলায়।
এখন তুিম যিদ অিতির prompt দাও সটা তা আর জাজেদর output এ থাকেব না তাই না? আর
তাছাড়া তুিম ভেব দেখা যিদ তুিম ইনপুট নবার জ prompt দাও তাহেল তামার আসল উ র
আর prompt আলাদা করার িক কােনা উপায় আেছ? নই। কারণ জাজ তা সব আউটপুট িনেয় এর
পর চক কের। স তা জােন না কানটা prompt আর কানটা আউটপুট। সজ prompt দবার
কােনা দরকার নই। আর াঁ, আিম জািন য আিম যত সহেজ oj কাজ কের বললাম, আসেল তা
অেতা সহজ না, িক মাটােমািট ঐরকম ভােবই কাজ কের।
অেনক কথা হেলা, আমােদর এই সম ায় িফের আসা যাক। তুিম এই সম ার ফারােম একটু
ঘাঁটেলই বুঝেব য এখােন a আর b ক int এ িনেলই চলেব। তাহেল আর দরী কন, ঝটপট কাড
কের ফল। ৬-৭ লাইেনর বিশ কাড হওয়া উিচত না!
১৪
time limit এর পাশাপািশ memory limit ও দয়া থােক। যমন এই সম ার memory limit
হেলা 64 মগাবাইট। খয়াল করেব তামার কাড যন এর বিশ মেমাির ব বহার না কের। না হেল
memory limit exceed খেয় যেত পােরা! বিশর ভাগ সময়ই এই িলিমট ল করার দরকার
হয় না। িক মােঝ মােঝ দখা যায় তুিম DP করেত চা িক DP এর অ াের অেনক বিশ মমির
দখল কের বেস আেছ। সসব সময় তামােক মমির অি মাইজ করেত হেত পাের।
এই সম ার ে তামরা চাইেল অ ােরর সাইজ কত িনেত হেব সই িহসােবর ঝােমলায় না িগ-
য় stl এর vector ব বহার করেত পােরা। একিট কের ইনপুট নাও আর vector এ push back কর।
সবেশেষ vector এর পছন থেক আেসা। iterator ব বহার করার কানই দরকার নই (iterator
িক যিদ না জান তাহেল আপাতত জানার দরকার নই, দরকােরর সময় িশেখ িনেলই হেব)। আিম মেন
হয়না জীবেন vector এর জ iterator ব বহার কেরিছ। তামােদর িবধার জ vector ব বহার
কের এর কাড ২.১ এ দওয়া হেলা।
এখােন আেরকটা িজিনস। সটা হল EOF. খয়াল কর আমােদর ইনপুেট যত ণ সংখ া আেছ
তত ণ আমােদর ইনপুট িনেত হেব। এই কাজ আমরা এই EOF এর মাধ েম করেত পাির। যখন
ইনপুট নওয়া শষ হেয় যায় তখন তুিম মেন করেত পার য scanf ফাংশন EOF (End Of File)
িরটান কের। তরাং আমরা তত ণ ইনপুট েসস করব যত ণ না scanf ফাংশন EOF িরটান
কের।
১৫
সমাধান: যারা গিণত পছ কর তােদরেক বলিছ- তামােদর trade-off িশখেত হেব। Trade-off
মােন হেলা কােনা একিট সম া পাবার পর সটা গিণত িদেয়ই সমাধান করবা নািক িকছু র গািণিতক
ভােব কের বািকটু কি উটােরর উপর ছেড় িদবা- সটা। যমন এই সম ার ে কউ যিদ মেন
কর আের এটা তা মজার গািণিতক সম া লাগেছ, লসা লসা গ ! কথা িঠক, িক তাই বেল
পুেরাটা গািণিতক ভােব করা মেন হয় বশ মুশিকল হেব। িতিট ছা ছা ীর ঘুেমর সাইেকল খুব জাড়
10 (a+b). মােন িত a + b সময় পর পর একই অব া িফের আসেব। আমােদর সম ায় সেবা
দশজন থাকেত পাের, তরাং তােদর লসা সেবা হেত পাের lcm(1, 2, . . . 10). এখােন লসা
কীভােব আসল বুেঝছ তা? দখ, থম জন তার a + b সময় পর র অব ায় আসেব, ি তীয় জন
তার a + b সময় পর তার র অব ায় আসেব এরকম কের সকেলর জ আমরা তার সাইেকেলর
লংথ জািন। এখন যিদ করা হয় কত সময় পর সবাই একে র অব া আসেব তাহেল তা হেব
এই সকল সাইেকল লংেথর lcm এর সমান। কারণ lcm ক সব সাইেকল লংথ ভাগ কের। তার
মােন lcm সময় পর সবাই র অব ায় আসেব।
তাহেল তুিম যা করেত পােরা তাহেলা 1, 2 এভােব সই লসা পয িতিট সমেয় যেত পােরা
এবং সবার ঘুেমর state দখেত পােরা। এভােব লসা পয সব সময় চক কেরও যিদ সবাই জেগ
আেছ এরকম কান সময় না পাও তার মােন এমন কােনা সময় পাওয়া স ব নয়।
যারা আবার অলস তারা আবার ক কের lcm বর করেত যােব না। স জােন য কােনা একিট
বড় মান পয চক করেলই হল। তরাং স চাখ ব কের 106 বা 107 জাতীয় বড় একিট সংখ া
পয চক করেব। যিদ এর িভতেরও সমাধান না পাওয়া যায় তার মােন সমাধান নই!
কাডেক র করার জ চাইেল "অমুক সমেয়" "অমুক জেনর" state িক তা বর করার জ
একিট ফাংশন িলখেত পােরা। অথাৎ ঐ ফাংশনেক বতমান লােকর a, b এর মান আর বতমান সময়
দেব, স বেল দেব য ঐ লাক ঘুিমেয় আেছ না জেগ। এভােব ফাংশন ফাংশন কের আলাদা আলাদা
কাড করেল কাড বুঝেত বা িডবাগ করেত িবধা হয়।
একটা উদাহরন দই। িকছুিদন আেগ এক কে টে এক সম ায় আমােক বেলিছল য n ইনপুট
আকাের দওয়া থাকেব। তামােক সই n এর উপর িভি কের একটা সম া সমাধান করেত হেব
এবং একিট িল এর সাইজ এবং সই িল িট আউটপুট করেত হেব। কাড করার সময় আিম
ভেবিছলাম সম াটা তা সহজ। তরাং ক কের র কের কাড না কের সব কাড main এর
ভতেরই কির। িক যখন WA খলাম তখন হল আসল ঝােমলা। িডবাগ এর জ আিম চাইিছলাম
n এর িবিভ মােনর জ িলে র সাইজ ি ট দই। িক সম া হল যেহতু আিম র কের কাড
কির নাই সেহতু দখা গেছ আিম িবিভ কস িবিভ ভােব া ডল কেরিছ। আমার আউটপুট ছিড়েয়
িছিটেয় িবিভ জায়গায় আেছ। স ল জায়গা আবার সহেজ কেম ট করা যাে না। এরকম নানান
সম া। শেষ আিম একিট ফাংশন িলখলাম এবং সই ফাংশন হেত vector িরটান করলাম। এবার
আমার কাজ সহজ হেয় গল। আমার আউটপুট নানা জায়গায় আর ছিড়েয় িছিটেয় নাই। আিম যিদ
েতই এই কাজ করতাম তাহেল আমার এেতা সময় ন হত না। তরাং চ া করবা তামার কাড
থেকই র কের আলাদা আলাদা ফাংসেন ভে ভে িলখেত। আবার খয়াল রখ বিশ
র করেত িগেয় যন অেনক বিশ সময় চেল না যায়! সবই trade-off!
সমাধান: এটা আমার বশ পছে র সম া। কারণ যিদ কউ "সহেজ" এটার কাড না করেত পাের
তাহেল অ ত স অেনক খেট খুেট অেনক িবশাল কাড কের সমাধান করেত পারেব। আবার কউ
একটু বুি খািটেয় কাডটােক একটু ছাট কের ফলেত পাের। কউ আবার একটু বিশ বুি খািটেয়
আরও ছাট করেত পারেব। যত বিশ বুি খাটােব তত ছাট হেব। িক সই বুি িল বর করেতও
১৬
িক সময় লাগেব। তরাং trade-off! তুিম িক সময় ব য় কের কাড ছাট করেব, নািক dumb এর
মত কম বুি ওয়ালা সমাধান িলখেব?
বড় কাড এবং সবেচেয় কম বুি ওয়ালা সমাধান কী তােতা বুঝেতই পারছ? িনেজ থেক কােনা
ঘনকেক যত ভােব পােরা ঘুরাও আর তােদর সবার জ একিট কের if-else িলখ। অথাৎ মেন মেন
থম ঘনকেক যত ভােব স ব ঘুরাও। ঘুরানর পর তুিম জান এখন এর উপর/িনচ/ডান/বাম/সামেন-
/িপেছ কান রঙ আেছ। এখন তুিম সই রঙ িলেক ি তীয় ঘনেকর রেঙর সােথ তুলনা করার জ
if-else িলখ। যিদ ভুল না কের থািক তাহেল এজ তামােক 24িট if িলখেত হেব (আর তার ভতের
6িটর মত == লিজক)। ি তীয় ঘনকেক তা আর ঘুরানর েয়াজন নই। ধু থম ঘনকেক মেন মেন
ঘুরােব। থম ঘনেকর ছয়িট পৃ েক এেক এেক মেন মেন সামেনর পৃ িহসােব ি র ক না করেব।
এখন এর বািক পৃ িলেক ঘুিরেয় ঘুিরেয় পিরবতন কের িবিভ orientation পেত পােরা। যিদ
বুঝেত সম া হয় তামরা xyz axis ক না কর। ঘনেকর ছয়িট পৃ ছয় axis এ আেছ (x+, x-,
...). এখন মেন কর x+ এর িদেকর পৃ ি র। তাহেল এই ঘনকেক x axis এর সােপে ঘুরােল মাট
চারিট orientation পাওয়া যােব (চারিট পৃ এেক এেক y+ এর িদেক আসেব- এভােবও ভাবেত
পােরা)। িনঃসে েহ খুব একটা সহজ কাজ না। এেক তা ঘনকেক ঘুিরেয় ঘুিরেয় আঁকেত হেব কাগেজ
কলেম বা ক নায়, তারপর আবার সটা এক গাদা if else কের িলখেতও হেব। তেব আর কােনা
বুি না পেল এটাই করেত হেব। একটু র বা সহজ করার জ যা করেত পােরা তাহেলা এত েলা
if-else না িলেখ একিট 24 × 6 সাইেজর অ ােরেত সংখ া িল িলেখ রােখা (অথাৎ ি তীয় ঘনেকর i
তম পৃে র সােথ ক িমেল এই তথ িল)। তাহেল একিট loop চািলেয় এবং একিট if িলেখই কাজ
সের ফলেত পােরা।
একটু কম ugly উপায় হেলা খয়াল করা য ঘনেকর পৃ িল একটু িবেশষ ভােব না ািরং করা
(statement এর িচ দেখা)। 1 আর 6 িবপরীত িদেক, 2 আর 5 িবপরীত িদেক এবং 3 আর 4 ও।
এেদর েত ক জাড়ার যাগফল িক 7. তরাং, আমরা যিদ িঠক কির উপের, িপছেন আর ডােন ক
তাহেল আমরা সখান থেক িনচ, সামেন আর বােম ক আেছ তা বর কের ফলেত পাির। তরাং এর
আেগর মত 24 × 6 এর দরকার নই 24 × 3 ই যেথ , কারণ বািক িতনিট তুিম এই ফমুলা ব বহার
কের বর করেত পারেব।
আর কীভােব সহজ করা যায়? খয়াল কর, তুিম যিদ উপেরর পৃ িঠক কের ফল তাহেল চািরিদেক
িক িক থাকেব তা িক fix হেয় গেছ। যমন উপের যিদ 1 থােক তাহেল চািরিদেক থাকেব 2, 3, 5,
4. এখন এেদরেক যিদ circular ভােব একিট অ াের ত রােখা তাহেল িক পাশাপািশ িট িসেল
কের তােদরেক িপছন ও ডান পৃ ক না করেত পােরা। অথাৎ িতিট পৃ উপেরর িদেকর জ
তুিম একিট অ াের (4 দেঘ র) রােখা য সে ে চািরদেক কান কান পৃ থাকেব। যমন উপের
1 থাকেল চািরিদেক থাকেব 2, 3, 5 আর 4. উপের 4 থাকেল চািরিদেক থাকেব 2, 1, 5 আর 6
এরকম কের সকল পৃ উপের থাকার জ চািরিদেক ক থাকেব তার একিট িল বািনেয় ফলেত
পাির। এরপর এই অ ােরর উপর লুপ চািলেয় িনবাচন করেত পাির িপছেন ক থাকেব, তাহেল তার
পেরর জন থাকেব ডােন। আর উপর, িপছন ও ডান িনিদ হেয় গেল তা বািক েলা িনিদ হেয় যায়
তাই না? তাহেল এই প িতেত কত বড় অ াের িলখেত হে ? 6 × 4. বশ কম! হয়েতা এর থেকও
কমােনা স ব। িচ া কের দখেত পােরা, অথবা এটাই কাড কের ফলেত পােরা! সময় বাঁচেব।
১৭
কের ফলা যায়।১ এই DP করেল আমরা জানেত পারব A এবং B এর িক িক মান স ব। আর এ
িজিনস জানেল তা আমােদর সমাধান হেয়ই যােব!
এছাড়াও আমরা চাইেল এেক backtrack কের সমাধান করেত পাির। আমরা এেক এেক 1 হেত
n পয িতিট ােন িগেয় িস া িনব য এই ােনর সংখ া কান ভােগ নব। ধরা যাক আমােদর
backtrack ফাংশেনর parameter হেব িট সংখ া। থমিট বলেব আমরা এখন কান সংখ ায়
আিছ (আমরা িক এেক এেক 1-তম হেত n-তম সংখ ায় যাি ) আর ি তীয় সংখ া বলেব আমরা
যই ভােগ ভাগ করিছ তার থম ভােগ থাকা সংখ া িলর যাগফল কত। চাইেল ি তীয় ভােগর
যাগফেলর জ আরও একিট প ারািমটার িনেত পার আবার চাইেল সবেশেষ িগেয় থম ভােগর
যাগফলেক মাট যাগফল হেত বাদ িদেলই তু(িম ি )তীয় ভােগর যাগফল পেয় যােব। যাই হাক,
এভােব করেল আমােদর time complexity O 2n হেব। কারণ আমরা n িট সংখ ায় িগেয় ভােব
চ া করিছ। থমবার চ া করিছ এেক থম ভােগ ফলেত, পেরর বার চ া করিছ এেক ি তীয় ভােগ
ফলেত। তরাং n বার আমরা 2 ভােব চ া করিছ অথাৎ 2n (যিদ " কন 2n "- এটা বুঝেত সম া
হয় তাহেল তামরা combinatorics বা discrete math িনেয় একটু পড়া না করেত পােরা)।
Backtrack না কেরও আমরা খুব সহেজ এটা সমাধান করেত পাির। 0 হেত 2n − 1 এর মােঝ
িতিট সংখ ার binary representation ক না কর২ । অথাৎ এই সংখ া িলেক n bit এর binary
সংখ া িহেসেব ক না কর। n িট 0 আর 1 িদেয় তির সব সংখ া তুিম পেয় যােব। আমরা এেক
এেক এই সকল সংখ া িলেক েসস করব। মেন কর একিট সংখ া িনলাম। এবার এর 0 ওয়ালা ান
িলেক থম েপ আর 1 ওয়ালা ান িলেক ি তীয় েপ ফল। িত ভােগর যাগফল বর কর।
এরপর তােদর মােঝর পাথক বর কর। উদাহরণ প মেন কর য আমােদর n হেলা 2. তাহেল 0
হেত 22 − 1 = 3 পয সংখ া িল (এবং তােদর binary প) হেলা 0(00), 1(01), 2(10), 3(11).
00 এর মােন হেলা আমােদর িট সংখ ােকই থম েপ িনেয়িছ, 10 এর মােন হেলা আমরা থম
সংখ ােক (আশা কির একটু িচ া করেল বুঝেত পারেব য i তম least significant bit, i তম সংখ া
িনেদশ কের যখােন আমরা সংখ া িলেক 0 indexed ভােব ক না করিছ, মােন থম সংখ া আেছ
0 তম িবেট) থম েপ আর ি তীয় সংখ ােক ি তীয় েপ ক না করিছ। এভােব(বািক)2 আর
3 কউ একই ভােব েসস করেত পাির। এই সমাধােনর time complexity হেব O n2n কারণ
তামরা 0 হেত 2n − 1 এর লুপ চালােনার পর আরও একিট n দেঘ র লুপ চািলেয় 0-1 দেখ দেখ
ভােগ ভাগ করছ। Backtrack এর ে ও তুিম যিদ ভাগ করার পর আবার লুপ চািলেয় দখেত
কােক কান েপ ফেলছ তাহেলও এই অিতির n চেল আসেতা তামার complexity ত। িক
উপেরর backtrack সমাধােন আমরা তা না কের যখন কােনা সংখ ােক থম ভােগ ফেলিছ তখনই
থম ভােগর যাগফলেক আপেডট কেরিছ। ফেল আমােদর আর অিতির n এর লুপ লােগ নাই।
িক আমােদর একটু আেগ বলা bitmask এর সমাধােন আমরা অিতির একিট লুপ চালাি 0-1
এ ভাগ করার জ । এজ আমােদর সমাধােন অিতির n চেল এেসেছ।
এখন কথা হেলা bitmask প িতর সমাধান হেত আমরা অিতির n বাদ িদেত পাির িক না। মেন
কর mask নােমর ভ ািরেয়বলেক (bitmask এর সংি প) 0 হেত 2n −1 পয লুপ চালাি এবং
িতিট mask এর জ আমরা ই ভােগর সংখ ার যাগফল বর কির (আমরা mask এর িবট িল
দেখ িঠক কের ক কান ভােগ যােব)। এর আেগই বেলিছ, আমােদর আসেল ই ভােগর যাগফল
রাখার দরকার নই, ধু এক ভােগর যাগফল জানেল আমরা মাট যাগফল হেত অপর ভােগর
যাগফল সহেজই বর করেত পারব। তরাং মেন কর আমরা ধু যই ভােগ 1 িবট ওয়ালা সংখ া
আেছ তােদর যাগফল জািন। এখন ধর আমরা এখন mask = x এ আিছ। এর মােন mask < x
এর জ ইেতামেধ ই আমরা 1 িবেটর ভােগর সংখ ার যাগফল জািন। এখন যখন mask = x এ
এেল তখন এর যেকােনা একিট on (1) িবট নাও। এেক শূ কের দাও (mask^ = 1). এই নতুন
mask এর sum িক তুিম জােনা কারণ on িবটেক শূ কের দয়ার ফেল তামার নতুন mask
িট বতমান mask এর থেক ছাট হেয় িগেয়েছ। তাহেল এই ছাট mask এর জ আমােদর আেগ
পাওয়া যাগফল এর সােথ আমােদর on িবেটর সংখ া যাগ কের আমরা নতুন mask এর জ
যাগফল বর কের ফলেত পাির। িক কথা হল এই on িবট বর করেতই তা আমােদর n এর
১ া ািমং কে ট : ডটা াকচার ও অ ালগিরদম বইেয়র Dynamic Programming সকশেন Coin change dp
এর নানা variation পােব।
২ এই প িতেক আমরা bitmask প িত নাম িদেত পাির কারণ আমরা "all possible" bitmask এর উপর িদেয় লুপ
চালাি ।
১৮
একিট লুপ লাগেব। না তা লাগেব না যিদ তুিম একটু বুি করেত পােরা। খয়াল কর আমােদর িক
যেকােনা on িবট িনেলই চলেব। আমরা িক খুব সহেজ বলেত পাির অমুক সংখ ার অমুক িবটটা on
আেছ? পাির, 2 হেত 3 এর 2nd bit টা সবসময় on, 4 হেত 7 এর 3rd bit টা, 8 হেত 15 এর
4th bit টা এরকম কের 2i−1 হেত 2i − 1 এর i তম িবটটা সব সময় on. তাহেল আমরা সরাসির
0 হেত 2n − 1 এর লুপ না চািলেয় 0 হেত n − 1 পয i এর একটা লুপ চালােবা। আর এর ভতের
আেরকটা লুপ চালােবা সই সই mask িদেয় যােদর i তম িবট(আমােদর
) এই observation এ on
অথাৎ 2i হেত 2(i+1) − 1 পয । তাহেলই complexity O 2n হেয় যােব। তামােদর িবধার
জ backtrack আর bitmask প িতর কাড ২.২ এ দওয়া হেলা। তামরা চাইেল এেক অ
ভােবও কাড করেত পার।
১৯
শষ করার আেগ একটা িজিনস। তামরা চাইেল ধের িনেত পােরা য n তম িজিনস সবসময়
থম
( েপ
) থাকেব, এরপর বািক িজিনস িলেক সব ভােব ভােগ ভাগ করেব। তাহেল complexity
O 2n−1 হেয় যােব।
সমস া: 0 হেত 109 রে র একিট সংখ া N দয়া থাকেব। তামােক সবেচেয় ছাট ধনা ক সংখ া
Q আউটপুট িদেত হেব যন Q এর অ িলর ণফল N হয়। যিদ এমন কান সংখ া না পাওয়া যায়
তাহেল −1 ি ট করেত হেব। যমন N = 10 এর জ Q হেব 25.
সমাধান: থমত দখ Q এর িডিজট িল ন করেল N পাওয়া যায়। অথাৎ আমােদর জানা দরকার
কান কান সংখ া িদেয় N ক ভাগ করা যায়। যিদ N ক 2, 3, . . . 9 িদেয় যতবার ভাগ যায় ততবার
ভাগ দবার পরও দেখা য N তখনও 1 হয় নাই এর মােন এর জ আসেল কােনা Q পাওয়া
স ব নয়। যমন N যিদ 26 হয় তাহেল দখেব 2 হেত 9 সব সংখ ািদেয় যত বার ভাগ দওয়া স ব
ভাগ দওয়া হেয় গেল 13 বািক থােক। এর মােন এর জ আসেল কােনা Q খুঁেজ পাওয়া যােব
না। কন? কারণ Q এর িডিজট িলেতা আসেল 2 হেত 9 ই হেব তাই না? 0 আর 1 িবেশষ
ছাড়া ব বহার য হেব না তা মেন হয় একটু িচ া করেলই বুঝা যায়। তরাং কােডর েতই তােদর
"specially handle" কের ফল। তাহেল আমােদর সংখ া ধুমা 2 হেত 9 িদেয় ভাগ যােব। বা
আমরা আেরকটু িচ া কের বেল িদেত পাির য N সংখ ািট 2, 3, 5 আর 7 prime িল িদেয় ভাগ
যােব, আর অ কােনা prime িদেয় নয়। তরাং আমরা বর কের ফিল N ক 2, 3, 5 আর 7
িদেয় কয়বার কের ভাগ করা যায়। এখন খয়াল কর আমরা চাইেল 3িট 2 ক এক কের 8 বানােত
পাির, এেত কের আমােদর উ র এর িডিজট সংখ া িক 2 ঘর কেম যায়। আবার আমরা চাইেল িট
2 ক এক কের 4 বানােত পাির, 2 আর 3 ক এক কের 6 বানােত পাির অথবা িট 3 ক এক
কের 9 বানােত পাির। তরাং তামােক িচ া করেত হেব তুিম কীভােব এেদরেক combine করেব
যােত সবেচেয় ছাট সংখ া পাওয়া যায়। আর আশা কির এটা বুঝছ য িডিজট িলেক ছাট হেত বড়
অডাের সািজেয় Q বানােত হেব (758 বানােনার চেয় 578 বানােনা লাভজনক)। এই পযােয় এেস
তুিম িনেজ থেক একটু িচ া কর কীভােব তুিম 2, 3, 5 ও 7 দর combine করেব। আসেল 5 আর
7 ক তা combine করার িকছু নই, combine করেত হেব 2 আর 3 ক। কারণ 5 আর 7 ক
কারও সােথ combine করেত গেল তা আর 1 িডিজেট থােক না।
এখন নানা case িচ া করা ছাড়া আসেল কােনা উপায় নই। যিদ ধু একটা 2 বা একটা 3
থােক তাহেল তা িকছু করার নই। যিদ ধু এক গাদা 2 থােক তাহেল তা িতনটা িতনটা কের িনেয়
যত ণ স ব 8 বানােনা লাভজনক। যিদ এরপর 4 বানােনা স ব হয় তাহেল 4 নাহেল আবার 2.
কন? তুিম 21 , 22 , 23 . . . 21 0 এরকম 10 িট N এর জ িচ া কর তাহেলই বুঝেব। কে টে
সবসময় মাণ করার দরকার হয় না। যিদও এটা িঠক য মাণ না কের কােনা িকছু করা risky
িক তাও, মাণ অেনক সময় সােপ ব াপার। এর থেক িকছু উদাহরন হােত হােত কের যিদ তুিম
িনেজেক বুঝ িদেত পার য এটাই িঠক- তাহেলই হেব। এর মােন এই না য এরকম করেল ভুল হয়
না! যাই হাক, একই ভােব 3 এর ে ও িচ া করেত পার তেব সটা অেনক সহজ। এখন সম া
হেব যখন 2 ও থাকেব আবার 3 ও থাকেব। আবােরা িকছু ণ case analysis করেল বুঝেব থেম
9 বানােনার চ া করেত হেব, এরপর 8, এরপর 6, 4 এরকম। আেগই বেলিছ কন এরকম হেলা,
মাণ িক, এরকম ে কীভােব িচ া করব এতসব কের সবসময় লাভ নই। Case analysis
কের intuition এর িভি েত সমাধান দাঁড় করােত হেব।
যিদ codejam বা hackercup এর মত contest হয় যখােন একবারই submit করা যায়
সসব ে তামরা চাইেল একিট dp বা backtrack কাড কের দখেব তামার claim টা িক ধরা
যাক N = 1 হেত 1000 পয সিঠক িকনা। যিদ হয় তাহেল তুিম মাটােমািট সাহস পােব য হয়েতা
তামার সমাধান বড় N এর জ ও সিঠক।
২০
Timus 1020 Rope
সমস া: N (≤ 100) িট একই মােপর খুঁিটেক (সব খুঁিটই R ব াসােধর বৃ ) একিট convex polygon
এর N িট িব েত রাখা আেছ। একিট দিড়েক এই খুঁিট িলর চারপাশ িদেয় টানটান কের টানােনা হেল
সই দিড়র দঘ কত?
সমাধান: খুবই চমৎকার একিট সম া। খয়াল কর দিড়র িকছু অংশ টানটান আর িকছু অংশ গাল
গাল। টানটান অংশ হল িট বৃে র মােঝ শক। যেহতু বৃ িল একই ব াসােধর সেহতু শেকর
দঘ তােদর কে র দূরে র সমান হেব। এর মােন দিড়র সাজা অংশ িলর দঘ হেব convex
polygon এর পিরিধর সমান। িক গাল অংশ িল? এটাও খুব একটা কিঠন না। খয়াল কর সব েলা
গাল অংশ জাড়া লাগােল একিট বৃ হয়। এটােক এভােবও িচ া করেত পােরা, মেন কর তুিম দিড়
ধের হাঁটা করেল। গাল অংশ েলােত এেস তুিম R ব াসােধর বৃ ধের একটু ঘুরছ এভােব করেত
করেত আবার র জায়গায় আসেব। এই পেথ তুিম িক ঘুের ঘুের 360◦ ঘুেরছ বা R ব াসােধর বৃ
পুেরাটা ঘুেরছ। বা তুিম চাইেল মেন মেন ল া অংশ িল বাদ িদেয় গাল অংশ িলেক জাড়া লাগােয়
দখেত পােরা। তরাং আমরা যিদ বৃে র পিরিধ এবং পিলগেনর পিরিধ যাগ কির তাহেল মত দিড়র
দঘ পেয় যাব।
২১
এ ইনপুট নেব আর এই string এর থম character থেক a এর ascii মান বাদ দেব আর ি তীয়
character হেত 1 এর ascii মান বাদ দেব (word[0] - 'a' এরকম)। মেন করা যাক আমােদর
ঘাড়া আেছ (r, c) ত। এখন এখান হেত ঘাড়ািট কান কান ঘর আ মণ করেত পাের? এসব
ঘরেক আমরা এভােব িলখেত পাির (r + 2, c + 1), (r + 2, c − 1), (r − 2, c + 1) এরকম কের
মাট 8 িট। (r + 2, c + 1) এর মােন তা বুঝছ? এর মােন হল বতমান রা হেত ই রা িনেচ এবং
বতমান কলাম হেত এক কলাম ডােনর ঘর। এরকম কের একিট ঘাড়া 8 িট মুভ িদেত পাের আর
আমরা এই িতিট মুভ কই এরকম (r + 2, c + 1) এর মত কের কাশ করেত পাির।
িক সম া হল এই 8 িট ঘেরর িতিটই আমােদর দাবার বােড নাও থাকেত পাের। যমন
আমােদর বতমান সল যিদ হয় a1 তাহেল িক (r − 2, c − 1) বেল িকছু নই। তরাং আমােদর
চক কের দখেত হেব কান কান ঘর দাবার বােড আেছ (0 ≤ newR ≤ 7 এবং কলােমর ে ও
একই ধরেনর চক)।
আমরা চাইেল এই নতুন অব ান িল হােত হােত িলখেত পাির। অথবা চাইেল সহেজ কাড করার
জ row বরাবর অব ান পিরবতন এবং column বরাবর অব ােনর পিরবতনেক িট অ ােরেত রেখ
িদেত পাির: dr[] = {2, 2, −2, −2, 1, 1, −1, −1} ও dc[] = {1, −1, 1, −1, 2, −2, 2, −2}.
এরপর i এর একিট লুপ চালাব 0 হেত 7 পয এবং চক কের দখব (r +dr[i], c+dc[i]) আমােদর
বােডর ভতের আেছ িকনা। এভােব খুব চমৎকার ভােব অেনক ছাট কের কাড হেয় যােব।
সমাধান: এিট আমার অ তম পছে র একিট সম া। কারণ আমােদর দেশর বিশর ভাগ কেলজ
বা িব িবদ ালয় পড়ুয়া ছা ছা ীেদর এিট সমাধান করেত িদেল বশ confusion এ পের যােব িক
এর সমাধান ুল পড়ুয়ারাও বুঝেব বা চ া করেল িনেজ থেক বর করেত পারেব বা আসেল ুল
কেলজ থেকই আমরা এই ব াপাের ধারনা িনেয় এেসিছ।
আমরা আসেল ভােগর সময় কী কির? ভাগ দই, ভাগেশেষর িপেছ একিট শূ বসাই (হর লেবর
থেক বড় ধের িনি ), আবার ভাগ দই, আবার ভাগেশেষর িপেছ শূ বসাই এভােব চলেত থােক।
এখন খয়াল কর যিদ কখনও ভাগেশষ পুনরাবৃি হয় তাহেল িক ভাগফেল আমরা যই িডিজট িল
বিসেয়িছ তারাও িক পুনরাবৃি হেব, অথাৎ পৗেনাপুিনক। এখন বলত যেকােনা a ক b িদেয় ভাগ
করেলই কী এই পৗেনাপুিনক পাওয়া যােব? াঁ। কারণ তামার ভাগেশষ তা আসেল 0 হেত b − 1
এর মােঝই হেব তাই না? যেহতু মা b রকেমর ভাগেশষ হেত পাের সেহতু এক সময় না এক
সময় পুনাি ি হেবই। িক িব াস হে না? মেন কর আমরা 2 ক 15 িদেয় ভাগ করিছ। থেম তা
ভাগেশষ 2 িনেজই। এর পর 5, এর পর 5 এবং 5 চলেতই থােক। এ জ আসেল ি তীয় িডিজেটর
পর পৗেনাপুিনক চলেত থাকেব 0.1(3). এবার একটু কিঠন উদাহরণ নয়া যাক, 655/990. থেম
ভাগেশষ 655, এর পর 610, এর পর 160, এর পর 610. তাহেল এর পর থেক 160, 610,
160, 610 এরকম চলেত থাকেব। অথাৎ আমােদর থম িডিজেটর পর পেরর িট িডিজট বার বার
পুনরাবৃি হেত থাকেব। আমােদর উ র হেব 0.6(61). যেহতু b খুব একটা বড় না সেহতু নানা
ভােব এর সমাধান করা স ব।
মেন কর আমরা একিট 0/1 এর অ াের রেখিছ। েত সব ােন 0 থাকেব। এখন আমরা ভাগ
দওয়া করব। ভােগর পের যই ভাগেশষ থাকেব আমরা অ ােরর সই ভাগেশেষর ােন িগেয় 1
িলেখ রাখব। িক যিদ দিখ আেগই 1 আেছ এর মােন আমােদর ভাগ সাইেকেল পেরেছ। আর আমরা
এখন জেন গিছ এই সাইেকল কান ভাগেশষ থেক হেয়েছ, ধরা যাক এই ভাগেশষ হল x।
এখন আবার আমরা এই কাজটু করব। আবার থেক ভাগ করা কির। যখন আমরা x ক
ভাগেশষ িহসােব পাব এর মােন আমরা এখন সাইেকেল ঢুকিছ। এরপর আবার যখন x পাব, এর মােন
আমােদর সাইেকল শষ। এভােব আমরা পুেরা ভাগফলেক পৗনপিনক িহসােব ি ট করেত পাির।
২২
২.১ অ শীলনী
২.১.১ সম া
Simple
Timus 1264 Workdays Timus 1293 Eniya
UVa 1583 Digit Generator Timus 1409 Two Gangsters
Timus 2012 About Grisha N Timus 2023 Donald is a postman
UVa 133 The Dole Queue UVa 1368 DNA Consensus String
Easy
Timus 1025 Democracy in Danger Timus 1313 Some Words about Sport
Timus 1079 Maximum Timus 1149 Sinus Dances
Timus 1319 Hotel UVa 340 Master-Mind Hints
Medium
২.১.২ িহ ট
UVa 272: সম াটা কিঠন না। িবিভ জন িবিভ ভােব ইনপুট নেব। আিম য ভােব নই তাহেলা
gets ব বহার কের। আিম আসেল scanf, printf আর gets এর বাইের িকছু ব বহার কির না
ইনপুট আউটপুেটর জ । এসব ব বহােরর জ য সাবধানতা অবল ন করেত হয় তা িনেয় আিম
ইেতামেধ ই " া ািমং কে ট ডটা াকচার ও অ ালগিরদম" বইেয় বেলিছ। তরাং তা আবােরা
পুনরাবৃি করিছ না, ধু জািনেয় রাখলাম য gets ব বহার করেল একটু সাবধান হেত হয়।
২৩
যায় তােত থাকা ঘর িলর জ row এর id আর column এর id এর যাগফল িক একই হেব।
আশা কির এই ি কটা ইেতামেধ ই তামরা জােনা। তাহেল একটু িচ া কের দেখা এই ি ক খািটেয়
কীভােব সহেজ এই সম া সমাধান করা যায়। িট নে ড লুপ চািলেয়ই িক সম া সমাধান কের
ফলেত পারেব!
Timus 1079: n এর সবেচেয় বড় মান িদেয় ট করেত ভুেল যও না। ক জােন overflow হয়
িকনা!
Timus 1149: ফাংশন, লুপ ইত ািদর ব বহার ঝালাই কের নবার জ খুবই ভাল একিট সম া।
এখােন আসেল িশখােনার তমন িকছু নই। তুিম িনেজ একটু ধীের ে ঠা া মাথায় িচ া কের কাড
কের ফল তাহেলই হেব।
২৪
অধ ায় ৩
STL াকিটস
২৫
লাইন িলখেত হেব (একবার িলখেলই চলেব)। এখন কােড তুিম যিদ িলখ "sort(A, A + N)" তাহেল
A[0] হেত A[N - 1] পয সট হেয় যােব। যিদ তামােদর সংখ া িল A[1] হেত A[N] থােক তাহেল
তামােদর িলখেত হেব "sort(A + 1, A + N + 1)"। মাট কথা তামােদর যিদ A[a] হেত A[b]
পয sort করেত হয় তাহেল িলখেত হেব "sort(A + a, A + b + 1)". কন এভােব িলখবা তা
জানেত হেল pointer িনেয় একটু পড়া না করেত হেব তামােদর।
সট তা করা হেলা, িক কীভােব বর করেব য query এর সংখ া এই অ ােরেত আেছ িক
না, থাকেল থেম কাথায় আেছ? এজ তামরা চাইেল িনেজ থেক binary search এর কাড
করেত পােরা অথবা stl এর lower bound বা upper bound ব বহার করেত পােরা। এেদর ব বহার
করেতও algorithm হডার ফাইেলর দরকার। Lower bound আর upper bound এর কানটা
য িক দয় তা আমার কখনই মেন থােক না। যখন ব বহার কির তখন নেট দেখ নই। Lower
bound ও upper bound ই ে ই আমােদর একিট সট করা অ াের িদেত হয় আর একিট সংখ া
িদেত হয়। Lower bound অ াের এর সই ান দয় যখােনর সংখ া query এর সংখ ার সমান বা
বড় এবং এেদর মােঝ সবেচেয় আেগর ান দয়। আর upper bound দয় এমন ান যার সংখ া
query এর সংখ া থেক বড় এবং এেদর মােঝ সবেচেয় আেগর ান দয়। যমন তামার অ াের
যিদ হয় 1, 2, 2, 4, 5 তাহেল 2 এর lower bound যিদ call করা হয় সিট িদেব থম 2 এর
ান, আর যিদ upper bound ক call করা হয় তাহেল িদেব 4 এর ান। এই lower bound বা
upper bound এর ফাংশন কীভােব call করেত হয়? "lower bound(A, A + N, q)" যখােন
A অ ােরেত 0 indexed ভােব তুিম স া িল রেখছ। একটা িজিনস, এইেয বললাম অমুেকর ান
দেব - এই ােনর মােন িক? Index? না, ওই ােনর pointer. তরাং তামরা যিদ index চাও
তাহেল এই lower bound এর return মান হেত A িবেয়াগ কের নেব। তাহেলই 0-indexed
অ াের পিজশন পেয় যােব। অথাৎ তামােক িলখেত হেব "lower bound(A, A + N, q) - A".
তাহেল তুিম index পেয় যােব। িক যিদ আমােদর অ াের 0 indexed না হেয় 1 indexed হত
তাহেল কীভােব কল করেত? িঠক sort ফাংশেন যভােব িশেখিছ সভােব "lower bound(A+1,
A+N+1, q)".
এখন আশা যাক এেদর time complexity ত। অেনেক মেন কের এটা তা binary search
এর মত, তরাং এর time complexity হেব লগািরদম। কথাটা িঠক আেছ আবার িঠক নই। সিত
কথা বলেত সব সময় এর complexity লগািরদম না। অ াের বা ভ র বা এই জাতীয় random
access করা স ব এরকম data structure এর ে এরা লগািরদম (random access করা
যায় মােন constant
( ) সমেয় যেকােনা index ক access করা যায় এরকম)। অ ে এরা
িলিনয়ার (O n ) যমন list, set ইত ািদ।১ এসব ে linear সময় লােগ কারণ list বা set
এসেবর ে i তম index এ ক আেছ এটা constant সমেয় বর করা স ব না। তাই এসব
ে স এেক এেক সকল element দেখ এরপর lower bound বা upper bound এর মান
িনণয় কের।
যাই হাক, তামরা চাইেল আরও সহেজ এই সম া সমাধান করেত পারেত। সট করার পর
তুিম একিট অ ােরেত িলেখ রাখেত পােরা য, কােনা একিট সংখ া সেটড অ ােরেত কাথায় থম
এেসেছ। এই কাজ তা িলিনয়ার সমেয়ই করা যায়। মেন কর সট করা অ ােরর শষ হেত েত যােব
এবং িলখেব য place[A[i]] = i তাহেলই হেব। িক যিদ আমােদর ইনপুেটর সংখ া িল 10,000
এর থেক বড় হয়, অেনক বড়? িচ া কর- এে ে সম া িক? সম া হল আমরা এেতা বড়
সংখ ােক index িহসােব ব বহার করেত পাির না বা করেত হেল যত বড় অ ােরর েয়াজন তত
বড় অ াের আসেল নওয়া স ব না। এই অব া থেক মুি িদেত পাের stl এর map. মেন কর
তামার কােছ িকছু নাম আেছ আর তার বয়স আেছ। তুিম M["hasan"] = 3 করেল hasan এর
িবপে 3 থাকেব এই ম ােপ। তুিম যিদ পের কখনও (যতবার) M["hasan"] কর 3 পােব। ম াপ
ব বহােরর জ তামােক map নােমর হডার ব বহার করেত হেব। এিট declare করার syntax
হেলা "map<string, int> M;" অথাৎ যই টাইপেক ম াপ করবা তা েত, আর যই টাইেপ ম াপ
করবা তা শেষ। এখন তুিম একিট অ ােরর মত কের ব বহার করেত পােরা এেক। "M[?] = ?"
কের তুিম map এ মান রাখেত পােরা আবার "? = M[?]" কের ম াপ থেক কােনা িকছুর মান
১ Set এর ে এর িনজ lower bound ও upper bound আেছ। অথাৎ যিদ "set<int> S" নােম একিট set তামার
কােছ থােক তাহেল তামরা "S.lower bound(q);" এভােব lower bound ব বহার করেত পােরা এবং তা লগািরদিমক হেব।
সাধারণ "lower bound(S.begin(), S.end(), q);" করেল িক িলিনয়ার সময় লাগেব।
২৬
বর করেত পােরা। িঠক অ ােরর মত। তরাং ইনপুেটর মান যিদ অেনক বড় হয় সে ে তামােক
long long
( ক )int এ ম াপ করেত হেব। Map এ কােনা িকছু রাখেত বা খুঁেজ বর করেত সময়
( )
লােগ O log n যখােন n হল map এর সই মুহূেতর সাইজ। আর n িট িজিনস রাখেত O n
memory লােগ।
২৭
িলখেত হেব V.resize(100, 0). তামােদর যিদ n সাইেজর একিট অ াের লােগ তাহেল n ইনপুট
নবার পর V.resize(n) কের n সাইেজর অ াের বািনেয় ফলেত পােরা V ক। এর পর সাধারণ
ভােব &V[i] বা V[i] িদেয় ইনপুট আউটপুট বা িহসাব করেত পােরা।
তাহেল তামরা এই সম া vector ব বহার কের সমাধান কের ফলেত পার। য কয়িট অপাের-
শন দওয়া আেছ স েলা implement করেত হেল আমােদর জানেত হেব কান pile এ আমােদর
সংখ া আেছ। সই কাজ তামরা িত pile এ িগেয় তােত লুপ চািলেয় কের ফলেত পারেব। আবার
কােনা pile থেক যিদ উপেরর সংখ া সরােত চাও তাহেল pop back ফাংশন ব বহার করেব। কা-
না pile এ নতুন সংখ া ঢুকােত হেল push back ফাংশন ব বহার করেত পারেব। এরকম কের
vector ব বহার কের খুব সহেজই এই সম া সমাধান করা স ব।
২৮
while(iS >> w) যখােন w হেলা একিট stl এর string (string w). এবার এই শ েক stl এর
set এ ঢুিকেয় িদেলই হেয় যােব।
set ও istringstream এর যা ব বহার দখালাম এর বািহের তমন কােনা ব বহার নই, অ তঃ
আমার তমন লােগ না (set এর size ফাংশন ছাড়া)। set এ মােঝ মােঝ erase ব বহার করেত হয়,
কােনা একিট িজিনসেক set হেত মুেছ ফলার জ । এছাড়া lower bound বা upper bound
এর কথা তা আেগই বেলিছ। তুিম যিদ নেট কােনা একিট stl এর নাম িলেখ সাচ দাও তাহেল ব
উদাহরন পাবা।
2 এর বিশ 1 থাকেব না। কীভােব বুঝলাম? সহজ, িকছু ণ আেগই বেলিছ আমােদর i তম 1
31
থাকেব i2 এ (একদম
√ িঠক কের বলেল (i(i + 1)/2 + 1) এ)। তরাং আমরা বলেত পাির 231 এর
ভতের মাট 231 িট 1 থাকেব। আমরা খুব সহেজই একিট লুপ চািলেয় সব 1 এর ান বর কের
ফলেত পারব (মােন ফমুলায় না কের 0 + 1 + . . . i এর কাজ লুেপ করা) এবং তােদর একিট set এ
রাখেত পারব। এরপর িত ইনপুেট চক কের দখেত পােরা য set এ তামােদর ইনপুেটর সংখ া
আেছ িকনা। চাইেল তামরা ক কের িনেজ থেক binary search ও করেত পােরা। অথবা stl এর
count, find, lower bound বা upper bound ও ব বহার করেত পােরা।
২৯
এর িভি েত িট অ রেক আলাদা মেন করা যােব না)। অথাৎ S1 আর S2 একই হওয়া যােব না
(S1 != S2) আর এেদেরক সট করার পর (sort(S1.begin(), S1.end()) ও S2 এর জ ও একই
রকম) ও যিদ তােদর ভতের কােনা upper case letter থােক তােদর small case এ পিরনত
করার পর S1 ও S2 একই হেব (S1 == S2). এইেয একিট শে র সকল character ক সট
কেরছ এবং তার ভতের যিদ কােনা upper case letter থােক তােক lower case এ পিরনত
করছ এেক বেল একিট শ েক canonical form এ আনা। এেত লাভ িক? লাভ হেলা- তামরা তা
মুল শ দেখ সরাসির বুঝেতিছেল না য এই িট শ anagram িকনা িক তােদর canonical
form দেখ সহেজই বুঝেত পারেব তারা anagram িকনা। অব এই সম ার ে canonical
form এর পাশাপািশ তামােক জানেত হেব মুল শ িট িক। কারণ িট শ িনেজরাই যিদ একই হয়
তাহেল তা আর তারা anagram হেব না।
এটু যিদ বুেঝ থােকা তাহেল আমার মেন হয় set ব বহার কের সম াটা সমাধান কের ফলেত
পারেব। তাও বিল। িট শ anagram হওয়ার শত িট। এক- তােদর একই হওয়া যােব না, ই-
তােদর ভতের একই অ র িল অ অডাের বা অ case এ থাকেত পাের। আমরা এেক এেক এই
িট শত েয়াগ করব। থেমই আমরা আমােদর ইনপুেট দওয়া সব শ েক একিট সেট ঢুকাব। তা-
হেল যিদ একই রকম িট শ থেক থােক আমরা তােদর পিরবেত একিট শ পাব। আমােদর থম
শত পুরন হেয় িগেয়েছ। এবার ি তীয় শত। আমােদরেক িতিট শে র জ তার canonical form
বানােত হেব। এখন এই একই canonical form ওয়ালা শ িলেক আমােদর বাদ িদেত হেব। কীভা-
ব? আমরা িট সট নব। একিট সেট থাকেব সসব canonical form যােদর anagram এখনও
খুঁেজ পাওয়া যায় নায়। অথাৎ ananagram শ িলর canonical form এর সট। আর আেরক
সেট থাকেব anagram শ িলর canonical form. আমরা এেক এেক শ িল আর তােদর
canonical form েসস করব। থেমই দখ নতুন শে র canonical form িক ananagram
এর সেট আেছ িকনা। যিদ থােক এর মােন এিট anagram. আমােদরেক ananagram এর সট
হেত সই canonical ফমেক মুেছ ফলেত হেব আর এই canonical form ক anagram এর
সেট insert করেত হেব। িক যিদ এই শ ananagram এর সেট না থােক তাহেল আমরা দ-
খব anagram এর সেট আেছ িকনা। যিদ থােক তার মােন এই শ ও anagram. যেহতু এই
canonical form ইিতমেধ ই anagram এর সেট আেছ সেহতু আমােদর করার িকছু নই। িক
anagram এর সেটও যিদ না থােক এর মােন এই শ িট আপাতত ananagram. তরাং এর
canonical ফমেক আমরা ananagram এর সেট insert করব। এই কাজ যিদ আমরা সকল
শে র জ কির তাহেল সব শ েসস শেষ আমরা সকল ananagram এর canonical form
পেয় যাব। এবার শষ কাজ- আমরা আবার আমােদর মূল শ আর তার canonical form এর িল
ধের ধের যাব। যিদ দিখ তার canonical form িট ananagram এর সেট আেছ তার মােন এই
শ িট ananagram. দাও ি ট কের। এরকম কের সকল ananagram ি ট করেত হেব। খ-
য়াল রখ, আমােদর ি ট করা শ িল িক lexicographcal order এ ি ট করেত হেব। কীভােব
করেব? যই শ িল ি ট করেব তােদর একিট set এ ঢুিকেয় তােদর ি ট করেত পার, বা একিট
vector এ ঢুিকেয় তােদর সট কের এরপর ি ট করেত পার। অথবা এইেয শষ লুেপ আমরা যখন
মুল শ আর তার anagram এর উপর লুপ চালাি লাম তখনই যিদ মূল শে র lexicographical
অডাের লুপ চালাই তাহেল আর ক কের আেরকিট set বা vector িনেত হেব না। আসেল আমরা
তা একিট set এ আমােদর সকল শ েক ঢুিকেয়িছলাম (আমােদর সমাধােনর থম সট) ঐ সেটর
উপেরই সবসময় কাজ করেলই হেব, আমােদর আর অিতির set বা vector িনেত হেব না।
৩০
িছল) ি তীয়িটর ভতের ঢুিকেয় িদেত হেব। যমন মেন কর A = {{}, {{}}} stack এর উপের
আেছ আর B = {{}, {{{}}}} stack এ উপর থেক ি তীয় ত আেছ। তাহেল এেদর union হেব
{{}, {{}}, {{{}}}}, intersection হেব {{}} আর add হেব {{}, {{{}}}, {{}, {{}}}}.
িতিট অপােরশেনর পর তামােক stack এর উপের থাকা সেটর সাইজ ি ট করেত হেব।
সমাধান: ও বাবা! সেটর সট! তেব এই দেখ ভয় পেয় গেল হেব না। আমােদর সমাধান করেত
হেব। আমরা যা করেত পাির তাহেলা িতিট সটেক একিট কের id িদেত পাির। ফেল একিট সেটর
ভতের যিদ কেয়ক ধাপ nested সটও থােক আমরা আসেল তার id িনেয় কাজ করব, সই nested
সট িনেয় না। অথাৎ িতিট সট এখন আসেল একিট id, আবার কােনা একিট সট বা id হেলা
অ িকছু id এর সট বা set<int>. stack এর উপেরর সেটর সাইজই হেলা আমােদর িত
অপােরশেনর পর উ র। যখনই নতুন কােনা সট তির হেব আমরা map এ দেখ নব য এই
সট আেগই এেসিছল িকনা, আর না আসেল তােক একিট নতুন id িদব। অথাৎ আমােদর map হেব
map<set<int>, int> অথাৎ এিট একিট int এর সট ক int এ map কের। এছাড়াও আমােদর
আেরকিট reverse map এর দরকার হেব অথাৎ কান id ত কান সট। তেব সজ তামরা
চাইেল map না ব বহার কের একিট vector ব বহার করেত পােরা (vector<set<int>>). আর
সব শেষ আমােদর একিট stack লাগেব। চাইেল তামরা সেটর stack িনেত পােরা, আবার চাইেল
id এর stack িনেত পােরা। id এর সট নওয়া মেন হয় িবধা জনক।
মেন কর আমরা একিট id এর stack িনলাম। Push বলেল আমরা একিট ফাকা সট িনেয় দখব
map এ ইেতামেধ ই এরকম কােনা সট আেছ িকনা, না থাকেল এেক একিট নতুন id িদেয় map
এ রাখব এবং সই id আমােদর stack এ push করব। Dup বলেল আমরা stack এর উপেরর
element িনেয় তােক আবার push করব। Union বা Intersect বলেল আমরা stack হেত িট
id িনেয় আমােদর vector হেত দখব এরা কান কান set. এর পর সই িট সেটর মােঝ union
বা intersect কের পাওয়া নতুন সটেক map, stack ও vector এ রাখব (এমনও হেত পাের য
map এ ইেতামেধ ই আেছ, সে ে map বা vector এ রাখার দরকার নই)। সবেশেষ Add এর
ে আমরা একিট id ক ওপর সেট ঢুিকেয় আেগর মত map, stack ও vector ক আপেডট
করব। এখােন একটা িজিনস খয়াল রখ, vector এ থাকা আেগর সটেক যন পিরবতন কের বস
না। id ক সেট insert করার আেগ তামােক সই সট copy কের িনেত হেব। এসব ছাট খাট ভুল
হেতই পাের। তামােদরেক debug কের কের বর করেত হেব এসব ভুল।
আমরা মাটােমািট map ও vector এর ব বহার ইেতামেধ ই দেখ ফেলিছ। এবার দখা যাক
stack এর ব বহার। আিম ধের িনি তামরা stack নামক ডটা াকচার ইেতামেধ ই জােনা। এিট
ব বহােরর জ আমােদর দরকার stack নামক হডার ফাইল। একিট int এর stack ক declare
করেত হয় stack<int> S এরকম কের। এর দরকাির ফাংশন িল হেলা push(x) - তাহেল x পুশ
হেয় যােব। pop() - তাহেল উপেরর element মুেছ যােব। খয়াল কর pop িক িকছু return কের
না, কবল উপেরর element ক ফেল দয়। top() - stack এর উপেরর element ক return
করেব তেব এিট মুেছ যােব না। empty() - এিট true দেব যিদ তামার stack ফাঁকা হয়। size()
- এিট stack এর সাইজ বলেব।
৩১
দাও। যিদ ফাকা হয় তাহেল তােক সই queue ত ঢুিকেয় দাও এবং সই সােথ তার দলেক (মােন
তার দেলর id ক) িবেশষ queue ত ঢুিকেয় দাও। বর করার সময় দেখা িবেশষ queue এর
েত কান দল আেছ, সই দেলর queue এর সামেনর জনেক বর কের দাও। যিদ এর ফেল
সই queue ফাঁকা হেয় যায় তাহেল তার দলেক িবেশষ queue হেত বর কের ফল। তাহেলই এই
সম া সমাধান হেয় যােব।
Stl এর queue ব বহােরর জ আমােদর queue হডার ফাইল লাগেব। int এর queue ক
declare করেত হয় queue<int> Q এর মত কের। এর দরকাির ফাংশন িল হেলা- push(x) -
x পুশ হেয় যােব, pop() - পপ হেব িক এিট কােনা িকছু িরটান করেব না, front() - queue এর
সামেনর িজিনস িরটান করেব তেব পপ হেব না, size(), empty() ইত ািদ অ া stl এর মতই
কাজ করেব।
৩২
জাড়া একািধক বার এেসেছ তার মােন এরকম r1 , r2 পাওয়া যােব। যেহতু আমােদর ধু াঁ না
বলেলই চলেব না, r1 , r2 ও িদেত হেব, সেহতু আসেল আমােদর set িদেয় কাজ চলেব না। একিট
map িনেত হেব আর িলেখ রাখেত হেব য এই string জাড়া অমুক row ত এেসিছল। যখন আমরা
নতুন row ত এেস নতুন string জাড়া পােবা তখন আমরা map এ দখেবা এর আেগ এই জাড়া
এেসিছল িকনা বা আসেলও কাথায়। এভােবই আমরা আমােদর দরকাির r1 , r2 পেয় যাব।
এখন কােড আসা যাক। থম আমরা string জাড়া বানাব কীভােব? তামরা চাইেল একিট
vector িনেয় তােত string িল রাখেত পােরা। অথবা চাইেল একিট structure ক declare
কের তােত আমােদর িট string রাখেত পােরা। এর পর সই structure ক map করেত পােরা।
তেব সে ে সম া হেলা তামােদর সই structure এর comparison function িলখেত হেব।
এজ তামােদর < operator িট overload করেত হেব। এ িবষেয় তামরা নেট অথবা " া ািমং
িতেযািগতা" বইেয় দেখ িনেত পােরা। চাইেল অপােরটর ওভারেলাড না কের functor ও declare
করেত পােরা। তুিম যিদ vector ব বহার করেত তাহেল কােনা operator overload এর দরকার
হত না, কারণ string এবং vector জেনরই < operator ভাল মতই define করা আেছ।
তেব এই সম ার ে আমার কােছ িবধা জনক উপায় মেন হয় string এর pair নওয়া।
Pair হেলা stl এর একিট িজিনস। এেক আসেল ই member variable ওয়ালা একিট structure
ক না করেত পােরা। এিটর জ দরকার utility নামক হডার ফাইল। এিট declare এর উপায়
হেলা pair<string, string>. যিদ একিট variable এ তুিম একিট pair রাখেত চাও তাহেল তুিম
এরকম িলখেত পােরা "pair<string, string> P = make pair(A, B);" যখােন A ও B িট
string. কােনা একিট pair এর থম element ক ব বহার করার জ িলখেত হয় "P.first" আর
ি তীয়িটেক ব বহােরর জ "P.second". Pair এর িবধা হেলা এই ে তুিম যিদ pair এর
vector বা array িনেয় তােদর sort করেত চাও তাহেল কােনা অিতির comparison ফাংশন
িলখেত হেব না। তেব এর সম াও আেছ। ায়ই দখা যায় য িকছু র কাড করার পর মেন হয়
আহা আেরকটা variable থাকেল মেন হয় ভাল হয়। সে ে pair ক extend করা স ব হয় না।
তখন দখা যায় আমােদর নতুন কের structure বানােত হয়। এর ফেল অেনক কাড পিরবতন হয়।
এখন অব tuple আেছ। তামরা চাইেল tuple ব বহার করেত পােরা। আিম খুব একটা ব বহার
কির নাই এিট।
তাহেল string জাড়া represent করার ঝােমলা তা গল। িক আমােদর ইনপুট তা র
কের কলাম েলা আলাদা করা থাকেব না। সেলর মান িল কমা ারা পৃথক থাকেব। তােদর আলাদা
করা যায় কীভােব? বুি হেলা string এর push back ফাংশন ব বহার করা। gets িদেয় ইনপুট
িনেয় (কারণ লাইেন space থাকেত পাের) এর পর কমা না পাওয়া পয push back ফাংশন
ব বহার কের string বানােত থােকা। কমা পেল বা লাইন শষ হেয় গেল এই string ক ধের
একিট vector এ ঢুিকেয় দাও। তাহেল েসস শেষ একিট row এর িতিট column এর মান
আলাদা আলাদা কের vector এ পেয় যােব।
৩৩
( )
এর অ ালগিরদেম কােনা সম া হেব না। O n2 কারণ- হয়েতা িতবার সব কাজ দখার পর সব
( ) ( )
শেষরটা আমরা নব। তাহেল O n বার O n সাইেজর অ াের বা queue আমােদর ঘঁেট দখেত
( )
হে । আর িতবার priority queue থেক একিট সংখ া ফলেত সময় লােগ O log n . তরাং
( )
n িট িজিনস ফলেত সময় লাগেব O n log n . priority queue এর উপেরর সংখ া কত এই
ে র উ র পেত আসেল constant সময় লােগ।
একিট িজিনস, priority queue ব বহােরর জ তামােদর লাগেব queue নােমর হডার ফা-
ইল। এছাড়া সব কাজ queue এর মত, ধু মা এর front() ফাংশন না থেক থাকেব top() নামক
ফাংশন। এিট সবসময় এর ভতের থাকা সেবা মানিট top এ রােখ। এই সম ার ে িক set
ব বহার করেত যেয়া না। কারণ set এ একিট সংখ া একািধক বার insert করেলও সিট মা এক-
বার থােক। তামরা চাইেল set এর পাশাপািশ একিট map িনেয় তােত সংখ া িলর count রাখেত
পােরা িক তােত মেন হয় ঝােমলা বিশ হেয় যায়। এর থেক priority queue ই ভাল।
৩.১ অ শীলনী
৩.১.১ সম া
Simple
UVa 1593 Alignment of Code UVa 1594 Ducci Sequence
UVa 10935 Throwing cards away I UVa 10763 Foreign Exchange
UVa 1595 Symmetry UVa 230 Borrowers
UVa 12504 Updating a Dictionary UVa 511 Do You Know the Way to San Jose?
Easy
UVa 1598 Exchange UVa 12333 Revenge of Fibonacci
UVa 212 Use of Hospital Facilities UVa 207 PGA Tour Prize Money
UVa 814 The Letter Carrier's Rounds UVa 221 Urban Elevations
৩.১.২ িহ ট
UVa 1594: কােনা একিট sequence এর আেগ এেসিছল িকনা এটা বুঝার জ তামরা চাইেল
vector এর map রাখেত পােরা। অথবা তামরা ধর 200 বা 500 বার চ া করবা য শূ পেয়
যাও িকনা, পেল তা হেয়ই গল। আর না হেল বেল দাও য হেব না। চাইেল বেস বেস মাণ করেত
পােরা কন 200 বা 500 যেথ !
UVa 10763: এই সম া সমাধােন তামরা pair এর িট vector িনেত পােরা। একিটেত সাজা
pair রাখেব আেরকিটেত উলেটা pair (a,b এবং b,a). এখন িট vector ক sort কের তােদর
== িদেয় compare কের দেখা। তাহেলই হেয় যােব।
UVa 207: তামরা তা %s িদেয় ইনপুট আউটপুট কেরছ, িক %20s বা %9.2lf বা %-20s
এরকম ব বহার কেরছ? না জানেল একটু নেট দেখ জেন নাও। এই সম া stl এর অধ ােয় রাখার
কারণ হেলা sort এর জ comparison ফাংশন িলখেত শখা।
UVa 814: এই সম ায় একিট িজিনস িশখেল মেন হয় ভাল হয়। তাহল string এর find ফাংশন।
এেক তুিম যিদ কােনা একিট character দাও তাহেল তামােক বেল দেব থেম সই character
৩৪
কাথায় আেছ। এছাড়াও এর আেরকিট দরকাির ফাংশন আেছ, তাহেলা substr(x, y)- এিট x হেত
y - 1 পয substring দয়। আশা কির এই িট ফাংশন ব বহার কের তামরা email address
ক ই অংেশ ভে ফলেত পারেব। না পারেলও সম া নাই, শষ আ য় for loop তা আেছই।
৩৫
৩৬
অধ ায় ৪
Mathematics স িকত সম া
সমাধান: তামরা িট উপােয় আগােত পােরা। একিট হেলা িবিভ n এর জ থম ৫০ িট f (i) mod
n ি ট কের দখা আর আশা করা যিদ কােনা িহ ট পেয় যাও। আর আেরকটা উপায় হেলা theoretically
িচ া করা। যারা অিভ কে টে ট তারা এই সম া দেখ থেম যা ভাবেব তাহল ab অেনক অেনক
বড় মান। তরাং হয় আমােদর matrix exponent এর মত িকছু করেত হেব নাহেল আমােদর
sequence ক সাইেকেল ফলেত হেব। যিদ কউ খুব recent সমেয় matrix exponent টক-
িনক িশেখ থােকা তাহেল তা কােনা কথাই নই, স সানে এটােক সই ভােব সমাধান করেত লেগ
যােব। িক একটা িজিনস, তামােক বর করেত হেব ab তম fibonacci সংখ া আর ab িক অেনক
অেনক বড় সংখ া। Matrix exponent প িতেত i তম fibonacci সংখ া বর করেত সময় লােগ
মাটােমািট log (i), তাহেল ab তম fibonacci সংখ া বর করেত লাগেব log (ab ) = b log (a)
সময়। যা অেনক অেনক বিশ হেয় যায়। তরাং matrix exponent িদেয় হেব না। তাহেল দখা
যাক এই sequence ক সাইেকেল ফলা যায় িকনা। n = 6 এর জ f (i) mod n এর মান িল
দখা যাক- 0, 1, 1, 2, 3, 5, 2, 1, 3, 4, 1, 5, 0, 5, 5, 4, 3, 1, 4, 5, 3, 2, 5, 1, 0, 1.
আমরা িক আমােদর সাইেকল পেয় গিছ, কারণ আমরা পর পর 0 আর 1 পেয়িছ, অথাৎ আমােদর
সাইেকলটা আবার থেক হেয় গেছ। এ অব ায় আমােদর মেন কেয়কটা ে র উদয় হেত
পাের। থমত, সবসময় সাইেকেল পড়েব িক না। ি তীয়ত, সাইেকেল পরেল িক এটা থেক সা-
ইেকেল পড়েব নািক মাঝা মািঝ কাথাও থেক। তৃতীয়ত, সাইেকেলর length িকরকম হেব। আমারা
এেক এেক এসব ে র উ র পাবার চ া কির।
থম - সবসময় সাইেকেল পড়েব িকনা। াঁ পড়েব। কন? কারণ আমরা সবসময় mod n
িনি , তরাং আমােদর সংখ া িল সবসময় 0 হেত n − 1 পয হেত পাের। তুিম যিদ পাশাপািশ
িট সংখ া নাও তারা মাট n2 রকম হেত পাের। অথাৎ n2 + 1 length পয যাবার পর যই
pair পাবা সটা অব ই এর আেগ এেসেছ কারণ n2 এর বিশ রকেমর pair হওয়া স ব না।
তরাং আমরা সবসময় সাইেকল পাব। ি তীয় - এই সাইেকলিট িক েত পড়েব িকনা অথাৎ
0, 1 . . . , 0, 1, . . . এরকম হেব িকনা। াঁ। কন? ধের নাও য এিট 0, 1 এ পের না, এিট মােঝর
কাথাও a, b ত পের অথাৎ f (i) mod n হেব 0, 1 . . . , a, b, . . . , a, b, . . .. এখন ি তীয় a, b
এর কথা িচ া কর। এর আেগর সংখ া কত? b - a. িক থম a, b এর আেগর সংখ াও b - a.
অথাৎ আমােদর সাইেকলটা আসেল a, b ত িগেয় পের না, তার আেগ িগেয় পের। িক এভােব
তা তুিম একঘর একঘর কের িপছােত থাকেতই পােরা তাই না? এর মােন আসেল সাইেকলটা 0, 1
থেকই হয়। এখন তৃতীয় - সাইেকলর length কত। থম ে র উ র থেক দেখছ য n2 এর
৩৭
মােঝ সাইেকেল পড়েবই। িক আসেল practically এর অেনক আেগই সাইেকেল পের। এমনিক n
এর মান 1000 এর মােঝ 3000 ধােপর মােঝই সাইেকেল পের যায়। িক ভােব বর করলাম? সহজ,
একটা কাড কেরিছ 7-8 লাইেনর।
তাহেল আর িক। িতিট n এর জ তামরা পুেরা সাইেকল বর কের আলাদা আলাদা vector
এ রেখ দাও (vector এর অ াের)। এবার ইনপুট পেল দেখা এই n এর জ সাইেকেলর length
কত। ধরা যাক c. তাহেল ab mod c বর করেত হেব। এটােতা bigmod ছাড়া িকছুই না। ধু খয়াল
রাখবা overflow যন না হয়। তাহেল আমরা f (ab ) mod n এর মান পেয় যাব যা vector এর
ab mod c তম সংখ া।
সমাধান: আমরা যিদ a ও b এর উপর লুপ চালাই এবং 2T িট সংখ া বর কের দিখ য তারা সমান
িকনা তাহেল একটু বিশ সময় লেগ যায় a × b × T = 1010 . তাহেল কীভােব আগােনা যায়? তুিম
ই ভােব িচ া করেত পােরা। এক- a ও b ইিট লুপ না চািলেয় একিট লুপ চালােনা যায় িকনা। ই-
আমােদর x1 ও x3 দওয়া আেছ। এখান থেক কােনা ভােব a ও b এর মােনর ব াপাের কােনা
সাহায পাওয়া যায় িকনা।
থেম x3 ক x1 এর সােপে িলেখ দখা যাক- x3 ≡ ax2 + b ≡ a(ax1 + b) + b ≡
a2 x1 +ab+b( mod 10001) বা x3 −a2 x1 = b(a+1)+10001c যখােন c একিট integer১ .
যিদ আমরা a এর উপর লুপ চালাই তাহেল এই equation এ ইিট unknown থাকেব b আর c.
তাহেল আমরা আমােদর equation ক িলখেত পাির- bp+cq = r যখােন p, q, r constant এবং
b এর মান সেবা 10000 হেত পাের। কীভােব আমরা এরকম ভােব িলখলাম? সহজ, আমরা আেগর
সমীকরেণ p = a + 1, q = 10001 আর r = x3 − a2 x1 বসাই তাহেলই আমরা bp + cq = r
পেয় যাব। এখন আমরা b এর এমন সমাধান চাই যন তা অঋণা ক ও সেবা 10000 হয়। আমরা
সাধারনত unknown ক x, y, z ইত ািদ ারা কাশ কের থািক। তাই আমরা িবধার জ b ক
x ও c ক y ারা পিরবতন কির। তাহেল আমােদর সমীকরণ দাঁড়ায় px + qy = r.
আমরা িক এই ধরেনর সমীকরণ সমাধান করা জািন। আমােদর euclid এর অ ালগিরদম ব ব-
হার করেত হেব বা extended gcd খাটােত হেব। সে ে আমরা এমন x0 , y0 পােবা যন px0 +
qy0 = g যখােন g হল p ও q এর gcd. এর general solution হেব p(x0 +tq)+q(y0 −tp) =
g যখােন t হল integer constant. এটা আসেল extended gcd এরই একিট properties. এখন
আমােদর ডান পাশেক r এর সমান করার জ ই িদেক আরও একিট integer constant ধরা যাক
k িদেয় ন করেত হেব (k = r/g). তাহেল দাঁড়ােব kp(x0 + tq) + kq(y0 − tp) = r.
আমরা বেলিছলাম য আমরা এমন অঋণা ক b (যা পরবতীেত x হেয় িগেয়িছল) চাই যা এই
equation ক satisfy করেব এবং 10001 এর থেক ছাট হেব (বার বার 10000 এর সমান
বা ছাট বলার থেক 10001 এর থেক ছাট বলা সহজ)। অথাৎ 0 ≤ k(x0 + tq) < 10001 বা
−x0 /q ≤ t < 10001/qk − x0 /q. একটু উপের যিদ তাকাও তাহেল বুঝেত পারেব q = 10001.
তার মােন −x0 /10001 ≤ t < 1/k − x0 /10001. এখােন খয়াল কর 1/k িক খুবই ছাট
সংখ া, [−x0 /10001, 1/k − x0 /10001) এই বাউে ডর ভতের আসেল একিটর বিশ integer
থাকেব না। এর মােন এত ণ এেতা খেটখুেট এেতা এেতা constant, এেতা এেতা equation
১a ≡ b(modc) হেল আমরা িলখেত পাির a = b + kc যখােন k একিট integer.
৩৮
সমাধান কের আমরা জানেত পারলাম য, িতিট a এর জ আমরা আসেল সেবা 1িট b পােবা
যটা আমােদর x1 হেত x3 িদেত পারেব।
তাহেল সারমম দাঁড়াল- আমরা a এর উপর লুপ চালােবা। Extended gcd ব বহার কের b এর
মান বর করব। এরপর একিট T এর লুপ চািলেয় x1 . . . x2T বর কের িমিলেয় দখেবা য এরা
আমােদর ইনপুট এর সােথ মেল িকনা। আমােদর সময় লাগেব a×T = 106 . সােথ extended gcd
এর একটা ফ া র আেছ, আমরা সটােক গণায় ধরলাম না। আর আসেল আমােদর সকল x1 . . . x2T
এর মান বর না করেলও চেল। যখন কােনা একিট মান ম াচ করেব না তখন আমরা পেরর a এর
মান পরী া করব। এর ফেল সময় আরও কম লাগেব।
১ তুিম এভােব িচ া করেত পােরা য, কি উটার double এ কেয়ক ঘর রাখেত পাের মা । এখন যিদ তুিম এখােন অেনক
বড় মান রাখেত যাও তাহেল কি উটার শেষর িদেকর অংক আর রাখেব না, সখােন স 0 বিসেয় দেব।
৩৯
UVa 10791 Minimum Sum LCM
সমস া: তামােক N (< 231 ) দওয়া থাকেব। তামােক এমন িকছু সংখ া (একািধক হেত হেব)
বর করেত হেব যন তােদর লসা N হয় এবং সই সংখ া িলর যাগফল সবিন হয়। যমন N
= 12 হেল আমােদর সংখ া িল হেব 3 আর 4. কারণ এেদর লসা 12 এবং এেদর যাগফল 7
যা সবিন । তামােক সই সবিন যাগফলিট ি ট করেত হেব। মাট 100 িট test case দওয়া
থাকেব।
সমাধান: তামােক যিদ িকছু সংখ া দওয়া থােক তাহেল তােদর লসা কীভােব বর করেব? অেনক
উপােয়ই বর করা যায়। তার মােঝ একিট উপায় হেলা সংখ া িলেক prime factorization করা।
এরপর িতিট prime এর জ দখা য তামােক দওয়া সংখ ােদর মােঝ কােনা সংখ ায় তার
সবেচেয় বড় power কত আেছ। এভােব িতিট prime এর জ সই বড় power িদেয় ন করেলই
তুিম লসা পেয় যােব। উদাহরণ দওয়া যাক। ধর আমরা 4, 6, 18 এর লসা বর করেত চাই।
এখন 4 = 22 , 6 = 2 × 3 আর 18 = 2 × 32 . তাহেল 2 এর সবেচেয় বড় power আেছ 2, আর
3 এর সবেচেয় বড় power আেছ 2। তাহেল আমােদর লসা হেব 22 × 32 = 36. এর মােন যিদ
আমােদর লসা দওয়া থােক তাহেল এেক √ আেগ prime factorize কের নই। যেহতু লসা খুব
জাড় 231 হেত পাের আমরা খুব সহেজই √N এ তার prime factorize করেত পাির। বা তােত যিদ
খুব বিশ সময় লেগ যায় তাহেল আমরা N পয prime generate কের রেখ N ক prime
factorize করেত পাির। ধরা যাক এই prime factorization িট হল pk11 pk22 pk33 . . .. এর মােন
দাঁড়াল আমরা যই সংখ া িল িনবাচন করব তােদর িতিটেত p1 , p2 . . . এর বাইের কােনা prime
থাকা যােব না, আর এেদর power আবার যথা েম k1 , k2 . . . এর বিশ হওয়া যােব না। কীভােব
তুিম এই prime িলেক সংখ া িলর মােঝ distribute করেল সংখ া িলর যাগফল সবিন হয়?
তামরা চাইেল এখােন একটু িবরিত িনেয় িচ া করেত পােরা।
থমত, কােনা একিট prime একািধক সংখ ায় থাকেব না। কারণ একািধক সংখ ার মােঝ
কােনা একিটেত prime িটর সেবা power থাকেব। সিট বােদ বািক িল মুেছ িদেল আমােদর
সংখ া িলর যাগফল আরও কেম যােব তাই না? একটা উদাহরণ দখা যাক। ধর 12 = 22 × 3
তাহেল কােনা একিট সংখ ায় 22 থাকেব। তাহেল আমরা চাইেল একিট 22 রেখ বািক 2 সব মুেছ
ফলেত পাির। আবার 22 আর 3 চাইেল একই সংখ ােতও থাকেত পাের বা িভ সংখ ােতও থাকেত
পাের। যমন 22 , 3 হেত পাের বা 22 3 হেত পাের। কানটা লাভজনক? অব ই 22 + 3 < 22 3.
একটু িক বুঝেত পারছ কীভােব prime িলেক রাখেল যাগফল সবেচেয় কম হেব? াঁ তােদর
2
আলাদা আলাদা কের রাখেত হেব। অথাৎ pk11 , pk2 , . . . এরকম। কন? খয়াল কর এখােন মুল
ব াপার হল ab ছাট নািক a + b? দখা যাক, ab?a + b ⇒ ab − b?a ⇒ b? a−1 a
. এখােন ? মােন
হল আমরা জািন না য এখােন িক বসেব <, > নািক =. আমােদর ডান পাশ ায় 1 এর কাছাকািছ
একটা সংখ া। আর বাম পাশ তা কমপে 2. এর মােন সবসময় ab সংখ া a + b এর থেক বড়
হেব যখােন a, b িতিট prime এর power (আমােদর এ সম ার ে এিট সত , তাই বেল সব
ে ab > a + b না যমন 1 ∗ 1 > 1 + 1 িক সিত না)। অথাৎ আমােদর optimal সংখ া িল
2
হেব pk11 , pk2 , . . ..
সব শেষ একটা িজিনস, আশা কির খয়াল কেরছ য তামােদর সেট একািধক সংখ া থাকেত
হেব। তরাং যিদ দ N এ মা একিট াইম থােক তাহেল িক করবা সটা িনেজরা িচ া কের বর
কর।
৪০
এরই কান স ক দখা যাে না। এরকম অব ায় যটা করা উিচত সটা হেলা pattern খাঁজা।
একটা ছাট কাড কের N এর মান 100 পয যসব pair পাওয়া যায় তােদর ি ট কের ফেলা।
িক এরপরও কােনা pattern পাওয়া যায় না। যমন িকছু িবদঘুেট pair হেলা (85, 68), (90, 72)
ইত ািদ। যারা আসেলই pattern খাঁজায় পটু তারা হয়েতা ইেতামেধ ই pattern পেয় গেছ। যিদ
খয়াল না কের থােকা তাহেল বিল এেদর gcd বা xor হল তােদর মােঝর পাথেক র সমান। যিদও
এটা িঠক য যেকােনা pair এর পাথক সবসময় তার gcd হয় না বা xor ও হয়না। তেব যিদ তােদর
xor ও gcd সমান হয় তাহেল তােদর পাথক ও এেদর সমান হয়। অ ত N এর মান সেবা 100
এর জ যত িল pair পেয়ছ তােদর সবার ে এটা সত । এখন িট িজিনস। থমত- এটা িক
আসেলই সত ? মাণ িক? ি তীয়ত- এটা কীভােব efficiently কাড করা যােব।
অেনেক থম এর উ র না বর কেরই ি তীয় অংেশ চেল যায়। অথাৎ মাণ না কেরই কাড
কের বা কাড কীভােব করেব তা িচ া কের। া ািমং কে ট এর সময় মাণ খুব একটা দরকাির
না। তুিম আরও িনি ত হেত হয়েতা N এর মান 1000 বা 10,000 পয চক কের দখেত পােরা।
যিদ এেতা পয তামার claim সিত হয় তাহেল ধের নয়া যায় য আসেল সব N এর জ তামার
claim সত হেব। যিদও যত ণ না মাণ করছ তত ণ মেন একটা খচখচ করেত থােক। তাহেল
চল এটা মাণ করা যাক। খয়াল কর, A − B ≤ xor(A, B). কন? যিদ B ত যসব bit 1
আেছ A তও যিদ তারা 1 থােক তাহেল A − B আর xor(A, B) সমান হেব। অ থা xor এর
মান বিশ চেল আসেব। আবার অ িদেক gcd(A, B) িক A আর B জনেকই ভাগ কের। তাই
gcd(A, B) িক A − B ক ভাগ কের। অথাৎ gcd(A, B) ≤ A − B. তাহেল দখেত পা
gcd(A, B) ≤ A − B ≤ xor(A, B). অথাৎ যিদ xor আর gcd সমান হয় তাহেল তারা A − B
এর সমান হেব। িক র সহেজ মাণ হেয় গল। িক মেন রেখা এই মাণ সহজ হেয়েছ কারণ
তুিম আেগ থেকই জােনা য এখােন A − B এর কােনা ভূিমকা আেছ। নাহেল তুিম A − B এর
সােথ gcd বা xor এর স ক খুঁজেত যেত না। মাট কথা তামার pattern খাঁজা বা explore
করার মানিসকতা থাকেত হেব।
এখন তাহেল ি তীয় ে িফের আসা যাক। কীভােব এিট সমাধান করবা। থমত িন য় তুিম
A ও B িটর উপেরই লুপ চালােত পারবা না। আবার ধু A বা ধু B এর উপের লুপ চািলেয় িক
লাভ হেব তাও বুঝা যাে না। এরা জন ছাড়া লুপ চালােনার মত candidate আেছ gcd. দখা
যাক gcd এর উপর লুপ চািলেয় লাভ হয় িকনা। ধরা যাক আমােদর gcd এর লুেপর variable হেলা
g. তাহেল আমরা A ও B স েক িক বলেত পাির? থমত A ও B উভেয়ই g এর multiple
( িণতক)। ি তীয়ত A - B হেব g এর সমান (আমরা িকছু ণ আেগ তাই মাণ কেরিছ)। এর মােন
আমরা যিদ A জািন তাহেল B হেব A − g. আমরা যিদ A এর উপর লুপ চালােত চাই তাহেল কীভােব
চালাব? একিট উপায় (হেলা) 1 হেত N পয i এর লুপ চািলেয় দখা য i িক g ারা িবভাজ িকনা।
িক এেত িতবার O N এর লুপ চালােত হয়। তা না কের তুিম সরাসির g এর multiple এর
উপর লুপ চালােত পােরা। g হেত N পয এবং িতবার লুেপর মান g পিরমাণ কের বািড়েয় [for(A
= g; A <= N; A += g)] অথবা 1 হেত N /g ( পয ) i এর লুপ চালাও তাহেল A হেব i × g. তাহেল
এই nested loop চলেত সময় লাগেব O N /g . যেহতু g এর লুপ 1 হেত N পয চালা
তাই মাট সময় লাগেব N /1 + N /2 + . . . N /N এবং এিট আসেল N log N . তরাং এই িট
nested লুপ চািলেয় আমরা A, B আর g জেন গলাম। আমরা খুব সহেজই চক করেত( পাির য)
xor(A, B) = g িকনা। িক gcd(A, B) = g িকনা তা চক করেত তা আরও একটা O log N
লাগেব। িক একটু িচ া কের দেখা এই চক এর কােনা দরকার নই। কারণ A আর B পাশাপািশ
g এর multiple. মােন A = ig হেল B = (i − 1)g এবং এেদর মােঝ g ছাড়া আর কােনা সাধারণ
ণনীয়ক নই কারণ g ছাড়া এরা হেলা i আর i − 1. আর পাশাপািশ িট সংখ া সবসময় coprime.
কন? মেন কর তারা coprime না। এর মােন এরা p ারা িবভাজ । এর মােন এেদর িবেয়াগফল
i − (i − 1) ও p ারা িবভাজ ( িট সংখ া p ারা িবভাজ হেল তােদর িবেয়াগফলও p ারা িবভাজ
হেব)। মােন 1 সংখ ািট p ারা িবভাজ । তােতা স ব না তাই না?
তাহেল আমরা আমােদর সমাধান পেয় িগেয়িছ। আমরা থেম gcd এর উপর লুপ চালােবা। এর
পর A এর উপর লুপ চালােবা যটা হেব gcd এর multiple. আর B = A − g. সবেশেষ চক
করব xor(A, B) = g িকনা। শষ!
তাহেল এই সম া থেক িক িশখলাম? িশখলাম য মােঝ মােঝ ধয ধের pattern খুঁজেত হয়।
৪১
UVa 1635 Irrelevant Elements
সমস া: মেন কর তামার ব ু n আর m িট সংখ া িনবাচন কেরেছ (1 ≤ n ≤ 105 , 2 ≤ m ≤
109 ). এবাের স n িট সংখ া a0 , a1 , . . . an−1 িনবাচন কেরেছ যখােন িতিট সংখ াই 0 হেত
m − 1 এর মােঝ। এবার স পাশাপািশ িট কের সংখ া যাগ করল। তাহেল স পল a0 + a1 , a1 +
a2 . . . an−2 + an−1 এই n − 1 িট সংখ া। এবার আবার স একই কাজ করল এবং পল n − 2
িট সংখ া। এভােব স করেতই থাকল যত ণ না স একিট সংখ া পল। এবার স এই সংখ ার
modm িনেলা। এখন তামােক বলেত হেব শষ সংখ ার উপের কান কান ai এর কােনা ভাব
নই। যমন n = 3 ও m = 2 হেল শষ সংখ ার উপের a1 এর কােনা ভাব নই। কন? কারণ
n = 3 এর জ শষ সংখ ািট হেলা a0 + 2a1 + a2 mod m আর যেহতু তুিম 2 িদেয় mod
িন সেহতু শষ সংখ ােত a1 এর কােনা ভাব নই।
সমাধান: যারা অিভ তারা এই সম া পড়ার সােথ সােথই বুঝেত পারেব য শষ সংখ া িক হেব।
এখােনই আসেল অিভ আর অনিভ েদর পাথক । অনিভ রা বশ িকছু সময় ব য় করেব এই
common িজিনস বর করেত আর অিভ রা এক দখােতই বুঝেত পাের য শষ মানটা িক হেব।
যিদ তামরা না জােনা য শষ মান িক হেব তাহেল n এর িবিভ মােনর জ শষ মান বর কের
দখেত পােরা। যমন n = 2 এর জ a0 + a1 . n = 3 এর জ a0 + 2a1 + a(2 . n) = 3
এর জ a + 3a + 3a2 + a3 . বুঝেত পারছ িক হে ? n এর জ এই মান হেব n−1 0 a0 +
(n−1) 0 (n−1)1 (n−1)
1 a1 + 2 a2 + . . . n−1 an−1 . কন? কারণটা বুঝার সবেচেয় ভাল উপায় হল pascal
এর triangle এর মত আঁকা এবং বর করা িতিট সংখ ার contribution কত কের। িচ ৪.১ এ
িজিনসটা বুঝার চ া কের দখেত পােরা। আমরা িক ি ভুজই এঁেকিছ তেব উলেটা কের। এখােন
আমােদর থম সংখ ািট হেলা উপেরর বাম কাণা এবং এর পর বািক সংখ া িল পরপর আেছ। এখন
কােনা একিট সংখ ার contribution হেলা সিট যই ােন আেছ সখান থেক িনেচর কাণায় যত
ভােব যাওয়া যায় তা। যমন িচে র a1 হেত িনেচর কাণায় যভােবই(যাও)না কন
(4−1তামােক
) একধাপ
বােম আর ই ধাপ ডােন যেত হেব। 1টা L আর 2টা R ক আমরা 2+1 1 = 1 ভােব সাজােত
পাির (ভুেল যও না আমােদর n এখােন িক 4)। একই(n−1ভােব
) তুিম িতিট ai এর জ যিদ একটু
িহসাব কর তাহেল দখেব ai এর coefficient হেব i .
a0 a1 a2 a3
৪২
ই m এ থাকা power এর সমান বা বড় তাহেল িবভাজ নাহেল িবভাজ না।
তাহেল আমােদর সমাধান দাঁড়াল- থেম m ক prime
( ) factorize কের এর prime divisor
আর তার power িল বর করব। এর পর এেক এেক ni বর করব (i এর মান 0 হেত n পয )।
িতবার একিট সংখ া ন আর ভাগ করব। এই ন ভােগর সময় আসেল আমরা দখেবা m এর
ভতের থাকা prime িল কতবার কের আেছ। ভােগর সময় এই count কমেব আর েনর সময়
বাড়েব। ন ভাগ হেয় গেল িতিট prime এর power চক কের দখেবা য m এ থাকা power
অেপ া কউ কম আেছ িকনা। যিদ কম থােক তাহেল িবভাজ না, আর যিদ সবাই বিশ বা সমান হয়
তাহেল িবভাজ । n িক খুব একটা বড় না তাই তােত খুব একটা বিশ prime factor থাকেব না।
তাই এই সমাধােনর complexity ও অেতা বিশ হেব না।
৪৩
একটা ছাট উদাহরণ দয়া যাক। মেন কর তুিম 10ম শ বর করেত চাও। তুিম করেল িক,
থম ােন A বসােল। এর পর তামার ব ুেক িজ াসা করেল, আিম থম ােন A বিসেয়িছ, তুিম
িক বলেব এই অব ায় কত িল valid শ আেছ? ধর তামার ব ু বলল 1 িট। তুিম বুঝেল 10ম
শ িট A িদেয় না। সই সােথ তুিম জেন গেল থম শ িট A িদেয় । তরাং এখন তামার
মাথা ব াথা 9ম শ িনেয় (কারণ থম শ তা বাদ)। এখন মেন কর তুিম থম ােন B বসােল আর
তামার ব ুেক িজ াসা করেল এবার বল কত িল valid শ আেছ। স বলল 50 িট। তাহেল তুিম
বুেঝ িগেয়ছ য থম ােন B বসেব। এবার তামার িচ া ি তীয় ান িনেয়। তুিম এখােন A বসােল।
আবার ব ুেক িজ াসা করেল য BA িদেয় শ কয়িট? তামার ব ু বলল 4 িট। তামার দরকার
9ম শ । তাহেল বুেঝ গেল ি তীয় ােন A না। এবং সই সােথ তুিম এখন থেক 5ম শে র স ান
করেব। ি তীয় ােন মেন কর B বসােল আর তামার ব ু বলল BB িদেয় শে র সংখ া 0িট।
তুিম এবার C িদেয় চ া কর। এভােব যিদ চািলেয় যাও তুিম দখেব পুেরা শ বািনেয় ফেলছ।
আর কয়িট শ বানােনা স ব তা বর করা বশ সহজ। থেম বর কর থম কলােম কত িল
character বসেত পাের। এটা বর করা সহজ, তুিম A হেত Z িতিট character এর জ দখেব
য সই character িট িট ি েডর থম কলােম আেছ িকনা। এরকম কের বর কর কত িল
character িট ি েডর থম কলােম আেছ। একই ভােব তুিম িতিট কলােমর জ এই সংখ া বর
কর। এেদর ন করেলই তুিম পেয় যােব য কত িল শ বানােনা স ব। যেহতু আমরা থম
িদেকর িকছু কলােম character বিসেয় ফলব তরাং তােদর বােদ বািক কলাম িল িনেয় িহসাব
করেলই আমরা সই বািক কলাম িল ব বহার কের কত িল শ বানােনা স ব তা পেয় যাব।
সমাধান: আমরা ই উপােয়র স াব তা বর করব এবং তুলনা কের দখেবা য তারা সমান িকনা বা
সমান না হেল কান ভােব িল না বর হবার স াবনা বিশ। থেম সহজটা বর করা যাক- তুিম যিদ
slot ক ঘুরাও তাহেল িল না ব েনার স াব তা। এটা আসেল বিশই সহজ। তামার মাট n িট
slot আেছ। ধরা যাক তার a িটেত িল আেছ আর n − a িট ত নই। তুিম যিদ slot ক randomly
ঘুরাও তাহেল িল নাই এরকম slot আসার স াবনা হেলা n−a n . কন? কারণ যেহতু n িট slot
আেছ তাই randomly ঘুরােল n ধরেনর slot আসেত পাের। আর এেদর মােঝ n − a িটেত িল
নই। তাই িল নই এরকম slot আসেত পাের n − a ভােব। তরাং n − a ক n িদেয় ভাগ করেল
আমরা িল নই এরকম slot আসার স াবনা বর কের ফলেত পারব।
এখন চল বর করা যাক যিদ না ঘুরাও তাহেল িল বর না হবার স াবনা কত। যেহতু এর
আেগর বাের তামার ব ু যখন triggure িটেপেছ তখন কােনা িল বর হয় নাই তরাং তুিম জােনা
য এখন িপ ল এমন জায়গায় আেছ যার আেগর slot এ িল িছল না। তরাং তুিম খুব সহেজই
নেত পােরা এরকম অব ান কয়িট আেছ। এখন হল এেদর মােঝর কয়িট অব ােনর জ পেরর
অব ােনও িল নই। উদাহরণ দয়া যাক। ধরা যাক slot এর অব া 0011 (0 মােন িল নই, 1
মােন িল আেছ)। এখন তামার ব ুর ে slot থম িটর কােনা একিটেত িছল। যিদ তামার
ব ুর কােছ থম অব ােন থােক তাহেল তামার ে িল হেব না। আর যিদ তামার ব ুর কােছ
ি তীয় অব ােন থােক তাহেল তামার কােছ িল হেব। অথাৎ তামার কােছ িল হবার স াবনা
0.5. যিদ slot এর অব া 010101 হয় তাহেল িক িল হবার স াবনা 1. কারণ তামার ব ুর
ে যেহতু িল হয় নাই তরাং তামার ে িল হেবই কারণ সব 0 এর পের 1 আেছ। এটা
স াব তার খুব basic সম া।
৪৪
UVa 10491 Cows and Cars
সমস া: একিট game show ত a িট দরজার পছেন গািড় আর b িট দরজার পছেন গ আেছ।
তুিম থেম একিট দরজা িনবাচন করেল তামার জ । এর পর উপ াপক তামার দরজা ছাড়া অ
দরজার মােঝ c িট দরজা খুেল দখাল য সসেবর পছেন গ আেছ (c < b)। এবার তুিম তামার
দরজা বােদ অ যেকােনা দরজা িনবাচন করেল। বলেত হেব তামার গািড় পাবার স াবনা কত।
সমাধান: ধরা যাক n = a + b অথাৎ মাট দরজার সংখ া n. এখন মেন কর তুিম একিট দরজা
িনবাচন করেল, তাহেল এেত গািড় থাকার স াবনা na . বািক আেছ n − 1 িট দরজা। এর মােঝ c িট
দরজা আমােদর উপ াপক খুেল দিখেয় িদেয়েছ য তােদর পছেন গ আেছ। তাহেল বািক থােক
মাট n − 1 − c িট দরজা। যেহতু আিম যই দরজা িনবাচন কেরিছ তার পছেন গািড় আেছ (কারণ
আমরা ধের িনেয়িছ য a/n probability ত আমােদর থম দরজার পছেন গািড় আেছ) তাই বািক
n − 1 − c িট দরজার মােঝ গািড় আেছ a − 1 িট। তাহেল আিম যিদ বািক n − 1 − c িট দরজার
একিট িনবাচন কির তােত গািড় থাকার স াবনা n−1−ca−1
. তরাং আমরা থম যই দরজা িনবাচন
কেরিছলাম তােত এবং ি তীয় যই দরজা িনবাচন করলাম তােত গািড় থাকার স াবনা na × n−1−c
a−1
.
আবার এমনও হেত পাের য আমরা যই দরজা থেম িনবাচন কেরিছলাম তােত গ আেছ। এটা
হবার স াবনা nb . এবার বািক n − 1 িট দরজার মােঝ উপ াপক c িট দরজা খুেল গ দিখেয়িছল।
বািক থােক n − 1 − c িট দরজা। এর মােঝ গািড় আেছ a িট। আমরা যিদ বািক n − 1 − c িট
দরজা থেক randomly িনবাচন কির তাহেল গািড় পাবার স াবনা n−1−c a
. অথাৎ থম দরজায়
গ আর ি তীয় দরজায় গািড় পাবার স াবনা n × n−1−c . তাহেল গািড় পাবার মাট স াবনা
b a
দাঁড়ােব na × n−1−c
a−1
+ nb × n−1−c
a
.
যারা probability ত একদম নতুন তােদর মেন আসেত পাের এরকম ন কের যাগ করলাম
কন। অেনক ভােবই এর ব াখ া দওয়া যায়। মেন কর তামার কােছ িতনিট coin আেছ এবং এেদর
head পরার স াবনা p1 , p2 , p3 . থেম তুিম থম coin টস করেব। যিদ head পের তাহেল ি তীয়
coin, আর যিদ থম coin এ tail পের তাহেল তৃতীয় coin টস করেব। বলেত হেব সবেশেষ যই
কেয়নিট টস করেব তােত head পরার স াবনা কত। খয়াল কর, থম coin টস করার পর িক ই
রকম ঘটনা ঘটেত পাের। p1 স াবনায় head পরেত পাের, এবং সই ে তুিম ি তীয় coin টস
করেব এবং তােত head পরার স াবনা p2 . এই ঘটনা িট একে ঘটার স াবনা p1 p2 . একই ভােব
আমরা বলেত পাির থম coin এ tail ও তৃতীয় coin এ হড পরার স াবনা (1 − p1 )p3 . যখন িট
ঘটনা একে ঘটােনা দরকার তখন তােদর স াবনােক ন করেত হয়। এবার আমােদর বর করেত
হেব শেষর coin এ head পরার স াবনা। শেষর coin ি তীয় coin হেত পাের অথবা তৃতীয়
coin হেত পাের। তরাং ি তীয় coin এ head "অথবা" তৃতীয় coin এ head পরার স াবনা হেলা
p1 p2 + (1 − p1 )p3 . এখােন যাগ কেরিছ, কারণ আমরা ইিট ঘটনার কােনা একিট ঘটার স াবনা
বর করেত চেয়িছ। অথাৎ "অথবা" হেল আমােদর স াব তােক যাগ করেত হয়। িক কন "এবং"
হেল ন আর "অথবা" হেল যাগ? এভােব িচ া করেত পােরা- মেন কর তামার সামেন একিট dart
board আেছ। তুিম সই dart board ক সমান িতনভােগ ভাগ করেল। এর পর একভাগেক সবুজ,
এক ভাগ ক নীল আর আেরক ভাগেক লাল রং করেল। যেহতু িতনিট রেঙর জায়গার ফল সমান
তাই তুিম যিদ একিট dart ছুেড় মার আর যিদ সটা board এর একিট random িব েত িগেয়
আঘাত কের সই িব িটর রং লাল হবার স াবনা 1/3 ( ই রেঙর মােঝ পড়েল িক হেব িচ া না
করেলও চলেব)। একই ভােব সবুজ হবার স াবনা 1/3, নীল হবার স াবনা 1/3. এখন যিদ বেল
সবুজ "অথবা" নীল হবার স াবনা কত। িক করেব? যাগ হেব তাই না? কারণ নীল হবার স াবনা
1/3, সবুজ হবার স াবনা 1/3 তাই নীল বা সবুজ হবার স াবনা 1/3 + 1/3 = 2/3. বা অ ভােব
যিদ িচ া কর তাহেল দখেব "নীল বা সবুজ" এর ফলেক যিদ তুিম মাট ফল িদেয় ভাগ
কর তাহেল দখেব 2/3 পেয়ছ। তরাং অথবা হেল যাগ। এখন িচ া কর তামার কােছ এরকম
িট board আেছ আর তুিম িট বােড িট dart মারেল। িটই নীল িব েত পরার স াবনা কত?
1/3 × 1/3 = 1/9 কন? কারণ এই িট dart 9 ভােব পরেত পাের- (লাল, লাল), (লাল, নীল),
(লাল, সবুজ), এরকম আরও 6 রকম। এবং যেহতু সব িল রেঙ পরার স াবনা একই তাই এেদর
যেকােনা একিট combination পাবার স াবনা 1/9. আর এেদর মােঝ একিটর ে ই িটই
৪৫
নীল। অথাৎ 1/9. তরাং এবং হেল ন। িঠক counting এর মতই। Counting এর ে ও িক
"অথবা" এর ে তুিম যাগ কর আর "এবং" হেল ন।
এখন মেন কর তামােক বলা হেলা য r = 1 িট িজিনস কনা হেয়েছ। এর মােন মােঝর ইিট
ঘটনার কােনা একিট ঘেটেছ। আমােদর মাট ঘটনার space চারিট থেক কেম িট ত নেম গেছ।
আেগ চারিটর যাগফল িছল 1 এখন মােঝর িটর যাগফল 0.06 + 0.56 = 0.62 এিট হল আমােদর
ঘটনার space. এখন এই space এ ি তীয়িট (অথাৎ 1 কনা হেয়েছ িক 2 কনা হয় নাই) ঘটার
স াবনা 0.06/0.62 আর তৃতীয়িট ঘটার স াবনা (অথাৎ 1 কনা হয় নাই িক 2 কনা হেয়েছ)
0.56/0.62. তাহেল 1 কনার স াবনা 6/62 আর 2 কনার স াবনা 56/62. বুঝেত পারছ তা
কীভােব িহসাব করলাম? থেম বর করলাম আমােদর দওয়া condition ঘটার স াবনা কত।
সটাই হেলা আমােদর এখনকার space. এবার এই space এর িতিট ঘটনা ঘটার স াবনা বর
কেরিছ। চাইেল িজিনসটােক িকছুটা weighted িহসাব িনকাশ মেন করেত পােরা। আমােদর িট
ঘটনা ঘটার স াবনা সমান না, এরা হেলা 0.56 আর 0.06। তরাং তােদর িতিট ঘটার স াবনা
হেলা 0.56+0.06
0.56
আর 0.56+0.06
0.06
.
এখন তা বলেব- r এর মান 1 বেলই এেতা সহেজ হেয়েছ। n = 4 আর r = 2 এর জ কের
দখাও না, মাথার ঘাম পােয় পড়েব! াঁ হয়েতা হােত হােত পুেরাটা করেত অেনক ক হেব িক
তুিম যিদ মূল আইিডয়াটা বুেঝ থােকা তাহেল আর পুেরাটা হােত হােত করার দরকার নই। মেন কর
তুিম r িট িজিনস যত ভােব কনা যায় তার িতিটেক িল করেল এবং তােদর স াব তা বর করেল।
তাহেল আমােদর space হেব এই সব স াব তা িলর যাগফল (S)। আর যিদ িজ াসা করা হয়
৪৬
1 কনার স াবনা কত? তাহেল এই িলে র দেখা কান কানটায় 1 আেছ। তােদর স াব তার
যাগফল বর কের (তােক) S িদেয় ভাগ করেলই হেয় যােব। তাই না? যেহতু N এর মান মা 20
হেত পাের সেহতু Nr আসেল খুব একটা বড় না। তামরা চাইেল backtrack কের N িট িজিনস
থেক r িজিনস িনবাচন করেত পােরা। অথবা চাইেল bitmask এর লুপ চািলেয়ও করেত পােরা। এই
ব াপাের আমরা থম অধ ােয়ই আেলাচনা কেরিছ। তরাং এখােন এই িনেয় বলার দরকার নই।
তরাং তামরা তামােদর পছে র মথড ব বহার কের এই সম া সমাধান কের ফল।
আমরা িক েত UUU বসােত পারব না। তরাং আমােদর recurrence হেব dp[n] =
dp[n − 1] + dp[n − 2] + dp[n − 3]. Base case আশা কির িনেজরা বর কের িনেত পারেব।
Base case আসেল তমন িকছু না। কান কান n এর জ আমরা আমােদর ফমুলা ব বহার করেত
পারব না তাই base case. খয়াল কর য n এর মান যিদ 1, 2 বা 3 হয় তাহেল আমরা আমােদর
ফমুলায় negative সংখ া বা 0 এর জ dp জানেত চাি । িক আমরা তােদর মান জািন না (হয়েতা
0 এর জ চাইেল বর করা যায়)। তরাং 1, 2 এবং 3 ক base case মেন করেত পার, এবং
তােদর মান কাগেজ কলেম বর কের ফল। এরপর এই ফমুলা ব বহার কের বািক n এর জ dp[n]
বর কের ফল।
৪৭
সমাধান: বুঝাই যাে counting dp. ধরা যাক dp[n] হেলা n িট ঘাড়ার িতেযািগতায় কত ভােব
ফলাফল হেত পাের। ( )এখন একিট i এর লুপ চালাও য এই িতেযািগতায় কত জন থম হেয়েছ। এই
i িট ঘাড়া আবার ni ভােব িনবাচন করা যায়। এখন বািক n − i িট ঘাড়ার িতেযািগতার ফলাফল
কত রকম হেত পাের? খুব সহজ dp[n − i] রকম। তাহেল আমরা যা করব তাহেলা n এর একিট লুপ
চালােবা 1 হেত 1000 পয dp[n] বর করার ( জ
) । এর ভতের i এর একিট লুপ চালােবা কত জন
থম হেয়েছ তার জ । এর পর এেক এেক ni dp[n − i] যাগ করেলই আমরা dp[n] পেয় যাব।
( ) ()
এখােন আমােদর ni জানার দরকার। আসেল েতই সব ji বর কের রাখেত পােরা। এজ
(n) (n−1) (n−1) ( )
i = i−1 + i এই recurrance ব বহার করেত পােরা। তাহেল O n2 সমেয় সব িকছু
generate হেয় যােব।
সমাধান: আরও একিট coutning dp সম া। হয়েতা তুিম িচ া করেব য কান order এ building
িল বসােব। তুিম থেম থম ােন building বসােব, এর পর ি তীয় ােন। িক তা করেল কান
কান building বিসেয়ছ এবং কান order এ বিসেয়ছ তা মেন রাখেত হয়। যেহতু n ≤ 20 তাই
কান order এ কান কান building বিসেয়ছ তা মেন রাখা খুব বিশ হেয় যায়।
আেরকিট আইিডয়া হেত পাের য- building িলর height এর order এ বসান। হয়েতা ভাবেত
পােরা 1 হেত i building িল বসােনার পর আমরা যিদ বাম থেক কয়িট building দখা যায় আর
ডান থেক কয়িট দখা যায় এই ইিট সংখ া state এ রািখ তাহেলই হেব। িক আমার মেন হয়
তােতও হেব না। কারণ যসব building দখা যায় না তােদর অব ানও একিট পূণ ব াপার।
মেন কর 20, 10, 30 আর 20, 30. এখন মেন কর 20 আর 30 এর মােঝ 40 বসােব। থম ে
সই বসােনার জায়গা িক িট, িক ি তীয় ে একিট। তরাং দখা যায় না এরকম building
এরও িক ভুিমকা আেছ। তাহেল িক করা যায়?
একটু যিদ িচ া কর তাহেল বুঝেব য বাম বা ডান িদক হেত সবেচেয় দূের বা সবেচেয় বড় যই
building দখা যােব সটা হেলা n. তাহেল আমরা আমােদর সম ােক একটু সাজা করেত পাির
আর তাহেলা বাম হেত n পয L িট আর ডান হেত n পয R িট building দখা যায় কত ভােব।
আেরকটা িজিনস খয়াল কর n এর বাম িদেক কয়িট building আেছ সিটই আসল ব পার কান কান
৪৮
height এর আেছ তা িক ব াপার না। মেন কর n এর বােম x িট building আেছ। আমরা চাইেল
সসব building এর height ক 1 হেত x এ map করেত পাির। অথাৎ সবেচেয় ছাট building 1,
এর পেরর বড়িট 2 এরকম কের সবেচেয় বড়িট x. তাহেল আমরা আসেল আমােদর সম ােক ইিট
সহজ সম ায় ভাগ কের ফলিছ। মেন হয় এটু কথা এখেনা অেনেকর কােছ অপির ার লাগেছ।
পির ার কের বলা যাক।
আমরা একিট লুপ চািলেয় িঠক করব n এর বােম মাট কয়িট building আেছ। ধরা যাক i
িট। আমরা িকছু ণ আেগ বেলিছ এই i িট building
( এর) height কােনা ব াপার না, কারণ এেদর
পরই আেছ n উ তার building. তাই আমরা n−1 i ভােব এই i িট building িনবাচন করেত
পাির। আমরা চাইেল এই i িট building ক 1 হেত i height এ map করেত পাির। আর বািক
n − 1 − i িট building ক ডােন রাখেত পাির আর তােদর একই ভােব mapping করেত পাির (1
হেত n − 1 − i পয )। তাহেল আমােদর সম া দাঁড়ায় i িট building ক কতভােব সাজান যায়
যন বাম হেত দখেল L − 1 িট building দখা যায় (L তমিট হেব n height এর)। একই ভােব
ডান িদেক n − 1 − i িট building ক কত ভােব সাজান যায় যন ডান হেত দখেল R − 1 িট
building দখা যায়। আমরা এই িট count ক ন কের i এর জ উ র পােবা। এভােব i এর
লুেপর িত ে র জ উ র যাগ করেল আমরা আমােদর আসল উ র পেয় যাব।
তাহেল আমােদর সম া reduce হেয় দাঁড়াল 1 হেত n পয n িট building ক (তােদর
height 1 হেত n) কত ভােব সাজােল বাম হেত দখেল X িট building দখা যােব। এটার সমাধান
িক ই িদক হেত দখার মত কেরই হেব। থেম n তম building ক বসাও। আর আেরকিট লুপ
চালাও এর বােম কয়িট আর ডােন কয়িট building (ncr করেত হেব)। ধরা যাক বােম i িট building.
তাহেল তামােক বর করেত হেব i িট building ব বহার কের X - 1 িট building দখা যােব এভােব
কত ভােব building িল সাজান যােব। এর মােন আমােদর dp এর state হেব (n, X). এর ভতের
চলেব i এর একিট লুপ। এবং সিট (i, X − 1) ক call করেব। আর বািক n − i িট building ক
ডান িদেক তা ই া খুিশ মত বসান যােব কারণ আমরা তা তােদর বাম িদক হেত দখেতই পারব
না।
৪৯
কের এেদর সবাইেক যাগ করেল আমরা expectation পেয় যাব। একটা িজিনস, log n! এর মান
কীভােব বর করবা? সহজ, log n! = log 1 × 2 × . . . × n = log 1 + log 2 + . . . + log n.
তরাং আমরা েতই সকল দরকাির n এর জ log n! এর মান বর কের রাখেত পাির।
৫০
তাহেল আমরা ধু (0, 0) হেত (a, b) এইটু special জায়গা িনেয় মাথা ব াথা করব। কথা
হল এর মােঝ কান টু জায়গা থেক (x, y) িনবাচন করেল মূলিব র সােথ ফল S এর বড়
হেব। একটু িচ া কের দেখা, xy = S রখার িব িলর সােথ মূল িব িঠক িঠক S ফল
তির কের। এর উপেরর (up) িব িলর সােথ S এর থেক বিশ এবং এর িনেচর িব িলর সােথ
S এর থেক কম ফেলর আয়তে তির কের। তাহেল আমােদর বর করেত হেব xy = S
এই রখার িনেচ special জায়গার ফল। এই পিরমান যিদ আমরা ab হেত িবেয়াগ কির তাহেল
আমরা পাব সই অংেশর ফল যা হেত (x, y) িনবাচন করেল আয়তে ে র ফল S হেত
বড় হয়। এই ফলেক যিদ আমরা ab িদেয় ভাগ কির তাহেল আমরা আমােদর উ র পেয় যাব।
এখন কথা হল এই xy = S রখার িনেচর অংেশর ফল কীভােব বর করব।
3 (4, 3)
2 xy
=
4
0
0 1 2 3 4 5
আমরা একটা উদাহরণ িনেয় কাজ কির তাহেল মেন হয় িবধা হেব। ধরা যাক (a, b) = (4, 3)
আর S = 4. তাহেল first quadrant এর যই িচ হয় তা িচ ৪.৩ এ দওয়া হেলা। xy = S = 4
এিট একিট বাঁকা রখা দখেতই পা । আর সই সােথ আমরা (0, 0) হেত (4, 3) এই আয়তে ও
এঁেকিছ। আমােদরেক িচে র shaded জায়গার ফল বর করেত হেব। কারণ এই জায়গােত
যিদ আমরা কােনা (x, y) িনবাচন কির তাহেল মূল িব র সােপে তার আয়তে ে র ফল S
অেপ া কম হেব। দখেলই বুঝেত পারছ shaded জায়গােক ই অংেশ ভাগ করেত পােরা। একটা
হেলা ছাট আয়তে আেরকটা হেলা xy = 4 এর িনেচর অংশ। ছাট আয়তে ে র উপেরর ডান
কাণা আেছ (S/b, b) = (4/3, 3) ত। যার ফল S/b × b = 4/3 × 3 = 4 = S. বািক
থােক S/b = 4/3 হেত a = 4 পয xy = 4 এর িনেচর অংেশর ফল। এিট একিট সহজ
∫a S a
১
integration x dx = S ln x S ) . তামরা চাইেল
= S(ln (a) − ln (S/b)) = S ln( ab
S/b S/b
৫১
UVa 10900 So you want to be a 2n -aire?
সমস া: একিট game show ত েত তামােক 1 টাকা দওয়া হেব। এরপর এেক এেক তুিম n
রাউ ড খলেত পারেব (n ≤ 30)। িতিট রাউে ডর েতই তামােক একিট করা হেব।
পারার স াবনা t হেত 1 এর মােঝ কােনা একিট random সংখ া (0 ≤ t ≤ 1). তুিম চাইেল
িটর উ র না িদেয়ই quit করেত পােরা। quit করেল তামার কােছ যত টাকা আেছ তা তামার
হেয় যােব। আর যিদ quit না কর তামােক ে র উ র িদেত হেব। তুিম যিদ ে র উ র িদেত
পােরা তাহেল তামার টাকার পিরমাণ ি ণ হেয় যােব এবং তুিম পেরর রাউে ড যােব। আর যিদ ভুল
হয় তাহেল তামার টাকার পিরমাণ 0 হেয় যােব এবং খলা শষ হেয় যােব। তুিম তামার expected
টাকার পিরমাণ maximize করেত চাও। বলেত হেব এই expected টাকার পিরমাণ কত।
সমাধান: আমরা dp এর মত করব। আমরা বর করব যিদ আমরা i তম রাউে ড থািক তাহেল
expected টাকার পিরমাণ কত। আমােদর base case িক হেব? মেন কর আমরা n তম রাউে ড
আিছ, তখন যিদ আমরা িঠক ে র উ র িদতাম তাহেল n + 1 রাউে ড উঠতাম। এখােন আর কােনা
নই। এখােন আমােদর খলা শষ করেতই হেব আর তাহেল আমরা 2n টাকা পােবা। তরাং
আমােদর base case হেব f (n + 1) = 2n . এখন recurrence এর পালা। হল i তম রাউে ড
expected টাকার পিরমাণ কত। আমরা জািন আমােদর ে র উ র পারার স াবনা t হেত 1 এর
মােঝ যেকােনা একিট সংখ া। ধরা যাক p. তামার হােত ইিট অপশন। এক- আমরা quit করব
তাহেল আমরা 2i−1 টাকা পােবা। ই- ে র উ র িদব। যিদ ে র উ র দাও তাহেল কত টাকা
পাবা? p স াব তায় f (i+1) টাকা পাবা আর (1-p) স াব তায় 0 টাকা। তাহেল ে র উ র িদেল
expected টাকার পিরমাণ হেব p × f (i + 1). এখন তুিম চাও তামার টাকার পিরমাণ maximize
করেত। তাহেল িক করেব? ে র উ র দেব নািক দেব না? সহজ উ র- যা করেল expected
টাকার পিরমাণ বিশ হেব সটা করবা। অথাৎ max(2i−1 , p × f (i + 1)). এিট হেলা p এর জ
expected টাকার পিরমাণ। িক p এর মান তা t হেত 1 পয হেত পাের। তাহেল? তাহেল যা
করেত হেব তাহেলা তুিম t হেত 1 পয সব মােনর জ expected টাকার পিরমাণ যাগ কর এবং
সই সােথ t হেত 1 পয যত িল সংখ া আেছ তা িদেয় ভাগ∫ কর। িক t হেত 1 পয তা অসংখ
1
সংখ া আেছ। িক করবা? উপায় হেলা integration- 1−t 1
t
max(2i−1 , pf (i + 1))dp. কন
(1 − t) িদেয় ভাগ হেলা? কারণ তুিম t হেত 1 পয integrate কেরছ। এটা িকছুটা গড় নবার
মত।
এখন কথা হেলা এই integration করবা কীভােব? f (i + 1) একিট constant কারণ এিট p
এর উপর িনভর কের না। ধের নই C = f (i+1). তাহেল আমরা আমােদর integration ক একটু
∫1
সহজ কের িলখেত পাির 1−t 1
t
max(2i−1 , pC)dp. যিদ pC < 2i−1 ⇒ p < 2i−1 /C হয়
তাহেল আমােদর max এর মান হেব 2i−1 আর নাহেল হেব pC. তাহেল আমরা আমােদর integral
ক ই অংেশ ভাগ করেত পাির t হেত 2i−1 /C আর 2i−1 /C হেত 1. ধু একটা িজিনস খয়াল
রেখা য 2i−1 /C যিদ t এর থেক ছাট হয় বা 1 এর থেক বড় হয় তাহেল যন তুিম উলটা পালটা
িকছু না কর।
তাহেল এই সম ার মাধ েম তামরা দখেল কীভােব expectation এর সম ােত আমরা
calculus ব বহার করেত পাির। আর Integration এর ফাংশন যিদ max ওয়ালা হয় তাহেল আমরা
কীভােব তােক ভে িলেখ সমাধান করেত পাির।
সমাধান: িনঃসে েহ এিট একিট কিঠন সম া। সিত কথা বলেত এিট পড়ার সােথ সােথ আিম
কােনা idea পাই নাই। যিদ pattern খাঁজার মাধ েম সমাধান করেত চাও তাহেল বশ সহেজই
৫২
সমাধান হেয় যােব। তেব যিদ িনেজ থেক গািণিতক ভােব সমাধান করেত চাও তাহেল েসসটা খুব
একটা সহজ হেব না। নেট খুঁেজ chinese site হেত আিম অ ত 4 িট িভ ধরেনর সমাধান দেখিছ।
এ থেক িট এখােন দখােনা যাক।
যভােবই সমাধান কর না কন মূল আইিডয়া হেলা K + 1 িট সগেমে টর মােঝ সবেচেয় বড়
সগেমে টর দঘ 1/2 এর থেক কম হেব। অথাৎ আমােদর বর করেত হেব িতিট সগেমে টর দঘ
1/2 এর থেক ছাট হবার probability কত? কন 1/2 এর থেক ছাট হেব? মেন কর সবেচেয়
বড় সগেম টটা িনলা। এরপর বািক সগেম ট িল জাড়া লািগেয় লািগেয় তুিম বড় সগেমে টর অ
মাথায় পউছাবা। যিদ বড়টার দঘ 1/2 এর থেক বড় হয় তাহেল তুিম কখনই অ াে পাঁছােত
পারেব না। আর যিদ 1/2 এর সমান হয় তাহেল কবল অপর াে পাঁছােব একিট লাইন তির
কের, polygon হেব না। আর যিদ সবেচেয় বড়টা 1/2 এর থেক ছাট হয় তাহেল আমরা polygon
বানােত অব ই পারব। ও াঁ ভাল কথা, বেলেম বেলিছ সগেমে টর দঘ N িক এখােন আিম
এই দঘ 1 ধের কাজ কেরিছ। কন? কারণ, আমােদর উ র আসেল N এর উপর িনভর করেব না
তাই না? একিট 1 দেঘ র যখােন যখােন কাটা valid, 100 দেঘ র সখােন সখােন কাটা valid।
মােন propotionally কাটেত হেব- এই আর িক। যিদ তুিম 1 এর 1/3 ত কাট তাহেল 100 এর
100/3 ত কাটবা- এরকম। যিদ কাটা িল 1 এর ে valid হয় তাহেল 100 এর ে ও valid
হেব। তরাং আমােদর N এর দরকার নই। আমরা আমােদর িহসাবেক সহজ করার জ ধের িনেত
পাির সগেমে টর দঘ 1. এখন আমােদর থম সমাধান দখা যাক।
আমরা " িতিট segment এর দঘ 1/2 এর থেক ছাট হেব" এিটর probability না বর কের
" কােনা একিট segment এর দঘ 1/2 এর সমান বা বড় হেব" এটার probability বর করব।
খয়াল কর কােনা একিট segment যিদ 1/2 এর সমান বা বড় হয় তাহেল আর কউ িক 1/2
এর সমান বা বড় হেব না কারণ বািক যই অংশ আেছ তােত অ ত িট সগেম ট বসােত হেব (আিম
ধের িনি K > 1 কারণ K = 1 হেল িট সগেম ট হয় আর িট বা িদেয় কখনই polygon
হয় না)। মেন কর আমরা K বার randomly কেটিছ এবং K + 1 িট সগেম ট পেয়িছ। ধরা যাক
এেদর দঘ হেলা x0 , x1 , . . . xk এবং x0 হল সবেচেয় বড়টা। আমরা এেক সরলেরখার একদম বাম
সাইেড রাখেবা। তাহেল x0 এর অ মাথা অব ই [1/2, 1] এর মােঝ থাকেব। ধু তাই না, আসেল
যই K িট িব েত কাটা হেব সব িলই [1/2, 1] এর রে পড়েব। এই probability কত? কােনা
একিট িব [0, 1] এই রে র শষ অেধেক পড়েব তার probability 1/2. তাহেল K িট িব ই
শষ অেধেক পড়েব তার probability হেব K টা 1/2 ন অথাৎ 21K . তাহেল এটাই িক উ র? না,
এখােন আমরা ধের িনেয়িছ য x0 অথাৎ সবেচেয় বড় segment িট বােম থাকেব। িক তুিম যখন
random ভােব K জায়গায় কাটেব তখন তা সবেচেয় বড়টা বােম নাও থাকেত পাের। তাহেল উপায়
িক? মেন কর তুিম random ভােব K িট জায়গায় কাটার পর segment িলর বাম থেক ডােন দঘ
িল হেলা y0 , y1 , . . . yK . তুিম cyclically ঘুরােত থােকা যত ণ না সবেচেয় বড়টা বােম আেস
অথাৎ তুিম দখবা y1 , y2 , . . . yK , y0 এরপর y2 , . . . , yK , y0 , y1 এরকম কের তত ণ cyclically
ঘুরােত থাকবা যত ণ না সবেচেয় বড়টা বােম আেস। তাহেল এভােব তুিম যেকােনা ভােব কাটার
জ ঘুিরেয় ঘুিরেয় বড়িটেক সবেচেয় বােম আনেত পারেব। যিদ এটা সিত হয় তাহেল একবার ভাব
যিদ েতই সবেচেয় বড়টা বােম থােক তাহেল তােক ঘুিরেয় ঘুিরেয় িন য় িবিভ জায়গায় নওয়া
স ব? যেহতু মাট K +1 িট সগেম ট আেছ তাই এেক K বার ঘুরান যােব আর িনেজ একটা, মাট
K + 1 অব ায় িনেয় যাওয়া স ব। এর মােন আসেল কােনা একিট সগেম ট 1/2 এর থেক বড়
পাবার স াবনা K+1 2K
কারণ বােম সই বড়টা পাবার স াবনা 21K আর তােক K + 1 ভােব ঘুিরেয়
নানা জায়গায় িনেয় যাওয়া যায় আর এই সব নানা জায়গা তামােক সব অব া িদেত সাহায করেব।
তাহেল আমােদর polygon বানােত পারার probability হেব 1 − K+1 2K
.
এবার ি তীয় সমাধান দখা যাক। আমরা calculus ব বহার করব। ধরা যাক আমােদর সবেচেয়
বড় segment িটর দঘ x. আমরা x এর সােপে integration করব। যেহতু এিট 1/2 এর
থেক বড় হেব তাই আমােদর integration এর র হেব [0.5, 1]. এখন আমােদর বড় segment
িট এক সাইেড হেত পাের বা ভতের হেত পাের। ধরা যাক এিট বাম সাইেড। তাহেল বাম সাইড
হেত িঠক x দূরে একিট কাটা হেব। যিদ আমরা dx ক খুব ছাট জায়গা ধির তাহেল এই x দূরে
একিট কাটা হবার স াবনা dx
1 = dx যখােন 1 হল পুেরা সরলেরখার দঘ । এখন এই কাটিট K
িট কােটর যেকােনািটই হেত পাের। কততম কাটিট এখােন? সজ একিট K ন হেব (কত ভােব
৫৩
ওখােন কাট হেত পাের? K ভােব। কারণ K কােটর যেকােনা কাটই ওখােন হেত পাের)। আর এই
কাট ছাড়া বািক কাট িল ডান িদেকর বািক 1 − x জায়গায় হেব। তরাং বািক K − 1 কােটর িতিট
ডােনর (1 − x) এ পড়ার probability (1 − x)K−1 . তরাং বােম x দেঘ র কাট হবার স াবনা
K(1 − x)K−1 dx. একই ভােব যিদ x অংশিট যিদ ডান িদেক হয় তাহেল একই probability
( তরাং 2 িদেয় ন হেব). এখন ধরা যাক আমােদর বড় সগেম টিট সাইেড না হেয় মােঝ। তাহেল
এই ে এই সগেম ট এর বােম একিট িব পড়েব আর ডােন আেরকিট। মেন কর আমরা ডান
হেত x অংশ অ রেঙ রং কেরিছ। তাহেল আমােদর x এর বাম মাথা আসেল রং না করা যেকােনা
জায়গা থেক হেত পাের। রং না করা অংেশর দঘ (1 − x) তাই এই অংেশ একিট কাট হবার
স াবনা (1 − x). এখান থেক x দূর ডােন আমােদর আেরকিট কাট হেত হেব। এর স াবনা dx.
এখন খয়াল কর K িট কােটর মােঝ x এর বাম মাথায় একিট আর ডান মাথায় আেরকিট কাট আেছ।
বােমরিট K িট কােটর যেকােনািট হেত পাের আর ডােনরিট হেত পাের (K − 1) ভােব (উদাহরণ
প- তৃতীয় কাট বােম আর থম কাট ডােন)। তাহেল এই িট কাট হেত পাের K(K − 1) ভােব।
তরাং এেদর ন করেল x এর ই িদেক িট কাট হবার স াবনা বর হেয় যােব। বািক থােক বািক
K − 2 িট কাট। এরা আসেল x বােদ বািক জায়গার যেকােনা কাথাও হেত পাের। x বােদ বািক
অংেশর দেঘ র যাগফল (1 − x) তাই এটা হেত পাের (1 − x)K−2 ভােব। তরাং x মােঝ হবার
স াবনা K(K − 1)(1 − x)(1 − x)K−2 dx. তাহেল x মােঝ হবার স াবনা আর সাইেড হবার
স াবনােক যাগ কের যিদ integration কর তাহেল উ র পেয় যােব।
েতই বেলিছ িনঃসে েহ এিট একিট কিঠন সম া। এবং একবার পেড়ই তুিম এটা বুঝেত
পারবা আিম আশা কির না। সিত কথা বলেত চাইিনজ িলখােক translate কের এর পর এই সমাধান
বুঝেত আমার বশ অেনক ণ লেগেছ।
৫৪
ডােনর সংখ া 000 হেত 999 পয মাট 1000 (10i ) রকম হেত পাের। তাহেল 1 আসেব মাট
32 × 1000 বার বা ফমুলায় িলখেল (L + 1)10i বার। যিদ d > S হয়? তাহেল িক আমােদর
বােমর সংখ া 31 হেত পারেব না। কন? ধর d = 7 > S = 5 এখােন দেখা (31)7(???) এরকম
কােনা সংখ া িক 1 হেত 315097 এর মােঝ নই। তার মােন আমােদর বােমর অংশ হেত পাের
0 হেত 30 পয মাট 31 রকম। আর ডােনর সংখ া আেগর মতই 1000 রকম। এ হেত আমরা
বর করেত পাির 7 কয় বার আসেব। বািক থােক d = 5 = S = 5 এর case. এই ে বােম
31 আসেত পারেব িক যখন 31 আসেব তখন আবার ডােন 000 হেত 999 পয সব িল সংখ াই
হয়েতা আসেত পারেব না। কবল 000 হেত 097 (R) পয আসেত পারেব। বােম 0 হেত 30 হেল
িক হেব তােতা d > S এর case থেকই বর কের ফেলছ। আর যিদ বােম L এর সমান হয় তাহেল
ডােন R + 1 রকম সংখ া আসেত পাের। তরাং এই ভােব আমরা সকল i এর ােন সকল d এর
সংখ া েন ফলেত পারব।
তেব িকছু িজিনেস সাবধান হেত হেব। যমন আমােদর এই উদাহরেণ i = 5 এ d = 0 কখনই
হেব না। আবার যখন i = 0 হেব তখন R এর মান কত হেব? আসেল আিম িনেজও জািন না য R
এর মান কত ধরেল িমলেব। আিম হেল এখােন কােনা risk নব না। বরং এখােন R ছাড়াই িহসাব
করব। ধর 315097 এ শষ ঘের (অথাৎ i = 0 এর ে ) 1 কত বার আেস? সহজ 1 যতবার
আসেব এর বােম 0 হেত 31509 পয মাট 31510 িট সংখ া আসেব। আর এর ডােন যেহতু
কােনা ঘর নাই তাই R এর িহসাব করার কােনা দরকার নই। একই ভােব d = S বা d > S এ
েসস করেত হেব।
আবােরা বিল, এই সম া বেল বুঝােনা কিঠন। আিম তামােক খুব জাড় সমাধােনর পথ বেল
িদেত পারব। িক তামােক িনেজ থেক এটা বুঝেত হেব। কারণ এেত অেনক step আেছ এবং
িতিট step এর জ ফমুলা বর করেত হেব। আিম িনি ত এর থেক হয়েতা সহজ উপােয় িহসাব
করা স ব যটা আমার মাথায় এই মুহূেত আসেছ না। তামরা কউ সরকম সমাধান পেল সবাইেক
জািনেয় িদও।
৫৫
দেখা 3 − 3 + 2 = 2. র মত খােট। এবার একিট বগ আঁক আর তার িট কণ আঁক। আমােদর
vertex িক 5 টা। বেগর চার কাণা আর কেণর ছদ িব । Edge িক 8 িট। বেগর চার বা আর
কেণর ছদ িব হেত বেগর কাণা িলেত। আর face িক 5 িট। বেগর ভতের 4 ভাগ আর বািহের
এক ভাগ। তাহেল 5 − 8 + 5 = 2. বুঝেতই পারছ এই ম ািজকাল ফমুলা আমােদর জীবনেক কত
সহজ কের িদেত যাে ! আমােদর সম ায় আমরা যিদ vertex আর edge এর সংখ া বর করেত
পাির, তাহেল এই ফমুলা ব বহার কের আমরা face এর সংখ া খুব সহেজই বর কের ফলেত পারব
(ভুেল যও না এই ফমুলা িক বািহেরর face কও count কের)। থেম তুিম িচ া কর কীভােব
িব িল বসাবা। আইিডয়া হেলা এমন ভােব বসাবা যন এমন কােনা িব যন না থােক যখােন
িদেয় 2 িটর বিশ ellipse এর কণ যায় (ellipse এর কণ বলেত বুঝাি আমােদর বসােনা িব
দর মােঝ আঁকা রখা িল)। কারণ যিদ কােনা িব িদেয় িতনিট কণ যায় আমরা চাইেল একিট
িব েক সিরেয় একিট ভাগ বাড়ােত পাির। তুিম একটু কাগেজ কলেম এেক দেখা। মেন কর একটা
X এর মােঝ িদেয় I এঁেকছ। আর আেরক জায়গায় িঠক মাঝ িদেয় না এেক একটু সিরেয় এঁেকছ। এই
ইভােব আঁকা ছিবর face এর সংখ া েন দেখা তাহেলই বুঝেব। অব আমােদর বসােনা n িট
িব েত যত খুিশ কণ িমিলত হাক আমােদর সম া নই। তাহেল হল vertex কয়িট? একিট
ছিব আঁকা যাক।
1
2 9
3
8
4
7
5 6
৫৬
closed form বর কের দিখেয়িছ।
∑
n−2
V′ = i(n − i + 2)
i=0
∑
n−2
= ni − i2 + 2i
i=0
∑
n−2 ∑
n−2 ∑
n−2
(৪.১)
= ni − i2 + 2i
i=0 i=0 i=0
∑
n−2 ∑
n−2 ∑
n−2
=n i− i2 + 2 i
i=0 i=0 i=0
(n − 2)(n − 1) (n − 2)(n − 1)(2n − 3) (n − 2)(n − 1)
=n − +2
2 6 2
এবার E বর করা যাক। আমরা E একটু সহেজ বর করব। আমরা যিদ আমােদর ােফর সব
vertex এর degree এর যাগফল বর করেত পাির তােক 2 িদেয় ভাগ করেলই E পেয় যাব। এই
সম ায় degree এর যাগফল বর করা সহজ। কারণ িতিট ছদ িব র degree 4 আর শীষিব
িলর degree n + 1 (িচে 1 এর সােথ 2 হেত কের 9 সবার একিট edge আেছ। সই সােথ
1 এর সােথ িট ellipse এর border আেছ, এ িলও edge, অথাৎ ellipse এর border বরাবর
1 য 2 আর 9 এর সােথ যু তার কথা বলিছ)। তরাং এেদর সবাইেক যাগ কের 2 িদেয় ভাগ
করেলই আমরা E পেয় যাব। এখন আমরা euler এর ফমুলায় V ও E এর মান বিসেয় F এর মান
বর করেলই আমােদর সম া সমাধান হেয় যােব।
একটা িজিনস। n এর মান িক 231 এর মত হেত পাের। আবার আমােদর ফমুলােত n3 এর টাম
আেছ। আমরা যিদ long long এও িহসাব কির তাহেলও overflow হেব। তরাং আমরা চাইেল c++
এ bigint এ কাড করেত পাির অথবা java ত কাড করেল আমরা java এর built in library এর
BigInteger ব বহার করেত পাির। আিম বলব তামােদর উিচত c++ ও java ই ভােবই সমাধান
করা। ই উপােয়র সােথ পিরিচত থাকা ভাল।
৫৭
i 30/i i 30/i i 30/i
1 30 11 2 21 1
2 15 12 2 22 1
3 10 13 2 23 1
4 7 14 2 24 1
5 6 15 2 25 1
6 5 16 1 26 1
7 4 17 1 27 1
8 3 18 1 28 1
9 3 19 1 29 1
10 3 20 1 30 1
√ এবার বড় i িল েসস করা যাক। আমােদর ল হল সসব i েসস করা যােদর জ √ k/i ≤
k হয়। মেন কর আমােদর উ র হল j (অথাৎ আমরা j এর একিট লুপ চালাি 1 হেত k পয )।
তুিম িক বলেত পারেব কান কান মােনর জ j উ র হেব? অথাৎ আমরা যিদ decimal division
এর কথা ভুেল যাই তাহেল আমরা সসব a চাই যন k/a = j হয়। অথাৎ a = k/j. িকছু উদাহরণ
দখা যাক। j = 1 হেল 30/1 = 30 যিট হেলা 1 উ র হবার শষ মাথা (কারণ 31 িদেয় ভাগ
করেল 0 হেয় যায়)। আমরা যিদ j = 2 িদেয় ভাগ কির তাহেল পাই 30/2 = 15 (16 িদেয় ভাগ
করেল 1 হেয় যায়) এবং এিট হেলা 2 উ র হবার শষ মাথা। j = 3 িদেয় ভাগ করেল 30/3 = 10
পাই এবং 10 হল 3 উ েরর শষ মাথা। তরাং আমরা উ র এর উপর যিদ লুপ চালাই এবং তা িদেয়
যিদ
√ k ক integer ভাগ কির তাহেল আমরা সই উ র এর শষ মাথা পেয় যাব। তেব এই কাজ
k এর থেক বিশ উ েরর জ করেত যও না (যিদ j এর লুপ িঠক মত চািলেয় থাক তাহেল এই
সম া হেব না)। বা করেলও একটু সাবধােন কিরও। যমন আমােদর উদাহরেণ যিদ আমরা উ র 9
ধরেত চাই এবং 30/9 = 3 কির তাহেল িক হেব না। 3 এ িক উ র √ 10. আসেল 9 উ র আলা
কােনা সংখ াই নই। তুিম যিদ একটু িচ া ভাবনা কর তাহেল বুঝবা য k পয িতিট মান উ র
হবার যাগ । তাই এ িনেয় আমরা ওত িচ া করব না। যাই হাক আমরা যিদ জািন 1 উ র হেব শষ
কান সংখ ায় (30), 2 উ র হেব শষ কান সংখ ায় (15), 3 উ র হেব শষ কান সংখ ায় (10)
তাহেল িক আমরা কান উ র কয়বার বা কান কান সংখ ার ে কানিট উ র আসেব সব বর
কের ফলেত পারব। যমন আমরা বলেত পাির 1 উ র হেব 16 হেত 30, 2 উ র হেব 11 হেত
15 ইত ািদ। আমরা চাইেল এখন যই সব সংখ ার জ j উ র তােদর count িনেত পাির, তােদর
যাগফল িনেত পাির ইত ািদ।
এত ণ আমরা একটা সমাধােনর টকিনক বললাম। এই সমাধােনর টকিনক ব বহার কের আমরা
আমােদর সম া কীভােব সমাধান করা যায় তা দখেবা। থমত খয়াল কর, আমােদর সম ায়
লুেপর ভতের mod আেছ। এেক আমরা ভােগ পিরবতন করেত পাির। ∑nk mod i = k − (k/i)i
যখােন ভাগিট
∑n হেলা integer division. তরাং আমরা
∑n িলখেত পাির i=1 k − (k/i)i বা আসেল
আমােদর i=1 (k/i)i বর করেলই চেল কারণ i=1 k = nk। এবার আমােদর টকিনক কােজ
লাগেব। থেমই দেখ নাও n িক k এর থেক বড় িকনা। বড় হেল i = k + 1 হেত n এর জ k/i
য 0 হেব তােতা আমরা আেগ থেকই √ জািন। তরাং সসব বাদ। আমরা ধের িনেত পাির n ≤ k.
এখন আমরা ছাট বড় ই ভাগ করব √ k এর িভি েত। থেম i = 1 হেত লুপ চািলেয় (k/i)i
বর করেত থাকব যত ণ k/i > k হয় ( খয়াল করেত হেব i যন আবার n এর থেক বড় না
হেয়
√ যায়)। এবার ভাগফেলর উপর লুপ চালােনার পালা। আমরা এবার j এর লুপ চালােবা 1 হেত
k পয । িতবার j উ র হেব এরকম শষ সংখ া বর করব k/j. j + 1 উ র হেব এরকম শষ
সংখ া k/(j + 1). তরাং k/(j + 1) + 1 হেত k/j পয সংখ া িলর জ k/x = j হেব যখােন
x হেলা ঐ রে থাকা যেকােনা সংখ া। তরাং আমােদর sum য িছল (k/i)i এর উপর সটা
এখন পালেট হেয় যােব jx কারণ আমরা ধেরিছ j হল ভাগফল আর x হেলা সরকম সংখ া িল।
৫৮
তরাং িত j এর জ আমরা যিদ x িল অথাৎ k/(j + 1) + 1 হেত k/j পয এর যাগফল বর
কের ফলেত পাির তাহেলই হেব। আর এই যাগফল চাইেলই ফমুলার সাহােয বর কের ফলা যায়।
একটা িজিনস আবােরা খয়াল রাখেত হেব যন এই য সংখ ার র এর মােঝ যন n এর থেক বড়
সংখ া না থােক। নেত কিঠন লাগেলও আসেল এটা ওত কিঠন না। তুিম একটু কাগেজ কলেম িনেজ
থেক িচ া কের দেখা আর কাড কের দেখা তাহেলই পির ার হেয় যােব।
৫৯
থম quadrant এ (axis বরাবর িব বােদ) কয়িট ি ড পেয় টেক আমরা দখেত পারব, তাহেল
তােক চার িদেয় ন করেলই আমরা সকল quadrant এর জ উ র বর কের ফলেত পারব।
কারণ সব quadrant হেলা symmetric. তরাং আমরা জানেত চাই [1, a] × [1, b] এর মােঝ
কান কান িব েক আমরা দখেত পারব। ধরা যাক আমরা (i, j) ক দখেত পাই। তাহেল িক
(ki, kj) ক আমরা দখেত পারব না। আবার অ ভােব বলেল বলা যায় যিদ (i, j) একিট িব
হয় এবং i ও j এর যিদ একিট সাধারণ ণনীয়ক g থােক তাহেল (i/g, j/g) ারা (i, j) বাধা া
হেব। অথাৎ আমরা সসব (i, j) ক দখেত পারব যােদর কােনা সাধারণ ণনীয়ক নই। তার মােন
আমােদর বর করেত হেব 1 ≤ i ≤ a, 1 ≤ j ≤ b হেল কয়িট (i, j) এর জ gcd(i, j) = 1 বা i
ও j পর র coprime হেব। আিম এখােন এিট সমাধােনর ইিট উপায় িব ািরত বলব আর আেরকিট
advanced উপােয়র জ সামা hints দব। যােদর ই া তারা যন নেট দেখ িনেত পাের।
থম উপায় হেলা euler এর phi function ব বহার করা। িকছু ণ আেগই আমরা দেখিছ i এর
সমান বা ছাট এবং তার সােথ coprime এরকম সংখ ার count হেলা phi(i). আর িকছু ণ আেগই
(UVa 11440) এ দেখিছ এই coprime িল িত i িট সংখ ায় repeat হয়। অথাৎ 1 হেত i এর
মােঝ যত িল সংখ া i এর সােথ coprime, i + 1 হেত 2i এর মােঝ িঠক ততিট সংখ াই coprime,
2i + 1 হেত 3i এর মােঝও। এভােব চলেত থাকেব। তরাং আমরা i এর একিট লুপ চালােবা 1 হেত
a পয । এবং িতিট i এর জ আমরা দখেবা 1 হেত b এর মােঝ কত িল সংখ া আেছ যারা i এর
সােথ coprime. এজ আমরা থেম phi(i) বর করব এবং b/i িদেয় (integer division) ন
করব। বািক থাকেব i(b/i) + 1 হেত b পয সংখ া িল। এখােন বািক সংখ ার পিরমাণ b mod i
তাই না? কারণ এ িল হেলা i এর সবেথেক শষ multiple থেক b পয সংখ া িল। যেহতু i
এর মান a থেক বড় না তরাং এর মান 2000 থেকও বড় না। অথাৎ এই য অিতির সংখ া তা
কখনই 2000 থেক বড় হেব না। আর এিট িতিট i এর জ ই। তরাং আমরা বলেত পাির 20002
িট সংখ ার জ আমােদরেক আলাদা কের gcd বর করেত হেব। এটা িত case এ কােনা ব াপার
না। যিদও কয়িট case ( থাকেব
) সটা আমােদর বলা নই। তাহেল আমােদর এই সমাধােনর time
complexity হেব O a2 . সমাধানটা হেলা- আমরা i এর একিট লুপ চালােবা 1 হেত a পয । তার
phi(i) বর করব এবং b/i িদেয় ন করব। এরপর i(b/i) + 1 থেক b পয লুপ চািলেয় i এর সােথ
gcd বর কের দখেবা য তােদর gcd 1 িকনা। এভােব gcd 1 ওয়ালা pair এর সংখ া count
করব।
এবার ি তীয় উপায় বলা যাক। যখনই দখবা coprime হেত হেব বা তােদর gcd g হেত হেব
এরকম ধরেনর কথাবাতা বলা থাকেব তখন এই প িত ায়ই কােজ লােগ। যিদ বলত gcd(i, j) = g
কত িল (i, j) এর জ হেব? তাহেল িজিনসটা কিঠন। িক যিদ বলত gcd(i, j) g এর multiple
হেব কত ভােব? তাহেল িক সই উ র বর করা সহজ। এিট িক (a/g)×(b/g) (integer ভাগ)।
কন? কারণ [1, a/g] × [1, b/g] এই ি েডর যেকােনা িব ধরা যাক (x, y) তাহেল (gx, gy)
িব িট [1, a] × [1, b] ি েড থাকেব এবং তােদর gcd হেব g এর multiple. এখন একটা িজিনস
িচ া কর [1, a] × [1, b] এই ি েড যেকােনা (x, y) এর gcd িক সেবা M = min(a, b)।
তাহেল আমরা 1 হেত M পয িতিট সংখ া i এর জ বর করেত পাির কত িল িব আেছ যােদর
gcd i এর multiple. তাহেল আমােদর সম া িনেচর সম ায় পিরণত হেব-
f ও g িট n সাইেজর অ াের দওয়া আেছ। f [i] এ থাকেব g এর অ ােরেত i এর multiple
∑
এর পিজশন িলেত যসব সংখ া থাকেব তােদর যাগফল অথাৎ f [i] = j g[j] যখােন j হেলা i
এর multiple. f এর মান সমূহ দওয়া আেছ, g এর মান িল বর করেত হেব।
এিট একিট common সম া। অথাৎ িবিভ সম া সমাধান করেত গেল এরকম সম ায়
reduce হেয় চেল আেস। এই সম া n log n এ সমাধান করা যায়। আইিডয়া হল g এর মান
পছন থেক বর করা, অথাৎ থেম g[n], এরপর g[n − 1], এরপর g[n − 2] এরকম কের
এেক এেক g[1] পয মান বর করেত হেব। মেন কর g[i] এর মান বর করেত চাও। যেহতু
আমরা পছন থেক মান বর করিছ তরাং i এর থেক বড় সব index এ g এর মান ইেতামেধ ই
বর কের ফেলিছ। অথাৎ আমরা i বােদ i এর সব multiple এর মান বর কের ফেলিছ। এখন
আমরা যিদ f [i] হেত i বােদ i এর অ া multiple এর index এ থাকা g এর মান িবেয়াগ কির
তাহেল g[i] বর হেয় যােব। অথাৎ তুিম যখন g[4] বর করেত চাইেব তখন যা করেত হেব তাহেলা
g[4] = f [4] − g[8] − g[12] − g[16] . . .. আর এটার complexity য sieve এর মত হেব তােতা
৬০
বুঝেতই পারছ।
তৃতীয় উপােয়র কথা আিম িব ািরত বলব না। যােদর আ হ আেছ তারা mobious inversion
( )
পেড় দখেত পােরা। এভােব করেল complexity িত কেস O n হেব (যিদও sieve এর মত
precalculation লাগেব একটা)।
৬১
এবং সই subsequence এর length এর ণফল যন সকল contiguous subsequence এর
মােঝ সবেচেয় বিশ হয়। যমন- যিদ আমােদর মূল sequence হয় 30, 60, 20, 20, 20 তাহেল
আমােদর উ র হেব 80 যা আমরা শষ চারিট element িদেয় তির contiguous subsequence
থেক পােবা।
সমাধান: এখােন সবেচেয় বড় observation হেলা-
মেন কর তুিম i এ শষ হয় এরকম সকল contiguous subsequence িনেল এবং তােদর
gcd িল বর করেল। এখােন আসেল log a এর বিশ িভ িভ gcd নই যখােন a হল আমােদর
i তম সংখ া। অথাৎ তুিম যিদ (i), (i − 1, i), (i − 2, i − 1, i), . . . (1 . . . i) এরকম index িলর
জ যিদ যথা েম gcd(a[i]), gcd(a[i−1], a[i]) . . . gcd(a[1], . . . a[i]) বর কর তাহেল এখােন
log a[i] এর থেক বিশ িভ gcd থাকেব না।
কন? কারণ খুব সহজ। মেন কর তুিম i এ শষ হওয়া সকল contiguous subsequence এর
জ gcd বর করেল। অথাৎ gcd(a[i]), gcd(a[i], a[i − 1]) এভােব gcd(a[i] . . . a[1]) পয ।
এরা একিট non increasing sequence. কারণ আেগর সংখ ার সােথ নতুন আেরকিট সংখ া
লািগেয় gcd বর করেল নতুন সংখ া কখনই আেগর সংখ া থেক বড় হেব না। আর যিদ ছাট হয়
তাহেল কমপে ই ন ছাট হেব। কারণ পেরর সংখ া তা আেগর সংখ ােক ভাগ দেবই। আর
যিদ সই সােথ ছাট হেত হয় তাহেল কমপে ভােগর সমান হেব। তার থেক ছাটও হেত পাের,
িক বড় হবার স াবনা নই। অথাৎ যখন ছাট হে তখন অ ত 2 ভাগ হেবই। তরাং আমােদর
এখােন আসেল log(a[i]) এর থেক বিশ িভ gcd থাকেব না। কারণ তুিম যিদ a[i] ক log a[i]
বার 2 িদেয় ভাগ কর তাহেল তা 1 হেয় যােব। আর একবার যিদ 1 হেয় যায় তাহেল তা আর ছাট
হেত পারেব না।
তাহেল কীভােব আমরা এই সম া সমাধান করব? খুব সহজ। আমরা একিট অ ােরেত িভ িভ
gcd এর জ িলেখ রাখেবা য এই gcd পেত আমরা সেবা এেতা দূর যেত পাির। অথাৎ g gcd
পেত আমরা i হেত j পয যেত পাির (j < i), g' পেত হয়েতা k পয যেত পাির (k < j).
এরকম। যখন আমরা নতুন সংখ া অথাৎ i + 1 তম সংখ া নব তখন আমরা নতুন সংখ ার সােথ
পুরাতন gcd (g, g' ইত ািদ) িলর gcd বর করব। যিদ পাশাপািশ িট gcd একই হয় তাহেল
ঐ ইিট range ক merge কের দব। এভােব চলেত থাকেব। উদাহরণ দওয়া যাক, মেন কর
আমােদর sequence এ িট সংখ া আেছ a[0] = 25, a[1] = 60. তাহেল আমােদর অ ােরেত
িলখা থাকেব 60 পেত 1 পয যেত হয়, আর 5 পেত 0 পয যেত হয়। এখন মেন কর নতুন
সংখ া আসল 35 (a[2] = 35). তখন আমরা িলখব 35 পেত 2 পয যেত হয়। 5 পেত যেত
হয় 1 (gcd(35, 60) = 5), 5 পেত যেত হয় 0 (gcd(35, 5) = 5). খয়াল কর শষ িট gcd
একই, তরাং এেদর merge কের আমরা িলখেত পাির 5 পেত 0 পয যেত হয়। এই কাজ আসেল
খুব সহেজই কাড করা যােব, স িনেয় িব ািরত বলিছ না। এই সম া সমাধােনর মূল িজিনস হেলা
log n সং া observation.
৬২
জ ও এক রকেমর physics ঝালাই।
এই সম া সমাধােনর জ আমােদর মূল যই theorem জানেত হেব তাহেলা- শি র কােনা
ংস নই, এিট কবল এক প হেত অ েপ পা িরত হয়। এখােন মা ষিট একিট ি েজর উপর
দািড়েয় আেছ। তরাং তার একিট potential energy (ি িত শি ) আেছ। এখন স যিদ লাফ দয়
তাহেল যত ণ না স মািটেত আসেছ তত ণ তার potential energy কমেত থাকেব। িক এই
কমা শি কই যােব? এর এক অংশ পিরণত হেব kinetic energy (গিত শি ) ত আর আেরক
অংশ পিরণত হেব bungee দিড়র potential energy ত, কারণ দিড়র দঘ l এর থেক বিশ হেয়
গেল সিট আবার িপেছ (মােন উপের) টানেত করেব। তরাং আমােদর কাজ এই সব energy
বর করা।
তামরা চাইেল potential energy এবং kinetic energy এর ফমুলা বা তার derivation
নেট দখেত পােরা। মূল কথা হেলা m ভেরর কােনা ব যিদ ভূপৃ হেত h উ তায় থােক তাহেল
তার potential energy হেব mgh যখােন g হেলা অিভকষজ রণ। আর v বেগর কােনা ব র
kinetic energy হেলা 21 mv 2 . আর সম ােতই বলা আেছ য bungee দিড় যিদ সাম অব া হেত
∆l দূর সরােনা হয় তাহেল সখােন দিড়িট k∆l শি েয়াগ করেব। তাহেল দিড়র সাম অব া
থেক z দূরে এর potential energy এর পিরমাণ কত হেব? এভােব িচ া কর x এ থাকেত এর
উপর কাজ করা বেলর পিরমাণ kx. এখন যিদ তুিম তােক খুব ছাট dx দূর সরাও তাহেল কাজ
∫z
হেব kxdx (কাজ = বল x সরণ). তাহেল 0 হেত z পয সড়ােত কােজর পিরমাণ 0 kxdx বা
2 kz .
1 2
তাহেল আমরা আমােদর েয়াজনীয় সব ফমুলা জািন। এখন আমােদর কাজ িকছু equation দাঁড়
করােনা। েতই বেলিছ শি র ংস নই। তরাং একদম েত যখন লাকিট ি েজর উপের িছল
তখন তার potential energy এর পিরমাণ িছল wgs. যেহতু স তখন ি র অব ােন িছল তাই
তার kinetic energy 0. তরাং েত মাট energy wgs.
এখন মেন কর স লাফ িদল এবং x দূর অিত ম কের ফলল। এই অব ায় তার potential
energy হেব wg(s − x). িক kinetic energy? এটা তার বেগর উপর িনভর কের, ধরলাম তার
বগ v, তাহেল kinetic energy হেব 21 wv 2 . আর bungee দিড়র potential energy? যিদ
x ≤ l হয় তাহেল িক দিড়র potential energy 0. কারণ এখেনা দিড় তার সাম অব ায় যায়
নাই, সাম অব া হেত দূের যাওয়া তা দূেরর কথা। তরাং এই ে আমােদর শি র িনত তা সূ
বেল wgs − wg(s − x) = 12 wv 2 কারণ আমােদর potential energy ত যই পিরমাণ পিরবতন
হেয়েছ তা স ূণ kinetic energy ত পা িরত হেয়েছ, দিড়র potential energy ত পিরণত
হয় নাই। এখন যিদ s ≤ l হয়, অথাৎ দিড়র দঘ যিদ ি েজর উ তার চেয় বড় হয় তাহেল আমরা
এই সূ হেত v এর মান বর করেত পাির (x = s বিসেয়)। এবং v এর মান 10 এর সােথ তুলনা
কের দখেবা য লাকটা মের যায় নািক ভালভােব মািটেত পৗঁেছ।
এখন যিদ x > l হয় তাহেল? এবার তাহেল দিড়র potential energy আেছ। সাম অব া
থেক এিট x − l দূরে আেছ। তরাং এর potential energy হেব 12 k(x − l)2 . অথাৎ আমােদর
equation হেব wgs − wg(s − x) = 12 wv 2 + 12 k(x − l)2 . এখন িক করেব? এই সমীকরেণ
x = s বিসেয় v বর করেব? না। তার আেগ দখেত হেব দিড় আেদৗ মািটেত পৗঁছায় িকনা। যিদ
দিড় মািটেত না পৗঁছায় তাহেল মািটেত পৗঁছানর আেগই কাথাও থেক স ফরত িগেয়েছ। িঠক
সই জায়গােত সই মুহূেত v = 0 হেয় গেছ। তাই উপেরর equation এ v = 0 বিসেয় x বর
কর। যিদ দেখা য x < s এর জ সমাধান আেছ তার মােন স মািট েশর আেগই িফের গেছ।
আর নাহেল মািট শ কেরেছ। যিদ মািট শ কের তাহেল x = s বিসেয় v এর মান বর কের
ফল।
৬৩
করা যায়। যমন N = 15 ক আমরা িতনভােব কাশ করেত পাির 1 + 2 + 3 + 4 + 5, 4 + 5 + 6
এবং 7 + 8. Test case সংখ া 200 িট।
সমাধান: এধরেনর সম া িল সমাধান করা খুব একটা কিঠন না। যা করেত হয় তাহেলা এেক ফমুলার
আকাের িলখেত হেব এরপর সই ফমুলা কতভােব সমাধান করা যায় তা দখেত হেব। যমন এই
সম ােত আমরা ধরেত পাির আমােদর িসিরেজর র সংখ া a আর মাট n িট সংখ া আেছ সই
িসিরেজ। তাহেল আমােদর িসিরজ টা হেব a, a + 1, . . . (a + n − 1). এেদর যাগফল হেব N .
আর শত মেত n > 1 এবং a > 0 হেত হেব। এই িসিরেজর সংখ া িলেক∑যাগ করেল কত হেব?
n(2a+n−1) n−1
2 . িবিভ ভােব এই যাগফল বর করা যায়। একিট উপায় হেলা i=0 a + i তেব সহজ
উপায় হেলা গাউেসর প িত ব বহার করা। এ িনেয় এর আেগর বইেয় আেলাচনা হেয়েছ তেব যিদ
কউ না জেন থােকা নেট দেখ িনেত পােরা। যাই হাক, তাহেল এই যাগফেলর মান হেলা N .
এর মােন আমরা িলখেত পাির n(2a+n−1)2 = N বা n(2a + n − 1) = 2N . আমরা N জািন
িক a বা n জািন না। আমােদর ল হেলা কত িল valid a ও n এর মান পাওয়া যােব তা বর
করা। এই ফমুলা থেক একিট িজিনস পির ার য n হেব 2N এর একিট ণনীয়ক। আর িক িক
বুঝা যায়? যেহতু আমােদর ডান পাশ একিট জাড় সংখ া তরাং আমােদর বাম িদেকর িট factor
এর একিটেক অব ই জাড় হেত হেব। িক একটু খয়াল করেল তুিম আরও িকছু আিব ার করেব।
যমন মেন কর n জাড়, তাহেল 2a+n−1 অবশই িবেজাড় হেব। আবার যিদ n িবেজাড় হয় তাহেল
2a + n − 1 অব ই জাড় হেব। উদাহরণ দখা যাক, ধর N = 6. তাহেল n(2a + n − 1) = 12.
আমরা 12 ক নানা ভােব factor করেত পাির 1 × 12, 2 × 6, 3 × 4. এর মােন আমােদর n এই 6
িট সংখ ার কােনা একিট হেবই। িক কান কানিট হেত পাের? তুিম যিদ n এর মান ধর 2 তাহেল
2a + n − 1 ক হেত হেব 6 (কারণ n(2a + n − 1) = 12) আর তাহেল a = 5/2. এরকম কের
সকল n এর জ আমরা a এর মান বর করেত পাির। এবং এই মান িলর িদেক তাকােল আমরা
বুঝেত পারব কান কান মান n এর জ valid আর কান কানিট না। valid িক না কীভােব বুঝেব?
যিদ n ও a িটই পূণসংখ া হয় এবং n > 1, a ≥ 1 হয় তাহেলই সিট valid. আরও একিট উদাহরণ
দখা যাক। ধর N = 15. তাহেল n(2a + n − 1) = 30. 30 ক আমরা কত ভােব factorize
করেত পাির? 1 × 30, 2 × 15, 3 × 10, 5 × 6. তরাং n = 1, 2, 3, 5, 6, 10, 15, 30 এই 8
রকম মান হেত পাের। এর মােন িক N = 15 ত উ র 8? না। আমরা Problem Description এ
দেখিছ উ র 3. তাহেল কািহনী িক? থমত n > 1 হেত হেব। তাই 1 বাদ। এখেনা 7 িট মান বািক
আেছ। তুিম যিদ n = 10 চ া কর তাহেল দখেব 2a + n − 1 = 3 আর তাহেল a = −3. িক a
ক ধনা ক হেত হেব। এর মােন n = 10 হেত পারেব না। একই ভােব n = 6, 15, 30 হেত পারেব
না। এর মােন সমাধান 3 িট। তাহেল এই ইিট উদাহরণ থেক িক িশখেল? িশখলাম য, 2N ক
factorize করেলই হেব না। 2N এর যত factor আেছ তােদর মােঝ িকছু িকছু n হেত পারেব। িক
কারা? থমত 1 হেত পারেব না। কারণ n > 1. আর a > 0 হবার জ আমােদর িক শত পূরণ
করেত হেব? একটু িচ া করেল বুঝেব য 2a + n − 1 > n হেত হেব। কন? কারণ 2N এর একিট
factor হেলা n আর ওপর factor 2a + n − 1. যেহতু a ধনা ক তাহেল তা 2a + n − 1 > n
হেবই তাই না (কারণ a > 0 এবং integer হেল 2a − 1 > 0)? তরাং আমরা সব শেষ যা বুঝেত
পারলাম তাহেলা 2N এর কত িল divisor x আেছ যা 1 এর থেক বড়, x ও 2N /x একই সােথ
জাড় না এবং x < 2N /x১ হেত হেব। আমরা যা করেত পাির তাহেলা 2N এর িতিট divisor
িনেয় িনেয় চক করেত পাির। িক 200 িট case এর জ এই কাজ করা একটু বিশ costly হেয়
যেত পাের। এর থেক িক আরও ভাল কােনা উপায় আেছ?
এই পযােয় এেস তুিম নানা ভােব িচ া করেত পােরা। একিট উপায় হেত পাের- আমরা যিদ
restriction িলেক relax কির তাহেল িক হেব। অথবা উলটাও িচ া করেত পােরা। আমরা এেক
এেক restriction িলেক আেরাপ করেল িক হেব। সবার থেম আমােদর কােনা restriction
নই। তাই আমােদর বর করেত হেব কয়িট divisor আেছ। এর একিট ফমুলা আেছ (q1 + 1)(q2 +
1) . . . (qk + 1) যখােন 2N = pq11 pq22 . . . pqkk . এখন যই িতনিট restriction আেছ তার মােঝ
সবেচেয় কিঠন মেন হয় একিট জাড় আেরকিট িবেজাড়। িক এই ফমুলা অ সাের এিট খুব একটা
কিঠন না। যিদ p1 = 2 হয় তাহেল (q1 + 1) এর টামটা ফমুলা থেক সরােয় িদেত পারেলই হেব।
১ সমান িক হেত পারেব? যেহতু একিট জাড় আেরকিট িবেজাড় হেত হেব সেহতু আসেল িট সমান কখনই হেত পারেব
না।
৬৪
মােন আমরা 2 বােদ বািক prime িলেক সব ভােব distribute করিছ। এবার 2 িলেক একবার
বাম িদেক আেরকবার ডান িদেক িদেলই হেব। উদাহরণ দয়া যাক, মেন কর 2N = 30. তাহেল
2 িল সিরেয় িনেল থােক 15. 15 এর divisor হে 1, 3, 5, 15. এেদর সােথ 2 ন করেল িকছু
divisor পােবা (ধরা যাক এেদরেক y িদেয় কাশ করা হয়) আর না করেল িকছু (ধরা যাক এেদর x
িদেয় কাশ করা হয়)। িতিট y এর জ একিট x আেছ (x = 2N/y) আর উলেটাটাও সিত অথাৎ
িতিট x এর জ একিট y আেছ। এই x, y pair এর একিট ছাট হেব অপরিটর থেক আর সিটই
হেব আমােদর n. কবল n = 1 হেত পারেব না এিটই বািক থাকল। এটা 1 িবেয়াগ কের িনেলই
হেব। তেব N = 1 এর ে একটু সাবধান হেত হেব এই আর িক।
যমন 2N = 30 = 2×3×5. তাহেল (1+1)(1+1) = 4. তরাং মাট 4 িট odd divisor.
আর তােদর 2 িদেয় ন করেল আমরা আরও 4 িট পােবা। মাট 8 িট। এেদরেক xy আকাের িলখেল
ধু ছাট িল n হেত পারেব। তরাং 8/2 = 4 িট। এই ছাট 4 িটর মােঝ একিট হেলা 1. তাহেল
উ র 4 − 1 = 3. তরাং আমােদর উ র হেব (q2 + 1) . . . (qk + 1) − 1.
৬৫
সমাধান: উ র 232 এর mod এ িদেত হেব, তাই আমরা যিদ সব িহসাব unsigned int এ কির
তাহেল mod আপনা আপিনই হেয় যােব।
আশা কির তামরা lcm বর করার নানা উপায় জান। িচ া কর এর মােঝ কান প িতিট এখােন
কােজ দেব। LCM বর করার একিট উপায় হেলা িতিট াইম িনেয় দখা য তার সেবা কান
power আমােদর দ সংখ ার কােনা না কােনা একিট সংখ ােক ভাগ কের। আমােদর সম ায়
আমােদরেক 1 হেত n পয সব িল সংখ া দওয়া আেছ। আমরা যিদ 1 হেত n পয িতিট prime
এর জ বর করেত পাির সই াইেমর সেবা কান power িট n এর সমান বা ছাট, তাহেলই
আমরা lcm এ সই prime এর power পেয় যাব। যমন n যিদ 15 হয় আর আমরা যিদ 2 িনেয়
মাথা ব াথা কির তাহেল 2 এর সেবা power যা খুব জাড় n সটা হেব 23 = 8, কারণ 24 = 16
িক 15 এর থেক বড়। তরাং আমােদর lcm এ 2 এর power হেব 3. িক িত case এ 108
পয সব prime িনেয় িনেয় এই চক করা খুবই সময় সােপ ব াপার। কারণ আমােদর case আেছ
10,000 িট। তাহেল উপায় িক?
মােঝ মােঝ খুব ভাল উপায় বর করার থেক বতমান প িতেক optimize করেত √ চাওয়া টা
পারবা য আসেল n এর থেক
বুি মােনর মত কাজ হয়। যমন এখােন, একটু িচ া করেল বুঝেত √
বড় াইম িলর খুব জাড় 1 power থাকেব। তাই আমরা যিদ n এর থেক বড় এবং সেবা
√ পয
n াইম িলর ণফল সহেজ এবং কম সমেয় বর করেত পারতাম তাহেল িত case এ
n সময় লাগত, যা ac পাবার জ যেথ । এই ে আমরা square root decomposition
প িত ব বহার করেত পাির। 1 হেত 108 পয সকল াইম বর কের তােদরেক square root
segment এ ভাগ কের √ িত segment এর ণফল বর কের রােখা। তাহেলই তামরা িতিট n
এর জ খুব সহেজ n হেত n পয prime িলর ণফল বর কের ফলেত পারেব। Square
root decomposition না জানেল তা বই আর নট আেছই।
৬৬
এর আেগ কান কান দরজায় িগেয়িছেল তা তামার আর মেন থাকেব না। িতবার তুিম randomly
দরজা িনবাচন করেব। তামােক বলেত হেব এই maze হেত ব েত expected কত সময় লাগেব।
যিদ এই maze হেত বর হওয়া স ব না হয় তাহেল impossible ি ট কর।
সমাধান: ধরা যাক Ei হেলা i তম ঘর হেত কের n তম ঘের িগেয় শষ করেল expected
কত সানা পাওয়া যায় সই পিরমাণ ( সই ঘর সহ)। আমােদর বর করেত হেব E1 এর মান। মেন
কর তুিম 1 এ থাকেত একিট ছ া মারেল। তাহেল এেত 1 হেত 6 এর যেকােনা একিট পড়েত
পাের। ধরা যাক x পরল। তাহেল পেরর ঘর হেব 1 + x. এখান থেক তুিম expected E1+x
িট সানা পােব। x পড়ার স া না 1/6. এরকম কের যিদ তুিম x এর মান 1 হেত 6 সব িল
চ া কর তাহেল পােব E1 = gold[1] + 61 (E2 + E3 + . . . E7 ) এরকম কের তুিম সব Ei
এর মান বর কের ফলেত পারেব। সম া হেব যখন কােনা একিট Ei থাকেব না। যমন তুিম
En−1 এ থেক যিদ 2 ফেলা তাহেল তুিম En+1 এ যেত চাইেব। িক En+1 বেল তা িকছু
নই। সে ে িক করেব? সে ে তা তুিম ঐ ঘেরই থােকা তাই না? তার মােন তুিম আবােরা
ছ া মারেব আর সে ে তামার expected মান হেব En−1 ই। অথাৎ আমােদর equation হেব
En−1 = gold[n − 1] + 61 (En + En−1 + En−1 + . . .) ( মাট 5 িট En−1 থাকেব)। তরাং
আমরা যিদ i = n হেত 1 পয Ei এর মান বর কির তাহেলই আমােদর সম া সমাধান হেয় যােব।
৬৭
আর এখােন base case হেব En = gold[n] কারণ n তম ঘের আসেল তুিম ধু ঐ ঘেরর সানা
িনেয় খলা শষ কের দেব।
৬৮
৪.১ অ শীলনী
৪.১.১ সম া
Simple
UVa 1648 Business Center LOJ 1007 Mathematically Hard
LOJ 1014 Ifter Party LOJ 1028 Trailing Zeroes (I)
LOJ 1035 Intelligent Factorial Factorization LOJ 1054 Efficient Pseudo Code
Easy
UVa 11040 Add bricks in the wall UVa 1644 Prime Gap
UVa 1210 Sum of Consecutive Prime Numbers UVa 10539 Almost Prime Numbers
UVa 10622 Perfect Pth Powers UVa 1646 Edge Case
LOJ 1340 Story of Tomisu Ghost LOJ 1370 Bi-shoe and Phi-shoe
Medium
UVa 808 Bee Breeding UVa 294 Divisors
UVa 11526 H(n) UVa 11105 Semi-prime H-numbers
UVa 1649 Binomial coefficients UVa 10640 Planes around the World
LOJ 1298 One Theorem, One Year LOJ 1318 Strange Game
৬৯
৭০
অধ ায় ৫
Bruteforce এবং backtrack কােনা রকেমর smart algorithm না। বরং এিট গাধার মত
সাজা সাপটা ভােব যা করেত বেলেছ তা করা। িক তাই বেল বিশ গাধার মত করেল হেব না।
হয়েতা মােঝ মােঝ তামােক ছাট খােটা ি খািটেয় সমাধানিট সহেজ কাড করেত হেব। বা কােনা
সময় ছাট খােটা optimization কের run time ক কিমেয় আনেত হেব।
সমাধান: যেহতু fghij একিট 5 িডিজেটর সংখ া আমরা এর জ 0 হেত 99999 পয লুপ চালােত
পাির। এরপর এেক input এর N এর সােথ ন করেল abcde বর হেয় যােব। আমরা এরপর চক
কের দখেত পাির য এই িট সংখ ার সকল িডিজট আলাদা আলাদা িকনা। যিদ হয় তাহেল এই জুিট
আমােদর একিট সমাধান।
তামরা চাইেল িকছু ছাট খােটা optimization করেত পােরা। যমন fghij এর লুপ 0 হেত না
চািলেয় 1000 হেত চালােনা। কারণ এর থেক ছাট িট সংখ ার থম িট িডিজট শূ । আবার যিদ
দেখা য N ক fghij িদেয় ন করেল সংখ ািট 99999 এর থেক বড় বা 1000 থেক ছাট হয়
তাহেল আর ক কের চক করার দরকার নই। এই সম ােত এই ধরেনর সহজ optimization
দরকার নই, তেব হয়েতা অ কােনা সম ায় দরকার হেত পাের।
৭১
তাই সেবা 1018 হেত পাের যা long long এ ধরেব। তরাং আমােদর long long এর variable
িনেয় িহসাব িনকাশ করেত হেব। int িনেয় কাজ করেল হেব না, overflow হেব।
৭২
মােন তুিম চ া করেব থম ধরেনর র বিশ বিশ কের িনেত। অথাৎ তুিম ি তীয় র িট কখনই s1
এর সমান বা এর থেক বিশ সংখ√ক নেব না। িনেল সই s1 িট ি তীয় রে র পিরবেত s2 িট থম
র িনেত পারেব। যেহতু s1 ≤ n তরাং তুিম ি তীয় র 0 হেত s1 − 1 েত ক ভােব নবার
চ া করেব। আর বািক অংশটু থম র িদেয় ভরােনার চ া করেব। এভােব সকল কার ভােব
চ া করেল তুিম optimal উপায় পেয় যােব।
সমাধান: িন য় এসম া নানা ভােব সমাধান করা যায়। আমরা এখােন IDA* ব বহার করব। IDA*
এর পূণ প হেলা iterative deepening A*. ভাগ বশত আিম আমার " া ািমং কে ট " বইেয়
IDA* স েক িকছুই িলিখ নাই। তাই এখােন এ িনেয় িকছু িলখিছ।
IDA* বুঝার আেগ আমােদর বুঝেত হেব searching িক। মেন কর আমােদর এই সম ায়
র ান (state) একিট বাড। এর সােথ িকছু অপােরশন দওয়া থাকেব। কােনা এক ােন যিদ
কােনা অপােরশন কর তাহেল তুিম আেরক ােন যােব। আমােদর ল হেলা সবেচেয় কম অপােরশন
ব বহার কের আমােদর কাি ত লে পৗঁছান। এিটই হেলা searching. অথাৎ দ অপােরশন
সমূহ ব বহার কের র ান হেত লে সবেচেয় কম খরেচ পৗঁছানই হেলা searching (আসেল
সবেচেয় কম খরেচ পৗঁছান সবসময় ল থােক না। িক আমােদর আেলাচনার িবধার জ আমরা
ধের নই সবেচেয় কম খরেচ পৗঁছােত চাই)।
যিদ উপেরর প ারা ভাল কের পের থােকা তাহেল দখেব এখােন িতনিট িজিনস আেছ। এক- র
ান, ই- ল , িতন- অপােরশন। একটা িজিনস, ল িক একটা িনিদ ান নাও হেত পাের। এটা
হে একিট rule যা িদেয় তুিম বুঝেত পারেব য তুিম তামার লে পৗঁেছ িগেয়ছ। যমন এই
সম ােত ল িক নানা রকম হেত পাের। তেব ল বুঝার rule হেলা মােঝর 8 িট ঘের একই
সংখ া থাকা। অ ঘর িলেত যা খুিশ থা ক তা িনেয় মাথা ব াথা নই।
তাহেল এই searching সম া সমাধান করবা কীভােব। একিট উপায় হেত পাের bfs বা dfs
কের সমাধান করা। িক আমরা dfs কের সমাধান করেত পারব না। কন? মেন কর A হেত B ত
যাওয়া যায় (এখােন A, B, C ইত ািদেক state িহসােব িচ া কর, এই সম ার সােথ এেদর কােনা
স ক নই)। আবার A হেত C হেয় B ত যাওয়া যায়। এখন dfs তা চাইেল A-C-B এই রা ােত
৭৩
B ত যেত পাের ফেল A-B য ছাট রা া আেছ সটা আিব ার হেব না। তরাং dfs িদেয় আসেল
সবেচেয় ছাট রা া বর করা স ব হয় না। তাহেল িক আমরা bfs িদেয় সমাধান করেত পাির? হয়েতা
হেব। িক সম া হেলা আমােদর state সমূহ save কের রাখেত হেব তােদর visited মাক করেত
হেব। এসব করেত হয়েতা অেনক সময় লাগেব ( ােফ সাচ করেত সময় লাগেব না, সময় লাগেব
state মাক ও save করেত) এবং অেনক মমিরও লাগেব।
এই সম ােক দূর করার জ আেছ IDA* search. IDA* search এ তমন কােনা মমির
লােগ না, state ও মাক করেত হয় না। িবিনমেয় search করেত একটু বিশ সময় লােগ এটাই
সম া। তামরা যিদ এখেনা backtracking িনেয় একদমই না পেড় থােকা তাহেল তামরা একটু
পেড় আেসা। চাইেল নট বা আমার আেগর বইেয় দখেত পােরা।
IDA* বলার আেগ আিম তামােদর ID-DFS িনেয় বলব। এর পূণ প হেলা iterative deepening
depth first search. মেন কর আমােদর াফিট unweighted. আমােদর dfs এর বািহের একিট
depthLimit এর লুপ থাকেব। থেম এই depthLimit এর মান হেব 1. আমরা যটা করব তাহল
একটা dfs চালাব যার depth এর limit হেব depthLimit. অথাৎ dfs করার সময় আমরা এর
বিশ depth এ যেত পারব না। আরও িব ািরত বলেল বলা যায়, সাধারণত আমােদর dfs ফাংশেনর
parameter এ থােক x অথাৎ বতমান নাড। এর সােথ সােথ এখন আরও িট parameter থাকেব,
current depth এবং max depth. িতবার dfs কল করার সময় আমরা current depth এর
মান এক কের বািড়েয় দব। আর যিদ কখেনা দিখ সই মান max depth এর থেকও বড় হেয় িগ-
য়েছ তাহেল আর না এিগেয় ফরত আসব। এর ফেল লাভ িক হে ? লাভ হে য আমরা source
নাড হেত target এ shortest path এ যেত পারব। কন? কারণ থেম আমরা 1 max depth
িদেয় চ া করব, এই ে যিদ dfs আমােদর target এ পৗঁছায় তাহেল আমরা জানব 1 উ র। যিদ
তা না হয় তাহেল max depth ক বািড়েয় 2 করব এবং আবােরা dfs কল করব, এবার target এ
পৗঁছােত পারেল 2 উ র হেব। না হেল আবার বািড়েয় 3 কের dfs. এভােব চলেত থাকেব যত ণ না
আমরা target পাি । খয়াল কর এই dfs এ আমরা visited বেল িকছু রাখিছ না বা রাখার দরকার
নই। তাহেল এভােব ID-DFS এর মাধ েম আমরা source হেত target এর shortest path বর
কের ফলেত পারব। সম া িক তা তা বুঝেতই পারছ, একই state বার বার িভিজট করিছ, সময়
বিশ লাগেছ।
এখন চল আমরা আমােদর সম ায় একটু সমেয়র জ ফরত যাই। আমরা চাইেল আমােদর
সম াও ID-DFS এর মাধ েম সমাধান করেত পাির। যিদও তােত অেনক বিশ সময় লাগেব। িক
সমাধান তা হেব। হেলা আমরা আমােদর সমাধানেক কীভােব improve করেত পাির। উ র-
heuristic. এটা আবার িক? এিট এমন একিট ফাংশন যােক যিদ তুিম একিট state দাও তাহেল
এিট তামােক বলেব এই state হেত সমাধােন পৗঁছােত কমপে আরও কত move লাগেব। এই
"আরও কত move লাগেব" এই িজিনেসর যই heuristic যত ভাল approximation িদেত পারেব
সই heuristic তত ভাল। যমন আমােদর সম ার একিট heuristic বর করা যাক। আমােদর
সম ায় মােঝর 8 িট ঘেরর মােঝ ধরা যাক x িটেত 1 নই। তাহেল আমরা বলেত পাির অ ত x
move লাগেব সব িলেত 1 হেত। এরকম কের আমরা বর করেত পাির সব িল 2 এবং সব িল 3
হেত অ ত কত cost লাগেব। এই িতনিট সংখ ার মােঝ সবেচেয় কমিটই আমােদর heuristic এর
মান হেত পাের। কন? কারণ এক move িদেল মােঝর একিট মা ঘেরই তামার কাি ত সংখ া
আসেত পাের তাই না? (ব াপারটা ওত সহজ না, তাই একটু িনেজ িনেজ িচ া কের দেখা)
এখন হেলা আমরা কীভােব এই heuristic ব বহার করেত পাির। আমরা আমােদর ID-
DFS এ িফের যাই। যিদ আমােদর কােছ এরকম কােনা heuristic থােক তাহেল আমরা িকছু
optimization করেত পাির। মেন কর আমরা আিছ current depth এ আর আমােদর depth এর
সেবা িলিমট হেলা max depth. এখন আমরা আমােদর state এর heuristic মান বর করব ধরা
যাক h. যিদ দিখ current depth আর h এর যাগফল max depth ক ছািড়েয় িগেয়েছ তাহেল
তা আর এই পেথ িগেয় লাভ নই। তাই dfs আর না এিগেয় ফরত যাব। এখােন িক হেয়েছ খয়াল
কেরছ? তুিম জােনা বতমান state এ আসেত তামার কত ধাপ লেগেছ। আর তুিম heuristic
থেক বর কেরছ য আর কত ধাপ অব ই লাগেবই (heuristic সবসময় তামােক "at least"
মান দয়)। এ থেক তুিম খুব সহেজই বর করেত পােরা য এই রা া ধের গেল তামার target এ
পৗঁছােত কত ধাপ লাগেবই। এখন যিদ দেখা এই ধাপ সংখ া তামার max depth কও ছািড়েয়
৭৪
যায় তাহেল তা আর এই পেথ িগেয় লাভ নই তাই না? এটাই IDA*১ । তুিম চাইেল িকছু ণ আেগ
বলা heuristic ক কােজ লািগেয় আমােদর এই সম ািট সমাধান কের ফলেত পােরা িঠক আিম
যভােব বললাম সভােব। খুব সহজ কাড।
িকছু ণ আেগ বললাম িঠক এটাই IDA* না আরও িকছু আেছ। এই আরও িকছু িক? তুিম চাইেল
একটু িচ া করেত পােরা আমােদর সমাধােন আর কাথায় উ িত করা যায়। খুব সহজ উ িত িক ।
মেন কর আমােদর দওয়া max depth এর মােঝ সমাধান নই। তাহেল আমরা িক করিছলাম?
max depth ক এক বাড়াি লাম। িক আমরা চাইেল এক না বািড়েয় একটু বিশ বাড়ােত পাির।
আমরা তা অেনক অেনক নাড হেত current depth আর h এর যাগফল দেখ ফরত এেসিছ তাই
না? আমরা িক চাইেল এেদর মােঝ সবেচেয় ছাটিটেক আমােদর পরবতী max depth িহসােব
set করেত পাির। অথাৎ, আমরা max depth এ িলিমট থাকা অব ায় যই সব নাড হেত ফরত
এেসিছ সইসব নাড হেত আমরা target এ পৗঁছানর একটা estimate পেয়িছলাম। সই সব
estimate এর মােঝ সবেচেয় ছাটিট আমরা পেরর max depth িহসােব িনেত পাির। কারণ অ
কােনা উপােয় তা এর থেক কেম target এ যাওয়া স ব না তাই না? তাই আমরা চাখ ব
কের max depth না বািড়েয়, এরকম বুি কের max depth ক যিদ বাড়াই তাহেলই আমােদর
algorithm িট IDA* হেয় যােব। তামরা চাইেল wiki ত IDA* এর pseudocode দেখ িনেত
পােরা বুঝার িবধার জ ।
পেয়ছ, তুিম এই move এ সিট ব বহার করেব। এটা কমন জািন। এর মাণ িক? এমনও তা
হেত পাের য অ িট power ক ন ভাগ কের যা পাওয়া যায় তার সােথ পের হয়েতা x10 ক
ন ভাগ করেত হেব। হেত পাের। তাহেল িক করা যায়? একিট উপায় হল বেস বেস মাণ করা য
আসেলই এই optimization সিঠক। অথবা তুিম 1 হেত 1000 পয এই optimization সহ এবং
বােদ ই ভােবই উ র বর কের দেখা। যিদ দেখা য সব ে ই উ র একই আেস, তার মােন
ধের িনেত পােরা য তামার optimization িঠক আেছ।
১ উম... িঠক এটাই না, আরও একটু আেছ, পের বলিছ
৭৫
মেন হয় এই ই optimization / heuristic ব বহার কের IDA* বা backtrack করেল
accepted হেয় যােব।
৭৬
canonical form পেয় যাবা যা তামােক translation এর হাত হেত র া করেব। উদাহরন-
(0, 0) আর (1, 2) এই জেনর ে তুিম যিদ উপেরর কাজ কর তাহেল িক ই ে ই (0, 0)
পােব, এর মােন আমরা জনেক রাখব না, এেদর এক জনেক রাখেলই চেল। Rotation বা flip
এর জ িক করা যায়? এে ে ও নানা উপায় আেছ। একিট উপায় হেলা polymino ক rotate
কর (4 ভােব rotate করা যায়, 0 বার, 1 বার, 2 বার আর 3 বার 90 িড ী rotate করা), flip
করা ( ধু যেকােনা একিট flip িদেলই চলেব horizontal বার vertical), flip করার পর rotate
করা (আবােরা 4 ভােব rotate)- এভােব যত িল ( মাট 8 রকম) polymino পােব সব িলই তা
আমােদর সম া মেত একই তাই না? এেদর েত েকর translation সােপে canonical form
বর কর আর তােদর একিট সেট রাখ। খয়াল কর একিট polymino বা তার translation সােপে
canonical ফম িক িনেজই একিট cell এর সট। আমরা এই polymino িলর জ যিদ একিট
সট নই তাহেল এিট হেব cell এর সেটর সট।
আমরা তাহেল িক করিছ? আমরা একিট িলে র েত ক polymino িনি , িনেয় তােদর িবিভ
ভােব rotate আর flip কের তােদর translation সােপে canonical ফম বর করিছ। এর পর
সই canonical ফমেক একিট সেট পুের িদি । এই কাজ সব polymino এর জ কের ফলেল
আমরা আমােদর সেট িক সকল িভ িভ polymino পেয় যাব।
তাহেল আমােদর সমাধান ায় শষ, ধু একিট িজিনস বািক আেছ- কীভােব নতুন নতুন polymino
পাওয়া যােব। আমরা ইেতামেধ ই 1 সাইেজর সকল polymino পেয় িগেয়িছ। এখন আমরা চ া
করব i সাইেজর polymino িল হেত i + 1 সাইেজর polymino বর করার। যিদ তা স ব হয় তা-
হেল আমরা 1, 2, . . . n সাইেজর সকল polymino বর কের ফলেত পারব। i সাইেজর polymino
হেত i + 1 সাইেজর polymino বর করার উপায় হেলা i সাইেজর polymino এর িতিট square
এর চািরিদেক নতুন square (i + 1 তম, কারণ ইেতামেধ ই i িট square আেছ) বসােনার চ া
করা। তাহেল আমরা একিট একিট কের নতুন polymino পােবা i + 1 সাইেজর। চ া করার কথা
বললাম কারণ এমনও তা হেত পাের য যখােন বসােত চা সখােন আেগ থেকই একিট square
আেছ। তরাং সই ব াপাের একটু সাবধান হেত হেব। তাহেল এভােব আমরা i + 1 সাইেজর জ
একিট িল পেয় যাি । এরপর এেদর থেক আমােদর একই রকেমর polymino িল বাদ িদেত
হেব (উপের canonical ফম িনেয় অেনক বকবক কেরিছ)। এভােব আমরা এেক এেক n সাইেজর
িল পেয় যাব।
আর w × h এটা কােনা ব াপার না। একবার সব polymino পেয় গেল তুিম সব w × h এর
জ উ র বর কের রাখেত পারেব। অথাৎ তামার কাড একবার মা n সাইেজর সব polymino
বর করেব এরপর তুিম একিট n × w × h সাইেজর একিট matrix ক precompute কের রাখবা
যখােন িলখা থাকেব n সাইেজর কয়িট polymino আেছ যারা w × h সাইেজ আঁেট আর তারা
rotation, flip বা translation সােপে একই িজিনস দয় না।
৭৭
িদেক d ধাপ দওয়া মােন (x, y + d) ত যাওয়া, এভােব ডান বাম িনচ সব িকছুর জ আসেল
তুিম coordinate এর িহসাব িনকাশ করবা। এখন খয়াল কর, তামার কােছ যত িবেজাড় ধাপ বািক
আেছ সই সকল িবেজাড় ধােপর সাইজ িল যাগ কের যিদ দেখা তা abs(y) এর থেক ছাট, এর
মােন যতই চ া কর তুিম y = 0 করেত পারেব না। একই ভােব তুিম সকল জাড় ধােপর সাইজ যাগ
কের দখেব তার মান abs(x) এর থেক ছাট হয় িকনা। হেল x = 0 করেত পারেব না। এটা একটা
optimization. এছাড়াও খয়াল কর backtrack এর সময় যখন তুিম ধাপ দেব তখন জানার
েয়াজন হেব য (x, y1 ) হেত (x, y2 ) (বা একই ভােব x axis বরাবর) এর মােঝ কােনা িনিষ
িব আেছ িকনা। তুিম চাইেল
( ) িত row এবং column এর জ একিট consecutive sum এর
অ াের রেখ এই তথ O 1 এ বর কের ফলেত পােরা। এই কয়িট optimization যিদ ব বহার
কর তাহেলই আমার মেন হয় এই সম া সমাধান হেয় যােব।
৫.১ অ শীলনী
৫.১.১ সম া
Easy
UVa 140 Bandwidth Uva 211 The Domino Effect
Medium
UVa 1354 Mobile Computing UVa 1603 Square Destroyer
UVa 12107 Digit Puzzle UVa 11846 Finding Seats Again
UVa 11694 Gokigen Naname UVa 10384 The Wall Pushers
৫.১.২ িহ ট
UVa 140: মা 8 িট নাড। তাই তামরা all possible permutation বর কের চক কর-
ত পােরা। এজ backtrack করেত পােরা আবার চাইেল algorithm হডার ফাইেলর next
permutation ও ব বহার করেত পােরা।
UVa 211: তুিম একিট িনিদ order এ domino বসােব তাহেলই হেব। যমন (1, 1), (1, 2),
(1, 3), . . . (1, c), (2, 1) . . . (2, c) . . . (r, 1), . . . (r, c) এই অডাের তুিম cell িলেত যােব
এবং একিট domino বসােনার চ া করেব। তাহেল িবধা হেলা িতবার তামার হােত মা িট
option. হয় এই ঘেরর সােথ তার পােশর ঘেরর, অথবা এই ঘেরর সােথ িনেচর ঘেরর। আর যিদ
এই ঘর আেগ থেকই পূরণ হেয় থােক তাহেল তা এটা চ া করার কােনা মােন নই।
UVa 818: সম ািট বশ র, িক এর statement টা ambiguous। িক এর পরও িদলাম।
কান কান link খুলেত হেব এর উপের bruteforce করার পর একিট graph theory বা adhoc
বা greedy (কীভােব একিট সম া এেতা ক াটাগিরর হেত পাের?- আসেল এজ ই আমার এই
সম ািট ভাল লেগেছ এবং তামােদর জ এিট িদলাম) সম া সমাধান করেত হয়। এই পিরবিতত
সম ািট বশ র। আমার মেন হয় তামােদর এিট িনেজ থেকই সমাধান করা উিচত।
৭৮
UVa 690: খুব একটা কিঠন না। িক কাড একটু ঝােমলার মেন হেত পাের। Reservation table
ইনপুট নবার পর থম কাজ হেব এেক কয় ঘর shift কের বসােনা স ব তা বর করা। n ঘর shift
কের তা বসােনা স ব কারণ n ঘর সরােল তােদর মােঝ আর কােনা overlap ই থােক না। আর
কান কান shift কের বসােনা স ব সিট বর কের রাখেত হেব েতই। এরপর এর উপর িভি
কের backtrack. িক এই য বসােনা স ব িকনা বর করা, এই অংশটু আমরা কীভােব খুব
ত করেত পাির? আমরা চাইেল bitmask ব বহার করেত পাির। মেন কর আমােদর কােছ একিট
bitmask আেছ। এখন আমরা জানেত চাি reservation table ক c ঘর সিরেয় বসােল overlap
কের িকনা। এটা আসেল c ঘর shift কের bitwise and কের দখার মত।
UVa 12113: র সম া, যিদও কাড একটু কিঠন হেত পাের। থমত খয়াল কর তুিম মা
9 ভােব 2 × 2 square ক বসােত পারেব। আর বলাই আেছ য 6 বােরর বিশ বসােব না। অথাৎ
মাট 96 < 106 ভােব বসােনা স ব। তরাং তুিম চাইেল েতই সব ভােব বিসেয় বিসেয় shape
িল hash কের রাখেত পােরা। অথবা েতই hash এর ঝােমলায় না িগেয় সকল shape বর
কের একিট অ ােরেত রেখ িমিলেয় দখেত পােরা ac হয় িকনা।
UVa 817: 48 িক খুব একটা বিশ না। অথাৎ তামরা থম 8 িট character এর পর কী বসাবা
(বা হয়েতা বসাবা না) তার উপর bruteforce করেলও হেব।
UVa 11882: একিট heuristic হেত পাের তুিম কােনা জায়গায় পৗঁছানর পর দখা য আর কয়িট
জায়গায় খুব জাড় যেত পারেব (ধর bfs কের)। IDA* মেন হয় না করাই ভাল কারণ তামােক
সবেচেয় বড় সংখ া বর করেত হেব, এখােন goal িক িনিদ না। অথাৎ তুিম কােনা একটা সংখ া
দেখই বুঝেত পারবা না য এটাই উ র িকনা। তুিম সব সংখ া দখার পর বুঝেব কানটা উ র। এখন
মেন কর তুিম ইেতামেধ ই 2345 পেয় গছ। আর এখন 12 নবার পর দখছ আর িট অংেকর
বিশ পাওয়া যােব না। এর মােন আমােদর আর এিগেয় লাভ নই। এভােব pruning (pruning মােন
হেলা backtrack এর সময় আর না এিগেয় িফের যাওয়া) করেলই হেয় যাবার কথা।
UVa 1354: মা 6 িট িজিনস থাকেত পাের। তাই তুিম আসেল সকল ভােব tree বানােনার চ া
করেত পােরা। তুিম dynamic programming করার মত কের backtrack করেল িক হেব না।
অথাৎ, যিদ তুিম এরকম কর- root এ তুিম সব িজিনস িদেল, এখােন তুিম িস া িনেল ডােন ক
যােব বােম ক যােব, এরপর তুিম বােম আর ডােন recursive call করেল ঐ সব িজিনস িদেয়- না
তা হেব না। কারণ বােমর িজিনস িদেয় িবিভ ভােব tree বানােনা যায় আবার ডােনর িজিনস িল
িদেয়ও অেনক ভােব tree বানােনা যায়। তরাং তুিম বােমর কান tree এর সােথ ডােনর কান tree
ক মলােব সটা একটা কিঠন ব াপার। তেব াঁ, তুিম যিদ বাম বা ডান যেকােনা িদেকর জ যিদ
যত ভােব tree বানােনা যায় তােদর িতিটেকই (বা তােদর যই information িল তামার আসেল
লাগেব) return করেত পােরা তাহেলই সম া সমাধান হেয় যােব। কােনা নােডর জ আসেল ধু
এটু জানেলই হয় য তার subtree ত থাকা নাড িল বাম িদেক এবং ডান িদেক কতদূর পয
যায়। তাহেল িদেকর মাট ভর আর িদেকর subtree িট িদেক কতদূর যায় এই িট তথ জানা
থাকেল বতমান নােডর জ ও এই তথ তির কের return করেত পারেব।
UVa 1603: িতিট ম াচ কািঠর জ িলেখ রাখেব কত িল square এর border এ সই কািঠ
আেছ। Backtrack এ কািঠ িলেক তার উপর িদেয় যাওয়া square এর সংখ ার িভি েত বড় হেত
ছাট ত সট করেব এবং এই order এ তােদরেক remove করার চ া করেব। কন? াভািবক
ভােব িচ া কর, যই ম াচ কািঠ সরােল বিশর ভাগ square ন হেব তােক সরােনাই তা সাধারণত
লাভ জনক তাই না? আর িক optimize করা যায়? যিদ দেখা এখন যসব কািঠ বািক আেছ তােদর
িতিট িদেয় এেকর বিশ square যায় না তাহেল যকয়িট square বািক আেছ িঠক তত সংখ ক
কািঠ তামােক সড়ােত হেব। তরাং আর backtrack না কের তুিম কয়িট square বািক আেছ সই
count দখেত পােরা। তেব যেহতু n এর মান কম তাই এসব optimization নাও করা লাগেত
পাের। তাও এসব িবিভ রকম optimization জানা থাকা ভাল, কােজ লেগ যেত পাের অ কােনা
সম ায়।
৭৯
৮০
অধ ায় ৬
সমস া: একিট া ােম 5 ধরেনর instruction থাকেত পাের। "variable = constant", "print
variable", "lock", "unlock", "end". এখােন variable a হেত z এর মােঝর যেকােনা character
হেত পারেব এবং constant 0 হেত 99 এর মােঝর যেকােনা সংখ া হেত পারেব। আমােদর ইনপুেট
সেবা 10 িট া াম থাকেব এবং িতিটেত সেবা 25 িট instruction থাকেব। া াম িল এক
core ওয়ালা machine এ চলেব। তেব া াম িল একিটর পর একিট এভােব চলেব না। বরং
একিট িনিদ সমেয়র িলিমট আেছ ধরা যাক T. থম T সময় থম া াম, ি তীয় T সময় ি তীয়
া াম, এভােব চলেত থাকেব এবং সকল া াম হেত T সময় চলার পর আবার থম া ােম িফ-
র আসেব। এভােব cyclically চলেত থাকেব। িতিট instruction চলেত কত সময় কের লােগ তা
বলা আেছ। যিদ কােনা instruction চলেত চলেত T সময় পার হেয় যায় তাহেল সই instruction
শষ না হওয়া পয পেরর া ােম যােব না।
তেব একটা ব াপার আেছ। একািধক া াম একই সােথ lock করেত পারেব না। যিদ অ
কােনা া াম এখন lock না কের থােক তাহেল স lock করেত পারেব। যিদ কউ lock করেত
চায় এবং অ কউ ইেতামেধ ই lock কের থােক তাহেল স block queue ত ঢুকেব। েত
সবাই ready queue ত থােক এবং cpu এই ready queue এর র া াম T সময় েসস
করার পর ready queue এর শেষ রােখ। তেব এই lock এর ে পেরর য া াম lock
করেত চায় তােক ready queue এর শেষ না রেখ block queue এর শেষ রােখ। এভােব
চলেত থােক। যই া ামিট েত lock কেরিছল স যখন unlock করেব তখন block queue
এর র া াম ready queue এর শেষ রাখেত হেব। এভােব সকল া াম শষ না হওয়া
পয চলেত থাকেব। তামােক এই া াম িল িদেয় যা ি ট হেব তা আউটপুট িদেত হেব।
একিট িজিনস আেগ বলা হয় নাই তাহেলা, এখােন variable িল shared. অথাৎ যিদ একিট
া াম কােনা একিট ভ ািরয়ােবল এর মান পিরবতন কের তাহেল অ া ােমও তা পিরবতন হেয়
যােব। আর েত সকল ভ ািরেয়বেলর মান 0. িনেচ sample input আর output দওয়া হেলা।
এখােন থেমর সংখ ািট বলেছ কয়িট া াম, পেরর 5 িট সংখ া হেলা উপেরর 5 িট instruction এর
জ কত কের সময় লােগ (একই অডাের), আর শেষর সংখ ািট হে T এর মান। আর িতিট া-
াম end ারা পৃথক করা আেছ তােতা বুঝেতই পারছ (মেন রেখা end িক একিট instruction)।
৮১
Sample input: Output of the sample input:
3111111 1: 3
a=4 2: 3
print a 3: 17
lock 3: 9
b=9 1: 9
print b 1: 9
unlock 2: 8
print b 2: 8
end 3: 21
a=3 3: 21
print a
lock
b=8
print b
unlock
print b
end
b=5
a = 17
print a
print b
lock
b = 21
print b
unlock
print b
end
সমাধান: সহজ একিট সম া, statement ই যা কিঠন। তুিম ই ধরেনর queue রাখেব- running
queue আর blocked queue। চাইেল stl এর queue ব বহার করেত পােরা। এই ই ধরেনর
queue ত তামার া ােমর index রাখেব। েত running queue ত 1 হেত n পুশ কের
নেব যখােন n হেলা মাট া ােমর সংখ া। সই সােথ একিট global array রাখেব য কান
া ােমর কততম instruction পয ইেতামেধ ই run করা হেয়েছ। িতবার তামরা running
queue এর সামেন থেক া ােমর index নেব। এরপেরর কাজ হেলা সই া াম ক run
করােনা। তুিম সই global array থেক দখেব কান instruction তামােক run করােত হেব।
যিদ assignment বা print instruction হয় তাহেল তা সহজ। যিদ end হয় তাও সহজ, এই
া ামেক আর তুিম running queue ত ঢুকােব না। এখন মুল ঝােমলা হেলা lock আর unlock
িনেয়। যখন তুিম unlock করেব তখন সম ায় যা বেলেছ তা করেব, অথাৎ blocked queue এর
র া ামেক running queue এর শেষ ঢুকােব। আর যখন lock এ আসেব, তখন দখেব
আেগ থেক যিদ কউ lock থােক তাহেল এই lock execute না কের এেক blocked queue ত
ঢুিকেয় চেল যােব। এেক িক আর running queue ত ঢুকােব না। আর যিদ দেখা কউ lock
নই তাহেল তা সহজ, এেকই execute করেত থাকেব। যেহতু তামােক জানেত হেব আর কউ
lock আেছ িকনা, এ জ একিট বাড়িত flag রাখেত হেব। আর unlock এ এই flag ক clear
করেত ভুেল যও না।
আর সমেয়র ব াপারটােতা সহজ। তুিম িতিট instruction run করবা আর T হেত সই সময়
বাদ িদেব। যিদ নতুন কােনা instruction run করেত িগেয় দেখা T এর মান 0 বা negative হেয়
গেছ এবং আরও instruction বািক আেছ তাহেল এই া ামেক running queue এর পছেন
ঢুকােয় চেল গেলই হেব।
৮২
মাট কথা এই সম া বশ সহজ। তামােক ধয ধের কাডিট করেত হেব, তাহেলই হেব।
৮৩
( আেছ িকনা। থাকেল তা তুেল ফলেব, আর না থাকেল বুঝেব য sequence িট balanced না।
একটু িচ া করেল বুঝেব এখােন stack এর েয়াজন নই, ধু একিট counter রাখেলই হয়। অথাৎ
stack এ কয়িট িজিনস আেছ তা জানেলই হয়, িক িক আেছ তা না জানেলও চেল, কারণ তুিম stack
এ সবসময় ( েবশ করাও।
যাই হাক, stack এর মাধ েম balanced bracket sequence সম া কীভােব সমাধান করা
হয় এটার সােপে যিদ আমােদর সম া িচ া কর তাহেল আশা কির সমাধান পেয় যােব। এটা
পির ার য আমােদরেক stack ব বহার করেত হেব। িক stack এ িক রাখবা, কখন ঢুকাবা, কখন
বর করবা ইত ািদ হেলা িচ া করার িজিনস। তামরা চাইেল িনেজরা একটু িচ া কের দখেত পােরা
িনেচর সমাধান পড়ার আেগ।
একিট সমাধান হেত পাের, তামরা বাম হেত ডােন আসেব। যিদ ( পাও তাহেল তা ignore কর।
যিদ একিট matrix পাও তাহেল তার dimension ক stack এ েবশ করাও। আর যিদ ) পাও
তাহেল stack হেত উপেরর িট matrix এর dimension তুল। ধরা যাক এরা হেলা (a, b) [ধরলাম
এিট উপের িছল] আর (c, d). তাহেল আমােদর দখেত হেব d = a িকনা। নাহেল আমােদর matrix
িট ন করা স ব না। আর যিদ তারা সমান হয় তাহেল এেদর ন করেত cost হেব c × a × b আর
নতুন matrix এর dimension হেব (c, b). এই matrix ক আমরা আবার stack এ পুশ করব।
এভােব সব ন হেয় গেল সকল cost এর যাগফলই হেব আমােদর উ র।
সমস া: একিট লাক একিট string কীভােব type কেরেছ তা দওয়া আেছ। String িটেত িকছু
letter এবং underscore আেছ। এর সােথ আেছ [ আর ]. [ এর মােন হল ঐ মুহূেত লাকিট home
িটেপেছ। এর ফেল তার typing এর cursor লাইেনর েত এেস িগেয়িছল। আর ] এর মােন হল
end. এর ফেল তার cursor লাইেনর শেষ এেস িগেয়িছল। তামােক বলেত হেব দ string
এর মত কের টাইপ করেল আসেল string িট দখেত কমন হেব। যমন ইনপুট abc[de]f হেল
আউটপুট হেব deabcf.
সমাধান: খুব একটা কিঠন না। তুিম যিদ একটু িচ া কর তাহেল stack িদেয় সমাধান দাঁড় করােত
পারেব (যিদও খুব সহজ হেব না সই সমাধান)। তেব সমাধানটা খুব সহজ হেব যিদ তুিম stl এর
list ব বহার কর। খয়াল কর তামার আসেল কােনা এক মুহূেত িক িক করেত হেত পাের। হয়
তুিম string এর একদম শেষ েবশ করােব, অথবা একদম েত অথবা এর আেগ যখােন েবশ
( )
কিরেয়িছেল িঠক তার পের। এই কাজ িল list িদেয় O 1 সমেয় করেত পারেব। খয়াল কর vector
এর ে েত বা মােঝ insert করার cost িক constant না। িক list এর ে তুিম যিদ
মেন রােখা এর আেগ কই িছেল তাহেল এই িতনিট অপােরশন constant সমেয় করেত পারেব।
List এর insert ফাংশন আেছ, তােক তুিম যিদ iterator দাও আর একিট মান দাও তাহেল
তা ঐ iterator এর আেগ সই মানেক insert করেব। মেন কর আমরা list<char>::iterator it
নােম একিট variable এ iterator রাখব যা িনেদশ করেব তুিম কাথায় পেরর character ক
insert করেব, অথাৎ ঐ iterator যখােন িনেদশ কের তার িঠক আেগর জায়গায় নতুন character
েবশ করেব। েত it এর মান হেব L.end() এর সমান, যখােন L হল আমােদর িল । আমরা
যসকল character েবশ করাব সব িল এর শেষ েবশ হেব। এখন যিদ home িটেপ তাহেল
এই iterator এর মান পিরবতন হেয় হেয় যােব L.begin(), এবং এর পের যত character তুিম
েবশ করােব সব "বতমান" িল এর র আেগ েবশ হেব। খয়াল কর, যিদও আমােদর নতুন
character িল এর েত েবশ করােব এবং এর ফেল L.begin() এর মান পিরবতন হেব, িক
it এর মান িক পিরবতন হেব না। এিট িক আেগর র মাথােক পেয় ট করেব এবং তুিম যত নতুন
character েবশ করােব সব িঠক জায়গায় েবশ হেব। একই ভােব তুিম যিদ end পাও তাহেল it
এর মান L.end() কের দাও। এরকম কের করেলই এই সম া সমাধান হেয় যােব।
৮৪
UVa 12657 Boxes in a Line
সমস া: একিট ােন n িট বা আেছ, বােম হেত ডােন 1, 2 . . . n এভােব। n এর মান সেবা
100,000 হেত পাের। এখন তামােক চার ধরেনর অপােরশন দওয়া হেব। এক- X ও Y ক swap
কর, ই- X ক Y এর বােম রােখা, িতন- X ক Y এর ডােন রােখা, চার- পুেরা বাে র sequence
উলিটেয় ফেলা। এরকম সেবা 100,000 িট অপােরশন দওয়া থাকেব। তামােক সকল অপােরশন
শেষ িবেজাড়তম বা িলর (বাম হেত থম, তৃতীয় এরকম) id এর যাগফল ি ট করেত হেব।
সমাধান: বাঝাই যাে এখােন তামােক doubly linked list কাড করেত হেব। যা যা অপােরশন
করেত বলা হেয়েছ সসেবর জ িলংক িলে র িলংক িল কীভােব ভাঙেত হেব বা গড়েত হেব সটা
িচ া করেলই হেব। আর অপােরশেনর সময় X কাথায় আেছ তা জানার জ একিট িলংক এর অ াের
রাখেত পাির যা িতিট বা কাথায় আেছ তা বলেব। খুব একটা কিঠন হেব না, তুিম হােত হােত
িলংক িলে র কাড করার চ া করেত পােরা। চাইেল stl এর list ব বহার করেত পােরা তেব সিট
আরও ঝােমলাদায়ক হেত পাের এই সম ার ে ।
৮৫
হেত ডােন ি ট করেত হেব। তেব tree িটর input একটু অ ভােব দওয়া। মেন কর 4 হেলা root
তার বােম 2 আর 2 এর ডােন 9. তাহেল input এ 9 এর জ বলা থাকেব LR. অথাৎ root হেত
কােনা নােড Left-Right ভােব কীভােব যাওয়া লােগ সটা দয়া। এরকম কের িতিট নােডর
জ ইনপুট দওয়া আেছ, তামােক level অ সাের বাম হেত ডােন নাড িল ি ট করেত হেব।
যিদ ইনপুট িল পূণ tree িনেদশ না কের ( যমন L বেল িকছু নই িক LL আেছ) তাহেল not
complete কথািট ি ট করেত হেব।
সমাধান: এই সম া সমাধােনর জ তামােদর ইনপুট নবার পর parsing করেত হেব। যা আমরা
ইেতামেধ ই আেলাচনা কের এেসিছ অ চ া াের। তরাং আমরা এখােন parsing িনেয় আর
আেলাচনা করব না।
তামরা চাইেলই LR এর ি ং িল দেখ দেখ একিট tree বািনেয় ফলেত পােরা। থেম িতিট
string দেখ tree ত সই নাড বানাও, এসময় এমন হেত পাের য িকছু নাড আেগ থেকই বানােনা
আেছ। তামােক মূলত নতুন নাড িল বানােত হেব। নাড বানােনার সময়, শষ নােড তুিম তার নাম
িলেখ রাখেব। যিদ tree বানােনা শেষ দেখা িতিট নােডর নাম আেছ তাহেল tree িট িঠক আেছ।
নাহেল ইনপুট invalid. এখন তামরা root হেত একিট bfs করেলই level অ সাের আউটপুট পেয়
যােব। কারণ bfs এ সবেচেয় কম দূরে র নাড আেগ visit হয়। তেব যেহতু আমরা বাম হেত ডােন
ি ট করেত চাই সজ কােনা নােডর child দর queue ত ঢুকােনার সময় তার left child ক
right child এর আেগ ঢুকােত হেব। তাহেলই হেয় যােব।
িক এই সম া আরও সহেজ সমাধান করা যায়। খয়াল কর উপেরর লেভেল থাকা মােন
string এর দঘ কম। তরাং আমরা যেহতু লেভল অ সাের print করেত চাই সেহতু আমােদর
নাড িলেক তােদর string এর length অ সাের sort করেত হেব। যিদ length একই হয় তখন
তােদরেক lexicographically sort করেলই হেব। কারণ L তা R এর থেক ছাট। আর আমরা
চাই বােমর নাডেক আেগ ি ট করেত হেব। আর ইনপুট valid িকনা সটা চক করাও খুব একটা
কিঠন না। মেন কর সকল LR string এর সট হল S. তাহেল িতিট ইনপুট ি েঙর জ দখেত
হেব য তার শষ character বাদ িদেল যই ি ং হয় সিট S এ আেছ িকনা। এর মােন দাঁড়ােব
িতিট নােডর parent দওয়া আেছ।
৮৬
pre এর ে এর মােন হেলা থেম তুিম root নাড িলখেব এর পর left subtree এর preorder
traversal িলখেব, এর পর right subtree এর। একই ভােব, post এর ে সবেশেষ root
িলখেব, েত বােমর, এর পর ডােনর। inorder এ মােঝ থাকেব root, েত বােমর আর শেষ
ডােনর। অথাৎ বাম ডােনর order fixed. কথা হল root কাথায় বসেব। সটা in, pre, post দেখ
বুঝা যােব।
আমােদর এই সম ায় inorder আর post order traversal দওয়া আেছ। এখান থেক িক
িক তথ পাওয়া যায়? থমত Postorder traversal এর শেষর নাডিট হেব root. এখন inorder
traversal এ root এর অব ান বর করেল, এর বােমর অংশটু হেব left subtree আর ডােনর
অংশ right subtree. একিট inverse অ াের (অথাৎ কােনা একিট( নাড ) inorder traversal
এ কাথায় আেছ) রাখেল inorder traversal এ root এর অব ান O 1 এ বর করা যােব। ধরা
যাক left subtree ত আেছ L িট আর right subtree ত আেছ R িট নাড। তাহেল post order
traversal এর থম L িট নাড হেব left subtree এর post order traversal, আর তার পেরর R
িট নাড হেব right subtree এর post order( traversal.
) এর মােন তামােক যিদ inorder আর
post order traversal দওয়া থােক তুিম O 1 এ left subtree এর আর right subtree এর
inorder এবং post order traversal বর করেত পারেব। তার মােন আমরা আবার মুল সম ায়
িফের িগেয়িছ- আমােদর ছাট একিট ি এর inorder ও post order traversal দওয়া আেছ, ি িট
বর করেত হেব। এই ভােব তুিম পুেরা tree বািনেয় ফলেত পারেব।
মজার িজিনস হেলা তুিম আসেল পুেরা tree না বািনেয় tree বানােনার পের dfs এর মাধ েম
যই কাজ করেত সটা এবং এইেয িকছু ণ আেগ inorder এবং post order িনেয় কাজ করার য
ব াপারিট বললাম সটা এক কের খুব ছাট কাড কের পুেরা সম া সমাধান কের ফলেত পারেব।
৮৭
tree এর। যিদ একটু ভাল কের িচ া কর তাহেল বুঝেব s আর t এর মােঝর যেকােনা optimal
path হেব এই minimum spanning tree এর ভতর িদেয় path. কন? এর মাণ খুব একটা
কিঠন না। মেন কর আমরা s হেত t ত এমন একিট optimal path পাই যার cost হেব MST এর
ভতর িদেয় পােথর থেকও কম cost এর। এর মােন optimal path এর জ সবেচেয় বিশ cost
এর যই edge পাওয়া তার cost হেব MST এর ভতর িদেয় path এর উপর থাকা সবেচেয় বড়
cost এর edge এর থেক কম cost এর। এখন তুিম যিদ একটু িচ া কর তাহেল দখেব MST
এর ভতেরর পােথ সবেচেয় বড় cost এর যই edge িছল তােক বািহেরর পােথর কােনা একিট
edge িদেয় replace কের MST এর cost আরও কমােনা যােব। িক MST এর cost তা কখনও
কমােনা স ব না তাই না? তরাং এরকম হেব না, অথাৎ s হেত t এর পাথ সবসময় MST এর
ভতর িদেয় হেব।
তরাং আমরা দ ােফর MST বর কের ফলব। এর পর িত query ত s আর t এর মােঝ
এই MST এর ভতর িদেয় path বর করব আর এই path এর সবেচেয় বিশ cost এর edge
বর করব। তাহেলই হেয় যােব।
( ) যেহতু একিট tree ত V − 1 িট edge থােক তাই আমােদর িত
query ত সময় লাগেব O V .
িক এই complexity ও যেথ না। এই ে বুি হেলা LCA (Least Common Ancestor).
যখনই একিট tree ত িট নােডর মােঝ িকছু একটা করেত বলেব তখন LCA ায় সময়ই কােজ
লােগ। s হেত root এ যাও আর t হেত root এ যাও। এই ই পােথ তা অেনক িল নাড থাকেত
পাের। আবার এই ই পােথই আেছ এরকম ব নাডও থাকেত পাের। এই উভয় পেথই থাকা নাড-
িলর মােঝ যিট root হেত সবেচেয় দূের থােক সিটই s ও t এর LCA. LCA কীভােব বর করেত
হেব তা না জানেল পেড় নাও। মূল আইিডয়া হেলা ি এর িতিট নােডর 20 , 21 , 22 , 23 . . . 2log V
তম parent িল বর কের রাখেত হয়। এখন আমরা যিদ ধু ওত তম parent না বরং ওত তম
parent এ যেত যই path তার মােঝর সবেচেয় বড় edge এর cost ও িলেখ রািখ তাহেল িক
আমরা s হেত c এবং t হেত c path এর সবেচেয় বড় cost এর edge ও বর কের ফলেত পারব,
যখােন c হল LCA. তাহেলই আমােদর সমাধান lca বর করার মত log V ত হেয় যােব।
সমাধান: তুিম যিদ LOJ 1101 কের থােকা তাহেল মেন হয় না এটা খুব একটা কিঠন লাগেব।
থম কথা, তুিম যিদ এেক tree না মেন কের একিট লাইন ক না কর তাহেল তা এটা binary
search ছাড়া আর িকছুই না। তাহেল িক আমরা tree এর িতিট নােডর জ তার সকল ancestor
দর িনেয় একিট িল বািনেয় রাখেবা আর query আসেল সই list এ binary search করব?
না তা হেব না। কারণ একিট লাইন ােফর কথাই িচ া কর (লাইন াফ মােন সই ােফ কােনা
branching নই)। এই ােফ i তম নােডর list এ i িট ancestor ক রাখেত হেব। তরাং তামার
V 2 জায়গা লেগ যােব। তাহেল িক উপায়? উপায় হেলা LCA এর মত কের িতিট নােডর জ
20 , 21 , 22 , 23 . . . তম ancestor রাখা। এরপর তুিম v থেক করেব। দখেব v এর 2k তম
ancestor এর weight w থেক ছাট িকনা, ছাট হেল 2 k−1
তম ancestor এর সােথ একই রকম
চক করেব। আর যিদ বড় বা সমান হয় তাহেল v ক সই 2k তম parent বানােব এবং একই ভােব
তার এবার 2k−1 তম parent চক করেব। খয়াল কর িত চক( শেষ িক) আমােদর k এর মান
এক কের কমেছ। তরাং আমরা k = log V থেক করেল O log V এর বিশ সময় লাগেব
না। আর log V এর বিশ k িনেয় করার দরকার নই তাই না (না বুঝেল LCA পেড় দেখা)?
৮৮
LOJ 1080 Binary Simulation
সমস া: একিট 100,000 সাইেজর 0-1 এর অ াের আেছ। ই ধরেনর অপােরশন থাকেত পাের।
এক- i হেত j পয সকল element ক flip কর অথাৎ 0 থাকেল 1, আর 1 থাকেল 0. ই- i তম
না ার কত তা ি ট করেত হেব। মাট operation এর সংখ া 50,000.
৮৯
LOJ 1087 Diablo
সমস া: তামােক n িট সংখ া দওয়া আেছ (সেবা 100,000 িট)। সই সােথ সেবা 50,000 িট
(q) অপােরশন। ই ধরেনর অপােরশন হেত পাের। এক- আমােদর sequence এর শেষ একিট
নতুন সংখ া েবশ করােত হেব। ই- থম থেক k তম সংখ া কত? এই ে র উ র দবার পর
সই সংখ ােক ফেল দাও।
সমাধান: অব ই binary search tree িদেয় সমাধান করার চ া করব না। সটা হেব মশা মারেত
কামান দাগার মত। সহেজ কীভােব সমাধান করা যায়? একিট উপায় হেলা segment tree ব বহার
করা। একিট n+q সাইেজর অ াের িনেয় তার segment tree বািনেয় ফেলা। এই সময় থম n িট
ােন 1 আর শেষর q িট ােন 0 রােখা। যখনই k তম সংখ া চাইেব তুিম segment tree হেত k
তম 1 কাথায় তা বর কর। এজ একিট উপায় হেত পাের পিজশেনর উপর binary search করা
য "আিম এখন guess করিছ i তম ােন k তম 1 আেছ"। এবার query কের দখ য আসেলই
তা সিত িকনা। অথাৎ তামােক দখেত হেব 1 হেত i পয 1 এর যাগফল কত আর i এ 1 আেছ
িকনা। তুিম যিদ দখ য এই যাগফল k এর থেক বিশ বা i এ 1 নই তার মােন তুিম বুেঝ যােব য
k তম 1 আেছ i এর বােম। এরকম কের binary search করেত থাকেল তুিম k তম 1 পেয় যােব।
( 2 )
িক এর জ িত query এর complexity হেব O log n .
( )
এই কাজ তুিম খুব সহেজই O log n এ করেত পারবা। তুিম tree এর কােনা নােড এেস
দখেব এর left tree ত কত িল 1 আেছ আর right tree ত কত িল। এর উপর িভি কের তুিম
বুেঝ যােব কান িদেক k তম 1 আেছ। এভােব k তম 1 কান index এ আেছ তা বর কের ফলেত
পারেব। এটােতা গল থম অপােরশন। অপর অপােরশেনর (নতুন সংখ া েবশ করােনা) সময় তুিম
n এর পেরর ঘর ক 0 হেত 1 করেব, আবার ি তীয় বার যখন নতুন সংখ া েবশ করেত বলেব তখন
তার পেরর 0 ক 1 করেব এরকম কের চলেত থাকেব। অথাৎ আমােদর segment tree ত কােনা
একিট ােন 1 যাগ করেত হেব। আর কান id ত কান সংখ া আেছ তা তা আমরা একটা আলাদা
অ ােরেত িলেখ রাখেতই পাির। তুিম যখন segment tree হেত জেন যােব কান index এ k তম
সংখ া আেছ তখন সই id ত রাখা সংখ া দেখ িনেলই হেলা।
সমাধান: খুব একটা কিঠন সম া না। নানা ভােব এই সম ার সমাধান করা যায়।
একিট উপায় হেলা segment tree ব বহার করা। মেন কর দ িতিট [i, j] সগেমে টর
জ segment tree ত সই রে র পুেরাটু েত 1 যাগ করেব। এর পর িত query ত দখেত
হেব query এর ােন কত আেছ। িক এই সমাধােন সম া হেলা আমােদর সংখ া িল 108 পয
হেত পাের। তরাং আমােদর 108 সাইেজর অ ােরর segment tree করা লাগেব। যটা একটু বিশ
memory খেয় ফলেব। এখােন একটা িজিনস ল করার আেছ, সটা হেলা রে র ই মাথা বা
query এর না ার িল কত সটা কােনা ব াপার না, তােদর relative order ই ব াপার। অথাৎ
তামােক যিদ একিট র [1, 10] দয় আর query যিদ হয় 5 তাহেল এর সমাধান করা যা কথা,
র [1, 3] িনেয় 2 সংখ া িনেয় তার সমাধান করা একই কথা। তরাং আমরা সকল সংখ া িনেয়
( )
sort কের তােদরেক O n রে র না াের assign কের িদেত পাির অথাৎ sort করার পর (এবং
duplicate১ মুেছ ফলার পর) থম সংখ া 1, এরপেররটা 2, তার পেররটা 3 এরকম। এখােন সব
সংখ া মােন হল query এর সংখ া আর range এর ই াে র সংখ া। তামরা চাইেল একটু িচ া
১ Duplicate মুেছ ফলার একিট সহজ উপায় হল sort(A.begin(), A.end()) আর এর পর
A.erase(unique(A.begin(), A.end()), A.end()).
৯০
করেত পােরা এখােন segment tree ব বহার না কের LOJ 1080 এর মত কের BIT ব বহার কের
সমাধান করা যায় িকনা।
চাইেল segment tree বা BIT ছাড়াই এই সম া সমাধান করা যায়। একিট িব িনেয় িচ া
কের দেখা, যিদ তুিম কােনা ভােব এর বােম কয়িট রে র র মাথা আেছ, এর ডােন কয়িট আেছ,
বােম রে র শেষর মাথা কয়িট আেছ আর ডােনই বা কয়িট আেছ এই চারিট সংখ া জােনা তাহেল
িক তুিম বেল ফলেত পারেব এই িব িট কােনা রে র ভতের আেছ িকনা বা থাকেল কয়িট রে র
ভতের আেছ। আসেল চারিট সংখ ার দরকার নই, িট হেলই চেল। এই িব র আেগ বা ঐ িব র
ােন কত িল রে র র মাথা আেছ (A) আর ঐ িব র আেগ কয়িট রে র শষ মাথা আেছ (B).
তাহেল A − B হেব এই িব কত িল রে র ভতের আেছ তা। এটা খুব একটা কিঠন না। তুিম
র মাথা িনেয় একটা sorted array রােখা আর তােত িতিট িব র জ binary search কর
তাহেলই হেয় যােব। একই ভােব তুিম শেষর মাথা sorted array ত িনেয় binary search কের
B বর করেত পােরা। তাহেলই িতিট িব র জ সমাধান বর হেয় যােব।
চাইেল line sweep এর মত কেরও সমাধান করেত পােরা। মেন কর িতিট query এর িব ,
রে র র মাথা শেষর মাথা এসবেক এেককিট event িহসােব িনেল। এর পর সব event ক
sort কের ফেলা আর বাম িদক থেক line sweep কর। যিদ একিট রে র র মাথা পাও তাহেল
একিট counter ক বাড়াও। যিদ রে র শেষর মাথা পাও তাহেল সই counter ক কমাও। আর
যিদ কােনা query এর িব পাও তাহেল তার জ উ র হেব বতমান counter এর মান। সহজ না?
তেব যিদ একই িব েত যিদ query িব আর range এর বা শেষর মাথা থােক তাহেল একটু
সম া। কারণ র মাথা যিদ আেগ েসস কর তাহেল counter বাড়ােত হেব। আবার query িব
েসস করেল counter এর মান দখেত হেব। তরাং একই িব েত ইেভ ট িল িক অডাের েসস
করছ তা অেনক পূণ। তুিম িনেজ একটু িচ া কের দখেত পার িক অডাের েসস করা উিচত।
উ র হল- থেম র মাথা, এরপর query িব িল এবং সবেশেষ শেষর মাথা। এটা করা খুবই
সহজ, সট এর comparison function এ ক আেগ আসেব ক পের আসেব সখােন এসব লিজক
িলেখ িদেলই হেব। আরও সহজ হেব তুিম যিদ র মাথােক -1 িদেয়, query িব েক 0 িদেয় এবং
শেষর মাথােক 1 িদেয় কাশ কর, আর এই মােনর িভি েত যিদ তুিম সট কর (যখন িব র মান
একই হয় তখন)।
সমাধান: আমরা যিদ সকল d দেঘ র subarray এর জ minimum এবং maximum বর করেত
পাির তাহেল আমােদর সম া খুব সহেজই সমাধান হেয় যােব। তুিম চাইেল এজ segment tree
ব বহার করেত পােরা। বা চাইেল "static ডটায় rmq" এর টকিনক খাটােত পােরা। অথবা চাইেল
prioirty queue ব বহার করেত পােরা। আমরা এখােন priority queue এর সমাধান বলব। আমরা
যিদ যেকােনা d দেঘ র subarray এর maximum বর করেত পাির তাহেল minimum ও বর
কের ফলেত পারব। তাহেল কীভােব maximum বর করব? আমরা বাম হেত ডান িদেক যাব এবং
এেক এেক সংখ া এবং তার index ক একিট structure এর ভতর ভের priority queue ত
পুশ করব। সই সােথ িতিট index এ এেস দখেবা সই মুহূেত priority queue এর top এ ক
আেছ। যিদ তার index আমােদর বতমান ােনর থেক d এর বিশ দূরে থােক তাহেল তােক ধের
ফেল দব (pop)। এরকম কের ধের ফেল িদেত থাকব যত ণ priority queue এর top এর
index বতমান ান থেক d এর বিশ দূরে থাকেব। যখন d এর বিশ দূের নয় এরকম index
পাব তখন সিটই হেব আমােদর maximum (এখান থেক বােমর িদেক d দূর পয )। এভােব
৯১
আমরা িতিট ােন িগেয় এর আেগর d ঘেরর মােঝ সবেচেয় বড় এবং সবেচেয় ছাট সংখ া বর
কের ফলেত পারব। তাহেলই তা আমােদর সম া সমাধান হেয় যায় তাই না?
৯২
এই হয় তাহেল আর উ র 1 পােব না। আবার িট 10 এই 1 থাকেল থম index হেত তৃতীয় index
এ query করেল িট 10 ই count হেয় যােব। তরাং কােনা একিট মুহূেত আমােদর একিট 10
এই 1 থাকেব, বািক িলেত 0. ধু তাই না এই 1 ওয়ালা 10 হেব সবেচেয় ডােনরটা (আবার এেতা
ডােন যন না হয় য সটা আবার x ক অিত ম কের)। তরাং আমরা segment tree বা BIT
ব বহার কের এই সম া সমাধান কের ফলেত পারব। ( 2 )
যিদ এই সম ােত query সমূহ online হত তাহেল এই সম া িত query O log n
time complexity ত সমাধান করা যত। এজ অব তামােদর merge sort tree ধরেনর
িকছু ব বহার করেত হত। তেব মূল আইিডয়া আমার বিণত সমাধােনই বলা আেছ। তামােদর আ হ
থাকেল এই সম ােক online মেন কের াি স করেত পার। আশা কির পের কােনা সময় আমরা
merge sort tree িনেয় আেলাচনা করব।
৯৩
ফলেত পারব কারণ এই sequence এ 2V িট element
( থাকেব।
) আর এই দেঘ র একিট অ ােরর
segment tree এর update এবং query করেত O log V সময় লাগেব।
b c
B C
d e f g
D E F G
h i j k l m
H I J K L M
৬.১ অ শীলনী
৬.১.১ সম া
Simple
UVa 839 Not so Mobile UVa 699 The Falling Leaves
UVa 673 Parantheses Balance LOJ 1212 Double Ended Queue
Easy
UVa 297 Quadtrees UVa 712 S-Trees
UVa 536 Tree Recovery UVa 127 "Accordian" Patience
UVa 246 10-20-30 UVa 1322 Minimizing Maximizer
Medium
UVa 10562 Undraw the Trees UVa 12166 Equilibrium Mobile
UVa 806 Spatial Structures UVa 10410 Tree Reconstruction
UVa 1662 Brackets Removal LOJ 1081 Square Queries
LOJ 1343 Aladdin and the Black Stones LOJ 1204 Weird Advertisement
৯৪
৬.১.২ িহ ট
৯৫
গেছ এর মােন L হেত R এর ভতের িভ সংখ া একিট কেম গেছ। তরাং আমরা িভ সংখ ার
count ও এক কিমেয় দব। এবার মেন কর িভ সংখ ার count এখেনা n হয়িন। সে ে আমরা
R এর মান এক বাড়াব অথাৎ আমােদর L হেত R এর মােঝ একিট সংখ া বাড়েব। আমরা অ ােরেত
সই সংখ ার count এক বাড়াব। যিদ দিখ count বাড়ােনার আেগ সই count িট 0 িছল, এর
মােন িভ সংখ া একিট বাড়েছ। তরাং আমরা িভ সংখ ার count ও এক বািড়েয় দব। এভােব
যত candidate র পাওয়া যােব তােদর মােঝর best range ই আমােদর উ র হেব।
UVa 12166: িতিট bar ক horizontal থাকেত হেব। এখন তুিম যিদ সবেচেয় িনেচর bar ক
ক না কর তাহেল বুঝেব এই bar এর ই মাথার ভর সমান হেত হেব (ধরা যাক এর এক মাথায়
w ভর আেছ)। এই bar আবার যই bar থেক ঝুেল সই bar এ 2w ভর েয়াগ করেব। এর মােন
এর অ মাথােতও 2w ভর থাকেত হেব। আরও যিদ িচ া কর তাহেল বুঝেব d depth এ যিদ w
ভর থােক সিট root এ w2d ভর contribute কের। তাহেল আমােদর সমাধান িক? একটু যিদ
িচ া কর তাহেল বুঝেব য সকল ভেরর জ w2d বর করার পর যই সংখ ািট সবেচেয় বিশ বার
আসেব সই সংখ া িলর ভর িল থাকেব, বািক িল তামােক পিরবতন করেত হেব।
( )
LOJ 1081: এই সম া linear preprocessing এবং O 1 এ কীভােব সমাধান করেত হেব তা
া ািমং কে ট বইেয়র Adhoc টকিনক চ া াের বলা আেছ।
LOJ 1120: থমত আমােদর coordinate compress করেত হেব (না করেলও চলেব)। এরপর
আমরা বাম হেত ডােন line sweep করব। এজ আমােদর এমন একিট segment tree লাগেব
যখােন ই ধরেনর অপােরশন support করেব। এক- i হেত j পয এক কের বাড়াও। ই- পুেরা
অ ােরেত কত িল 0 আেছ। এরকম একিট segment tree যিদ বানােত পােরা তাহেল বািক টু
সমাধান হেয় যােব। তামােক rectangle িলেক বােমর মাথা আর ডােনর মাথা অ সাের sort
করেত হেব (এ িল এেককিট event)। ধরা যাক একিট rectangle হেলা (x1 , y1 ) − (x2 , y2 )
যখােন x1 ≤ x2 , y1 ≤ y2 . যিদ র মাথা পাও (x = x1 ) তাহেল rectangle এর উপর আর
িনেচর মাথার মােঝ তুিম 1 যাগ করেব (segment tree িট হেব y axis বরাবর) অথাৎ segment
tree ত [y1 , y2 ] রে 1 যাগ করেব। আর শষ মাথা পেল (x = x2 ) ঐ একই রে এক িবেয়াগ
করেব। আর িতবার দখেব segment tree ত কত িল 0 আেছ তােক যিদ তুিম x axis বরাবর
jump এর পিরমাণ িদেয় ন কর তাহেল এই jump এর মােঝ কত খািন অংশ ফাঁকা আেছ তা বর
হেয় যােব। এখােন Jump বলেত বুঝাি য x অে র এক event হেত পেরর event এর মােঝর
jump.
LOJ 1204: যিদ খয়াল কের থােকা য K মা 10 হেত পাের তাহেল আমার মেন হয় সহেজই
সমাধান হেয় যােব এ সম া। যিদ তাও সমাধান না পেয় থােকা তাহেল িচ া কর, K = 1 হেল
িক করেব, K = 2 হেল িক করেব এরকম। তমন িকছুই না, আমােদর segment tree ত K
সাইেজর একিট অ াের রাখেত হেব যটা বলেব i বার cover হেয়েছ এরকম কয়িট িব আেছ
[y1 , y2 ] রে । সই সােথ যেহতু আমােদর segment ধের update করেত হেব সেহতু আমােদর
lazy ব বহার করেত হেব। তেব lazy propagate করা যােব না। কন? তা তামরা K সাইেজর
অ াের update করার সময় বুঝেব! একই সােথ যেহতু coordinate অেনক বড় হেত পাের সেহতু
আমােদর coordinate compress করেত হেব। আর line sweep য করেত হেব তা আশা কির
ইেতামেধ ই বুেঝ গছ! যিদও সম াটা কিঠন না, িক একই সােথ অেনক িল টকিনক দরকার
এই সমাধােন তাই এিট একটু কিঠন।
৯৬
অধ ায় ৭
Greedy
৯৭
হেব, আর triminoes ক বােডর বািহের থাকা যােব না। তামােক বাডিট trimino ারা কাভার
কের ি ট করেত হেব তেব কােনা একিট ঘর যন আবার একািধক trimino ারা কাভার না থােক।
ি ট করেতও একটু কায়দা করেত হেব। িতিট trimino ক a, b, c বা d িদেয় মাক করেত হেব।
অথাৎ পাশাপািশ একই অ েরর িতনিট ঘর থাকেল আমরা বুঝব য তারা একিট trimino. আর
খয়াল রাখেত হেব য পাশাপািশ িট trimino এর অ র যন একই না হয়। যিদ এই শত িল মেন
trimino বসান স ব না হয় তাহেল বল য সমাধান স ব না।
৯৮
Codeforces 45 D: Event Dates (45D)
সমস া: N িট ভ ািরেয়বল আেছ। িতিট ভ ািরেয়বেলর জ একিট কের র আেছ, ধরা যাক i
তম ভ ািরেয়বেলর জ এই র হে [li , ri ]. তামােক িতিট ভ ািরেয়বেলর জ একিট মান
িনবাচন করেত হেব যন একািধক ভ ািরেয়বেলর মান একই না হয় এবং িতিট ভ ািরেয়বেলর মান
তার রে র মােঝ হয়। এখােন N ≤ 100 এবং 1 ≤ li ≤ ri ≤ 107 . আর এটা বলা আেছ য
দ সকল test case এর জ সমাধান আেছ।
সমাধান: Greedy এর খুব কমন একিট সম া। আিম এখােন এমন একিট সমাধান বলব যটা N
এর বড় মােনর জ ও কাজ করেব। থেম একিট তুলনামুলক খারাপ সমাধান বিল এরপর তােক
উ িত করব।
থেম সকল ভ ািরেয়বল unassigned. এরপর আমরা i এর একিট লুপ চালাব যিট 1 হেত
107 এ যােব। িতিট i এ িগেয় দখব য এখান থেক কােনা ভ ািরেয়বেলর র হয় িকনা। হেল
আমরা সই ভ ািরেয়বলেক active িহেসেব মাক করব। এরপর এখন যসকল ভ ািরেয়বল active,
তােদর মােঝ যিটর r এর মান সবেচেয় ছাট, তার মান i assign করব এবং এই ভ ািরেয়বলেক
আর active রাখব না। এভােব সব ভ ািরেয়বেলর মান assign করেলই হেব। িক কােনা এক
সমেয় এেস যিদ এমন হয় য, আমরা i এ আিছ, কােনা একিট ভ ািরেয়বল active আেছ িক i সই
active variable এর r এর থেকও বিশ, এর মােন আমােদর এই সম া তখন সমাধান করা যােব
না। যিদও এই সম ায় এরকম কখনও হেব না, কারণ বলা আেছ য সবসময় সমাধান থাকেব। িক
হয়েতা অ সম ায় সবসময় সমাধান নাও থাকেত পাের। যাই হাক, এই প িতেত আমােদর সময়
লাগেছ N × 107 কারণ আমরা িতিট ােন িগেয় সকল ভ ািরেয়বেলর উপর লুপ চািলেয় িনবাচন
করিছ কান ভ ািরেয়বেল মান assign করব।
আমরা i এর লুপ না চািলেয় একিট heap বা priority queue ব বহার করেত পাির। তাহেল
িক আমােদর সময় কেম 107 log N হেয় যােব। এই heap এ থাকেব বতমােন active সকল
ভ ািরেয়বল এবং তােদর r এর মান। এেদর মােঝ r যার সবেথেক কম স এই heap এর সবেচেয়
উপের থাকেব। অথাৎ আমােদর সমাধান হল, আমরা আেগর মত i এর লুপ চালাব। কােনা একিট
i এ এেস থেম দখব এখােন কান কান ভ ািরেয়বেলর র হয়, তােদর আমরা heap এ
ঢুিকেয় দব। এরপর দখব heap এ কউ আেছ িকনা, থাকেল সবেচেয় উপেরর ভ ািরেয়বল িনব
এবং তােক i মান দব। ( )
এই সমাধানেক আেরকটু িচ া কের O N log N এ কমােত পার। খয়াল কর কান র কা-
থায় হেয়েছ এটা ওতটা পূণ না। পূণ হল তােদর order. আমরা েতই ভ ািরেয়বল
িলেক সট করব। সট করার criteria হেব- তােদর রে র র মাথা। অথাৎ যােদর র আেগ
হয় তারা আেগ থাকেব। এখন তুিম একিট variable নাও ধরা যাক i যা িনেদশ করেব তুিম এখন
কান মােন আেছ। িঠক উপেরর i এর মত। িক আমােদরেক এই i এর লুপ চালােত হেব না। আের-
কটা variable রােখা, ধরা যাক at, যা আমােদর variable এর অ ােরেত একিট ান িনেদশ করেব।
েত at অ ােরর র ান িনেদশ করেব। আর i এর র মান হেব 1. সই সােথ আমােদর একিট
priority queue থাকেব যা েত ফাঁকা থাকেব। আেগর মতই এই priority queue ত থাকেব
ভ ািরেয়বল িল আর যই ভ ািরেয়বল এর রে র শষ মাথা ছাট তা থাকেব priority queue এর
উপের। এখন একিট while লুপ চলেব যত ণ না সব ভ ািরেয়বল েসস হেয় যায়। এখন কথা হল
লুেপর ভতের িক করবা।
থেম দখ য at যােক পেয় ট কের আেছ তার র মাথা িক i এর সমান িকনা। তাহেল
at যােক পেয় ট কের আেছ সই ভ ািরেয়বলেক priority queue ত েবশ করাও, at ক
অ ােরর পেরর ভ ািরেয়বেল পেয় ট কর আর while loop ক continue কর।
যিদ উপেরর condition সিত না হয় তাহেল চক কর য তামার priority queue ফাঁকা
িকনা। যিদ ফাঁকা হয় তাহেল at যােক পেয় ট কের আেছ তার রে র র মাথার মান i এর
মান িহসােব সট কর আর while loop ক continue কর।
যিদ উপেরর কােনা condition ই সিত না হয় তার মােন আমােদর priority queue ত
কউ না কউ আেছ। এখন priority queue থেক উপেরর ভ ািরেয়বল তুল আর দখ তার
৯৯
রে র শষ মাথার ভতের িক i আেছ িকনা। যিদ না থােক তার মােন এই সম ার সমাধান
নই (যিদও এই সম ার ে সবসময় সমাধান থাকেব বেলেছ)। যিদ i ভতের থােক তাহেল
এই ভ ািরেয়বল ক i মান দাও। i এর মান এক বাড়াও আর while loop ক continue কর।
( )
তাহেলই O N log N এ এই সম া সমাধান হেয় যােব।
১০০
সই score িদেয় দাও। এরপর পেরর খারাপ খেলায়াড় নাও এবং একই ভােব দখ এেক সবেচেয়
বড় কান score িদেল স তামার িনেচ থাকেব। এভােব তুিম যিদ score
( )িল assign কর তাহেল
দখেব য সবেচেয় বিশ জন তামার িনেচ থাকেব। এই কাজও তুিম O n এ খুব সহেজই করেত
হেব। অথাৎ তুিম িট িল সট করার পর িলিনয়ার সমেয় বািক সম াটু সমাধান করেত পারেব।
এধরেনর সম ার ে binary search ও অেনক সময় কােজ লােগ। যমন তামরা চাইেল
এই সম া binary search িদেয়ও িচ া করেত পার। মেন কর তামরা binary search কের িঠক
করেব য "কমপে g সংখ ক লাকেক আমার উপের রাখা স ব িকনা"। এবার এই ে র জবাব
তুিম দবার চ া কর তাহেলই সমাধান হেয় যােব।
১০১
ত treasure থাকার স াবনা s1 /k, সই ে সময় লােগ a1 . ি তীয় subtree ত treasure
থাকার স াবনা s2 /k, সই ে সময় লােগ T1 + a2 . কন? কারণ আমরা থেম থম subtree
খুঁেজিছ এবং পাই নাই ( তরাং T1 সময় লেগ িগেয়েছ) এরপর এই subtree ত এেসিছ এবং
treasure খুঁেজ পেত a2 সময় লেগ িগেয়েছ। এরকম কের k িট child. তরাং এেদর সবাইেক
যাগ করেল দাঁড়ায় s1 /k ∗(a1 )+s2 /k ∗(T1 +a2 )+. . .+sk /k ∗(T1 +T2 +. . . Tk−1 +ak ).
এবার মূল , এই k িট child ক কান অডাের িভিজট করেল আমােদর cost সবেচেয় কম হেব।
এে ে সাধারনত যটা দখেত হয় তাহল কার আেগ থাকা উিচত i নািক i + 1 সটা দখা। i যিদ
আেগ থােক তাহেল তা আমরা জািন আমােদর মাট cost কত। তাও আমরা একটু অ ভােব sum
টােক িলিখ- s1 ∗(a1 )+. . .+si ∗(T1 +T2 +. . . Ti−1 +ai )+si+1 ∗(T1 +. . . Ti +ai+1 )+. . .
যেহতু 1/k একিট constant তাই এেক বাদ িদেয় িদেয়িছ। এখন একটু ক কের বর কর যিদ
i + 1 আেগ থােক তাহেল cost কত- s1 ∗ (a1 ) + . . . + si+1 ∗ (T1 + T2 + . . . Ti−1 +
ai+1 ) + si ∗ (T1 + . . . Ti−1 + Ti+1 + ai ) + . . .. যিদ আমরা ধির i আেগ থাকার cost A
আর i পের থাকার cost B তাহেল এখন বলেত হেব ক বড় A নািক B? চ া কের দখা যাক।
আমরা A − B বর কের দিখ A − B = si+1 ∗ Ti − si ∗ Ti+1 . তরাং i তম subtree আেগ
থাকা উিচত যিদ A − B < 0 হয় বা Tsii < Tsi+1 i+1
হয়। এর মােন আসেল আমােদরেক subtree
সমুহেক Ti /si অ সাের সট করেত হেব। তাহেলই হেব। খয়াল কর আমরা এখােন ধু পাশাপািশ
িট িজিনস compare কেরিছ। আমােদরেক িক পাশাপািশ নয় এরকম িজিনসও িহসাব কের দখেত
হেব? সাধারণত তার দরকার হয় না। তুিম চাইেল খেট খুেট সই িহসাব করেত পার। িক আমার
দখা মেত বিশর (হয়েতা সবসময়) ভাগ সময়ই ধু পাশাপািশ দখেলই চেল।
সমস া: একিট n দেঘ র সংখ া দওয়া আেছ (n ≤ 105 )। তামােক এই সংখ ার অংক িলেক
permute কের আলাদা আলাদা িট সংখ া বানােত হেব। চাইেল িট সংখ া একই হেত পাের। শত
হল এই িট সংখ া যাগ করেল সবেচেয় বিশ সংখ ক 0 শেষ থােক। যমন তামােক দওয়া সংখ া
যিদ হয় 198 তাহেল তুিম চাইেল 981 আর 819 বানােত পার এেত কের শেষ িট শূ থাকেব-
981 + 819 = 1800. তুিম চাইেল তামার সংখ ার েত শূ রাখেত পার।
সমাধান: খুব একটা কিঠন সম া না। একদম ডােনর িট যাগ করেল 10 হেব। এরপর পেরর ল
যাগ করেল 9 হেব আর তাহেল 10 এর হােতর 1 এই 9 এর সােথ যাগ হেয় 10 হেব। যমন উপেরর
উদাহরেনও এই একই ঘটনা ঘেটেছ। তরাং আমরা 10 বানােত পাির এভােব- (1, 9), (2, 8) . . .
আর 9 বানােত পাির এভােব- (0, 9), (1, 8), (2, 7), . . .. তাহেল আমরা যটা করব আমরা একটা
লুপ চািলেয় িঠক করব কান ভােব আমরা এই 10 বানাব। এরপর সেবা 9 কীভােব বানােনা যায়
সটা িক greedy, কারণ তুিম জান উপেরর কার সােথ িনেচর কােক িমলােত হেব। তরাং এেদর
জেনর মােঝ সবেচেয় কম সংখ ক তুিম িনেত পারেব। যমন মেন কর উপের 1 আেছ x িট আর িনেচ
8 আেছ y িট, তাহেল তুিম এেদর িনেয় min(x, y) িট 9 বানােত পারেব।
িক উপেরর সমাধান স ূণ িঠক নই। তুিম যিদ িকছু case িনেয় িচ া কের দখ তাহেলই
বুঝেব। যমন 10 এর ে উপেরর সমাধান বলেব কােনা শূ থাকেব না শেষ িক আমরা
চাইেল 10 + 10 = 20 করেত পাির। অথাৎ 0 + 0 = 0 এর case আমরা িঠক ভােব াে ডল কির
নাই। আেগর সব িকছুই িঠক আেছ ধু আেরকটা িজিনস চ া করেত হেব তাহল শেষ িট সংখ ারই
িকছু 0 থাকেত পারেব। কত িল? তােতা আমােদর জানা নই! উপায় িক? একিট লুপ চািলেয়
দাও কত িল 0 শেষ থাকেব তার উপর, এর পর আেগর মত কের লুপ চািলেয় বর কর শেষর 10
কীভােব বানাবা এবং এরপর কত িল 9 বানােনা যায়। তাহেলই হেব।
১০২
Codeforces Round 100 C New Year Snowmen (140C)
সমস া: n িট সংখ া আেছ (n ≤ 105 ). তামােক এেদর হেত িতনিট কের িভ িভ সংখ া িনেয়
একিট সট বানােত হেব, অথাৎ এেদর কােনা িটই যন সমান না হয়। বলেত হেব এরকম সেবা
কতিট সট বানােনা যােব।
সমাধান: থেম আমরা বর কের নই কান সংখ া কয়বার কের আেছ। এখন খয়াল কর, আমােদর
optimal solution এ অব ই এরকম একিট সট থাকেব যােত সবেচেয় বিশ বার থাকা সংখ ািট
আেছ। কন? কারণ মেন কর য এরকম কােনা সট নই। তাহেল আমরা িক চাইেলই যেকােনা
সট হেত যেকােনা সংখ া সিরেয় আমােদর সই সবেচেয় বিশ বার থাকা সংখ ািট িনেত পাির না?
অব ই পাির। এখন িচ া কর, আমরা িক এরকম সট িনেত পাির যােত সবেচেয় বিশ বার থাকা
িট সংখ া আেছ (অথাৎ য িট সংখ া সবেচেয় বিশ বার আেছ)? দখা যাক। মেন কর সবেচেয়
বিশ বার আেছ A এর পর B. আমােদর কােছ যিদ {A, B, ?} এর মত সট থােক তাহেল তা হেয়ই
গল। মেন কর নই। িক িকছু ণ আেগই আমরা দেখিছ A ওয়ালা একিট সট অব ই আেছ।
ধরা যাক সই সটিট হল {A, X, Y }. এখন খুঁেজ দখ এমন কােনা সট আেছ িকনা যখােন B
আর X একই সােথ নই। এরকম সট খুঁেজ পাওয়া স ব কারণ B এর পিরমান X এর থেক বিশ।
যিদ এরকম কােনা সট না থােক তার মােন অিতির B আেছ এবং সিট িদেয়ও কাজ চালান যােব।
তাহেল এই িটর যিটই ঘটুক না কন আমরা X এর পিরবেত B বসােত পারব। একই ভােব আমরা
এর পেরর বড় সংখ ার জ ও একই রকম িজিনস মাণ করেত পাির। এর মােন দাঁড়াল আমরা যিদ
সবেচেয় বিশ আেছ এরকম িতনিট সংখ া িনেয় সট গঠন কির তাহেলই optimal solution পাওয়া
যােব। এরকম কের িতবার আমরা সবেচেয় বিশ আেছ এরকম িতনিট সংখ া িনেয় িনেয় সট গঠন
করব।
১০৩
য a বা b আর কােনা pair এ নই। তরাং আমােদরেক a বা/এবং b মুছেত হেব যন পাশাপািশ
কােনা ab বা ba না থােক। খয়াল কর আমােদরেক িকছু a আর িকছু b মুছেত হেত পাের, এরকম
হেব না য সব a বা সব b মুছবা। যমন abbbbcaaaab. এে ে থম a আর শষ b মুছা লাভ
জনক। তাহেল সমাধান িক বুঝেত পারছ? আমরা যখন ab ক িনেয় কাজ করব তখন দখব আমােদর
ইনপুেট কাথায় কাথায় a বা b পাশাপািশ আেছ। তােদরেক প প কের নব। এবার একই েপ
দখব কত িল a আেছ আর কত িল b আেছ। যিট কম থাকেব আমরা সই প থেক তােক মুছব।
যমন এই িকছু ণ আেগর উদাহরেন িট প আেছ যা c ারা আলাদা করা। থম েপ a কম আেছ
তাই সখান থেক a ক মুছব আর ি তীয় েপ b কম আেছ তাই তােক মুছব।
১০৪
সমাধান: সম াটা বশ সহজ। আমােদরেক t অেপ া বড় িক সবেচেয় ছাট একিট ি ং বানােত
হেব। এরকম একিট ি ং এর বিশ িক? িট ি ং এর থেম িকছু ঘর একই থাকেব এর পর s
এর অ রিট t এর অ র হেত বড় হেব। এরপর s এর বািকটু ছাট হেত বড়েত সেটড হেব। যমন
s = abac, t = abob এর ে আমরা র একই ঘর a রাখেত পাির। এর পর s এ c বসাব
যিট t এর b অেপ া বড়। এরপর s এ b আর a বািক থাকেব। এেদরেক সট করেল ab দাঁড়ায়।
তরাং আমােদর s হেব acab. এখন হেলা কত র আমরা েত একই রাখব? যেহতু ি েঙর
দঘ মা 5000 সেহতু আমরা েত ক ােন িগেয় িগেয় চ া করেত পাির। একটু িচ া করেল বুঝেব
য এই কমন অংশ যত বড় হেব তত ভাল। তাই আমরা চাইেল এই কমন অংেশর লংথ এর উপর
বাইনাির সাচ চালােত পাির, এেত কের যিদ আমােদর ি ং িলর লংথ আরও বিশ হত তাহেলও
সম া হত না। আসেল আরও িচ া করেল আমার িব াস বাইনাির সাচ ছাড়াও সমাধান করা যােব।
যাই হাক র কমন অংেশর লংথ জেন গেল তুিম বািক যসব ি ং আেছ তােদর থেক এমন
একিট character নেব যিট ঐ ােনর t এর character হেত যন বড় হয়। এরপর বািক িলেক
সেটড ভােব বিসেয় দেব।
সমস া: তামােক n সাইেজর একিট অ াের দওয়া আেছ (n ≤ 105 ). ধরা যাক অ ােরিট হেলা
a1 , a2 , . . . an . তুিম যতবার ই া একিট অপােরশন চালােত পার। এেক (i, t) ারা িচি ত করা
যাক। এেদর িলিমট হেলা 1 ≤ i ≤ n এবং i + 2t ≤ n. এই অপােরশেনর ফেল ai এর মান 1
কমেব এবং ai+2t এর মান 1 বাড়েব। যমন (1, 0, 1, 2) ত (1, 1) অপােরশন চালােল (0, 0, 2, 2)
হেব। তামার ল হেব থম k ঘরেক শূ কের ফলা। বলেত হেব থম k ঘরেক শূ করেত
সবিন কয়িট অপােরশন লাগেব। k এর মান 1 হেত n − 1 পয হেত পাের। অথাৎ এই n − 1 িট
k এর মােনর জ তামােক সমাধান করেত হেব। n এর মান সেবা 105 হেত পাের।
সমাধান: যেহতু আমােদর সংখ া সবসময় বাম হেত ডােন যায় তাই আমরা থেম a1 ক শূ করব
এর পর a2 ক- এরকম কের করেত থাকব। যখন আমরা a1 ক শূ করব তখন আমার a1 এর
সংখ া িলেক কাথায় পাঠােবা? খুব সহজ উ র- সবেচেয় দূের। িক সবেচেয় দূের পাঠােনাই িক
সবেচেয় লাভজনক? অব ই! মেন কর a1 ক তুিম 2t1 ঘর সরাও এরপর 2t2 ঘর সরাও। যিদ
t1 = t2 হয় তাহেল িক তুিম চাইেল এই িট move না িদেয় একবাের 2t1 +1 move িদেত
পারেত। আবার যিদ t1 < t2 হেল তামার জ t2 এর move আেগ দওয়া ভাল হত, কারণ এেত
কের সকল k এর জ সমাধােন এিট কােজ লাগেব। মােন k এর মান যাই হাক না কন, তুিম যিদ
a1 ক সবেচেয় দূের পাঠাও তাহেলই তামার লাভ।
১০৫
৭.১ অ শীলনী
৭.১.১ সম া
Simple
Codeforces 67 A Partial Teacher
Codeforces Round 66 D FreeDiv
Codeforces Round 89 C Fancy Number
Easy
Codeforces 76 B Mice
Codeforces Round 67 D Big Maximum Sum
Codeforces Round 71 C Beaver
Medium
Codeforces 86 B Tetris Revisited
Codeforces Round 92 Div 1 C Brackets
Codeforces Round 96 Div 1 D Constants in the language of Shakespeare
Hard
Codeforces 128 Div 2 E Transportation
১০৬
অধ ায় ৮
Dynamic Programming
১০৭
( )
এই সমাধােনর time complexity কত? O n2 যখােন n হল েকর সংখ া। কারণ তামার
( ) ( )
state হল O n আর েত ক state হেত তুিম O n এর একিট লুপ চািলেয় নতুন ক বসােনার
চ া কেরছ।
সমাধান: এিটও আমার বশ পছে র সম া। এই সম ার একিট নাম আেছ- bitonic tour. বলেত
ি ধা নই এই সম া থেম দখেল মেন হেত পাের এটা কীভােব dynamic programming! কারণ
এখােন state িক হেত পাের এটা একটা িবশাল িচ ার ব াপার। এখােন পথটা িক রকম একটু দখ-
একদম বাম মাথা হেত কের িকছু িকছু কের ডােন যাবা, এর পর একদম ডান মাথায় পউছােল
আবার একটু একটু কের বােম এেস একদম বাম াে চেল আসেত হেব। এবং ধু তাই না, তামােক
আবার সকল িব েতই যেত হেব। িক state িক?
State বর করেত গেল আমােদরেক একটু িচ া পা ােত হেব। DP করেত গেল একটু systematic
ভােব আগােত হয়। এই য তুিম এক িব থেক মােঝর িকছু িব বাদ িদেয় ডােন আেরক িব েত
লাফ িদ এিটই হেলা এখােন মূল সম া। আমরা িক কােনা ভােব কােনা িব েক skip না কের
এেক এেক িব িলেক িনেত পাির? মেন হেত পাের- তা কীভােব স ব! িক আসেল স ব, একটু
িচ া কর।
এখােন সমাধােনর মূল আইিডয়া হল- বাম থেক ডােন িগেয় িফের আবার বােম আসা- এভােব
িচ া না কের িচ া করেত হেব- বাম থেক ই পেথ ডােন যাওয়া যন সকল িব ই কাভার হয়-
তাহেলই িক হেয় যায়। একটু িচ া কের দখ। এখন িক সম া অেনক অেনক সহজ হেয় িগেয়েছ!
তাহেল হেলা state িক? কােনা এক মুহূেত state হেব বাম হেত ডােন যাওয়ার িট পথ
এখন কই কই আেছ। ধরা যাক আমরা িব িলেক বাম হেত ডান 1 হেত n এ না ািরং কেরিছ।
তাহেল state ক আমরা (i, j) িদেয় কাশ করেত পাির যার মােন হেব- থম পথিট এখন i এ
আেছ আর ি তীয় পথিট এখন j ত আেছ। আর DP (i, j) ফাংশনেক িরটান করেত হেব বািক পেথর
optimal র , অথাৎ i আর j হেত ডােন n এ যেত হেব আর বািক সব িব েক ব বহার করেত
হেব এরকম পাথ িটর সবেচেয় কম র । তাহেল হেলা DP (i, j) থেক তুিম কই যােব? যিদ
i > j হয় তাহেল তুিম এর পের i + 1 এ যাবার চ া করেব আর যিদ j > i হয় তাহেল j + 1 এ।
অথাৎ তুিম বাম হেত ডােন এেক এেক িব িলেক consider করেব। আমরা আমােদর িবধার
জ ধের িনেত পাির k = max(i, j) + 1 অথাৎ আমরা এর পের k ত যাব। িক কই থেক? i
থেক নািক j থেক? ই ভােবই চ া করেত হেব। অথাৎ যিদ আমরা i থেক k ত যাই তাহেল হেব
DP (k, j) + dist(i, k) আর যিদ j থেক যাই তাহেল হেব DP (i, k) + dist(k, j) এেদর মােঝ
যিট সবেচেয় কম সিটই DP (i, j) এর মান তাই না? আর DP এর করেব কীভােব? খুব সহজ
DP (1, 1) অথাৎ িট পেথর া তখন 1 এ থাকেব। আর শষ হেব কখন? যখন k = n + 1 হেয়
যােব। তখন িক i আর j এর ভতর যই া এখনও n এ পৗছায় নাই তােক n এ পউছােয় িদেত
হেব (নাহেল তা সাইেকল হেব না) এবং সই মানেক িরটান করেত হেব DP থেক। অথবা যিদ দখ
য k এর মান n তাহেল i এবং j উভয় ান থেকই( )n এর র যাগ কের িরটান(করেব। )
এই সমাধােনর time complexity হল O n2 কারণ তামার state হল O n2 আর েত ক
state হেত তুিম ই ধরেনর transition করছ।
১০৮
UVa 116 Unidirectional TSP
সমস া: একিট ি ড আেছ। ি েডর row সংখ া খুব জাড় 10 িট আর কলাম সংখ া খুব জাড় 100
িট। ি েডর িতিট ঘের একিট কের সংখ া আেছ এবং এই সংখ া িল ধনা ক বা ঋণা ক হেত পাের
(সংখ া িল 30 িবেট কাশ করা স ব)। তুিম ি েডর উপেরর বাম কানা হেত িনেচর ডান কানায়
যােব। যসব ঘর িদেয় যােব তােদর সংখ ার যাগফল তামােক সবিন করেত হেব। তেব এক ঘর
থেক আেরক ঘের যাবার িকছু িনয়ম আেছ। তুিম যিদ (r, c) ত থেক থাক তাহেল তুিম এই িতনিট
ঘেরর কােনা একিটেত যেত পারেব- (r−1, c+1), (r, c+1), (r+1, c+1). যিদ (r−1, c+1)
ি েডর উপর িদেয় বিরেয় যায় তাহেল স িনচ িদেয় আসেব অথাৎ যেহতু উপের (r − 1, c + 1)
বেল িকছু নই সেহতু স িনেচ চেল যােব (R, c + 1) যখােন R হল শষ row. একই ভােব যিদ
তুিম িনেচ যাবার সময় দখ য (r + 1, c + 1) বেল িকছু নই তাহেল তুিম উপের চেল যােব অথাৎ
(1, c + 1) এ চেল যােব। এক কথায় পুেরা ি ডিট একিট িসিল ডােরর মত (িসিল ডােরর উ তা x
axis বরাবর ক না কর)।
সমাধান: মেন কর একিট ফাংশন আেছ DP যা একিট ি েডর সল (r, c) ক প ারািমটার িহসােব
নয় এবং িরটান কের সখান থেক িনেচর ডােনর কানায় যাবার সবেচেয় কম খরেচর রা া। এখােন
একিট িজিনস, কােনা কােনা সল হেত িক িনেচর ডান কানায় পউছান স ব না। সে ে মেন কর
আমােদর ফাংশন অেনক অেনক বড় মান িরটান কের। এই মানেক এেতা বড় হেত হেব যন কােনা
পােথর খরচ যন এেতা বড় হেত না পাের। এই সম ার ে যেহতু 100 িট কলাম থাকেত পাের
তার মােন আমােদরেক 100 িট 30 িবেটর সংখ া পার হেয় যেত হেত পাের। তরাং আমােদর বড়
সংখ ািট এর থেক বড় হেলই হেব। অেনক সময় দখা যায় য এই বড় সংখ া বর করা বশ ক কর।
সসব ে খরেচর পাশাপািশ আরও একিট সংখ া রাখেত পার যা বলেব সমাধান আেছ িকনা। যিদ
সমাধান থােক তাহেল অপর সংখ া দেখ বুঝেত পারেব য খরচ কত।
যাই হাক, মূল সম ায় ফরত আিস। তাহেল তুিম DP ফাংশেনর ভতর থেক (r − 1, c +
1), (r, c + 1), (r + 1, c + 1) এই িতন ােনর জ DP কল করেব (বা দরকাের ি ড wrap করেব
আর িক)। এেদর ভতর থেক যিট সবেচেয় কম তার সােথ তামার ােনর সংখ া যাগ কের িরটান
করেব তাহেলই হেয় যােব। ( )
এই সমাধােনর time complexity হেব O RC যখােন R হল row সংখ া আর C হল কলাম
( )
সংখ া। কারণ আমােদর O RC সংখ ক state ( আেছ
) আর িতিট state হেত 3িট transition
করেত হয়। তরাং আমােদর complexity O RC .
মূল সম ায় অব আমােদর কান পেথ যেত হেব সটাও ি ট করেত বেলেছ। যিদ এরকম
একািধক পথ থােক তাহেল lexicographically ছাটিট ি ট করেত হেব বেলেছ। িক সটা তা
খুব একটা কিঠন না। িতিট DP এর সময় িলেখ রাখেব য সই ােনর optimal মান তুিম িতনিট
transition এর মােঝ কানিট থেক পেয়ছ। তাহেলই তা হল তাই না? কারণ তাহেল তুিম র
সেল িলেখ রেখছ এর পের কই যেত হেব, সই সেল িলখা আেছ এর পের কই যেত হেব এভা-
ব তুিম উপেরর বাম কানা হেত িনেচর ডান কানায় চেল আসেত পারেব। আর যেহতু আমােদর
lexicographically ছাট রা া ি ট করেত হেব সেহতু যখন আমরা দখব িতনিট রা ার মােঝ
একািধক রা া সবেচেয় কম খরচ দয় তখন আমরা lexicographically ছাট সল বেছ নব।
অথাৎ সাধারন path printing এর মত কেরই আমরা পাথ ি ট করব।
১০৯
কােনা কথা নই। শষ গানেক অব ই t সমেয়র আেগ হেত হেব আর যখন খুিশ তখন শষ
হেত পারেব। অথাৎ মেন কর তুিম িঠক t − 1 সমেয় 100 সেকে ডর গান করেল তাহেল তুিম
t + 99 সময় পয গান নেত পারেব। এখন আর িক কােনা নতুন গান নেত পারেব না কারণ t
সময় পার হেয় িগেয়েছ।
সমাধান: এখােন যিদ ধু বলত য সেবা কতিট গান নেত পারেব তাহেল িক খুব সহজ হত।
Greedy ভােব সবেচেয় ছাট গান িনেত থাকেত হত যত ণ তামার নয়া গান িলর মাট সময় t
এর থেক কম হত। িক এখােন গান সেবা করার পাশাপািশ মাট সময় কও সেবা করেত বলা
হেয়েছ। এই condition এর কারেন িক তামার greedy সমাধান কাজ করেব না। উদাহরন প
মেন করেত পার t হল 6 আর তামার কােছ িতনিট গান আেছ 2, 5, 678 সেকে ডর। যিদ greedy
ভােব কর তাহেল 2 আর 678 নেব। িক optimal সমাধান হল 5 আর 678 নয়া। তাহেল উপায়
িক?
থেম িকছু observation. আমােদর বাজান শষ গান অব ই িবেশষ গান হেত হেব। কন?
ই ধরেনর কস হেত পাের- একিট হল আমরা আমােদর িবেশষ গানটা বাজাই নাই অথবা বািজেয়িছ
িক শেষ না। থম ে মেন কর আমরা সবার শেষ যই গান বািজেয়িছ সিট বাজেত সময়
িনেয়েছ x সময়। আমরা জািন x ≤ 180. আমরা যিদ এই গােনর পিরবেত িবেশষ গান বাজাতাম
তাহেল অব ই সই গান অেনক বিশ সময় ধের বাজত। এখন ি তীয় কস দখা যাক। মেন কর
এই িবেশষ গানটা আমরা বািজেয়িছ িক সবার শেষ না। এই ে আমরা িক যই গান সবার
শেষ বািজেয়িছ সটা িবেশষ গান যই মুহূত হেত বাজান কেরিছলাম সই মুহূত হেত এই গানটা
বাজাব, এরপর বািক গান িল বাজান শষ কের আমােদর িবেশষ গানটা বাজাব। এেত কের িক
িবেশষ গান বাজােত কােনা সম া হেব না আবার িবেশষ গানটাও সবার শেষ বাজল। অথাৎ আমরা
আমােদর িবেশষ গানেক সবসময় শেষ বাজাব।
এর মােন হল আমরা বািক n িট গান হেত সবেচেয় বিশ কত িল গান বাজােত পাির যন তােদর
মাট সময় t অেপ া কম হয়। যিদ একািধক ভােব এই সেবা সংখ ক গান আমরা িনবাচন করেত
পাির তাহেল আমরা চ া করব সবেচেয় বিশ সময় যােত গান বােজ। এরপর আমরা আমােদর িবেশষ
গান বাজাব।
এখন এই সম া সমাধান করা িক খুব একটা কিঠন না। নানা ভােব তুিম এখন DP করেত
পার। DP সমাধান আেলাচনা করা আেগ একটা িজিনস, তাহল যিদও t এর মান অেনক হেত পাের
িক 50 × 180 + 678 িক খুব একটা বড় না। যিদ ইনপুেটর t এর মান এর থেকও বড় হয় তার
মােন হেব আমরা সব গান বাজােত পারব। তরাং আমরা ধের িনেত পাির আমােদর t এর মান এর
থেক ছাট।
এখন আমরা DP কীভােব করব সটা িনেয় ভাবেবা। থেমই আমােদরেক state বর করেত
হেব। আমরা আসেল িক চাই? আমরা জানেত চাই য i িট গান ব বহার কের j সময় ধের গান বাজােত
পাির িকনা। িক কান i িট গান? একিট উপায় হেত পাের িবটমা DP, অথাৎ n িট গােনর কান
কানিট ব বহার হেয়েছ তা িবটমাে র মাধ েম কাশ করা। িক সে ে সম া হল n এর মান
অেনক বড়, তাই 2n ও অেনক বড় হেব। তরাং এভােব কান i িট গান আমরা িনেয়িছ তা কাশ
করা যােব না। এখােন একটা িজিনস খয়াল কর, আমােদর িক এটা জানার দরকার নই কান কান
i িট গান আমরা ব বহার কেরিছ। আমরা এভােবও বলেত পাির য, " থম k টার ভতের i টা" আমরা
ব বহার কেরিছ। তরাং আমােদর state হেব (k, i, j) যার মােন হেব- থম k িট গােনর মােঝ i িট
গান ব বহার কের আমরা j সময় গান বাজােত পাির িক না। তুিম চাইেল এেক BFS বা DFS এর
মতও িচ া করেত পার। যেহতু এটা DP এর অধ ায় আমরা DP এর মত কের িচ া কির। আমরা
মুলত িতটা j < t, i ≤ n এর জ জানেত চাি (n, i, j) িক স ব িকনা। মেন কর আমরা
কােনা একিট (k, i, j) ত আিছ। এখান থেক আমরা িক করেত পাির? আমরা k তম গান িনেত
পাির, সে ে আমােদর জানা দরকার য (k − 1, i − 1, j − song[k]) িক স ব িকনা। অথবা
আমরা k তম গান নাও িনেত পাির, সে ে আমােদর জানা দরকার (k − 1, i, j) িক স ব িকনা।
সবেশেষ আমােদর base case হেব যখন k = 0. যিদ এই ে i = j = 0 হয় তার মােন
স ব, আর যিদ তা না হয়, তার মােন স ব না। তরাং আমােদর এই সমাধােন আমােদর state হল
n2(t আর) আমােদর DP এর ভতের মা িট transition. তাই আমােদর time complexity হেব
O n2 t .
তামরা চাইেল এরকম state করেত পারেত- (k, j) যার মােন হেব, থম k িট গান হেত
১১০
সেবা কত িল বািজেয় আমরা j সময় কাভার করেত পাির। তাহেল আমােদর time complexity
হেত একিট n কেম যােব।
১১১
সমাধান: আেগর মত কেরই িচ া কর। আমােদর DP(i) এর মােন মেন কর- "আমরা ইিতমেধ ই
হেত i এর আগ পয সব ভাগ কের ফেলিছ, এখন বল i হেত শষ পয সবিন কত ভােগ ভাগ
করা যায়"? এই মান কীভােব বর করব? সহজ! j এর একিট লুপ চালাও আর দখ i হেত j পয
ি ংিট palindrome িকনা যিদ palindrome হয় তাহেল 1+DP(j+1) হেব একিট candidate.
এরকম সকল j এর মােঝ যিট সবেচেয় কম সিটই উ র। i এ এেস িতিট j এর জ i থেক j
পয ি ঙিট palindrome িক না এটা বর করা মেন হেত পাের অেনক costly. কারণ িতিট i
এ এেস তুিম j এর একিট লুপ চালােব i হেত n পয । এই লুেপর ভতের তুিম চক করেব( i হেত
) j
একিট palindrome িকনা। কােনা একিট ি ং palindrome িকনা ( )তােতা আশা কির O n (এই)
করেত পারবা। তাহেল এখােন DP(i) এর ভতর সময় লাগেছ O n2 (j এর লুেপর ভতর O n
এ (palindrome
) বর করা)। আর যেহতু মাট n িট state সেহতু এই সমাধােন মাট সময় লাগেব
O n3 .
এখন উপায় িক? এভােব ভাব- আমােদর সমাধােন costly অংশ কানটা? অব ই palindrome
বর করার অংশ। আমরা িক কােনা ভােব একিট সাবি ং palindrome িকনা তা আরও ত বর
করেত পাির? একটু যিদ খয়াল কর তাহেল বুঝেব এিটও একিট dp আসেল। তুিম জানেত চা i
হেত j সাবি ংিট palindrome িকনা। সটা কীভােব বর হেব? যিদ i আর j একই হয় তাহেল তা
হেয়ই গল। আর যিদ নাহয় দখবা i আর j তম character একই িকনা। যিদ না হয় তাহেল তা
palindrome না আর যিদ দখ একই তাহেল দখ i + 1( হেত ) j − 1 িক palindrome িকনা। এর
মােন আমােদর এই palindrome এর dp এর state O n2 আর ভতের মা একটা transition.
( )
অথাৎ মাট time complexity হেব O n2 .
খয়াল কর n2 × n2 = n4 না িক । এখােন মাট time complexity হে n2 + n2 = n2
(constant ন িহসােব থাকেল তার কােনা দাম নই)। যিদও একিট dp এর ভতর হেত আেরকিট
dp ক কল করা হে িক (দখ )পেরর dp এর state িক আেগর dp এর উপর িনভর কের না।
পেরর dp এর state িক O n2 ই থাকেব যখােন n হল ি ং এর দঘ । তুিম এভােব িচ া করেত
( )
পার- ি তীয় dp এর সকল state এর মান বর করেত সময় লােগ O n2 . এর পর তা থম dp
( )
ত palindrome বর করেত O 1 সময় লাগেব তাই না? তাহেল থম dp ত মাট সময় লাগেব
( 2) ( 2)
O n . এভােব মাট O n সমেয় সব িকছুর মান বর হেয় যােব।
সব শেষ একিট কথা, তামরা িক বুঝেত পারছ কন এটা greedy ভােব হেব না? অথাৎ
আমরা থেম সবেচেয় বড় সাবি ং নব যিট palindrome, এর পর আবার থেক সবেচেয়
বড় সাবি ং নব। এরকম কের করেল কন সবেচেয় কম ভােব ভাগ হেব না? িচ া কের দখ তা
anticase বর করেত পার িকনা। যমন একিট anticase হেত পাের pppbbp. তুিম যিদ greedy
ভােব ভাগ কর তাহেল হেব (ppp)(bb)(p) িক optimal হেব (pp)(pbbp).
১১২
থেম আমার মেন হেয়েছ হয় এিট greedy নাহেল এিট dp. িক যেহতু string এর দঘ মা
5000 কের তাহেল মেন হয় greedy হেব না। বা অ ভােব বলেল যেহতু মান কম সেহতু আমরা
চাইেল dp চালােতই পাির। ইিট ি ং দওয়া আেছ, আমােদর dp এর state িক হেব? িট ি ং
দওয়া থাকেল সাধারনত state হয় (i, j) যখােন i হল থম ি ং এ একিট index আর j হল
ি তীয় ি ং এ। হেত i আর j পয েসস করা শষ। এখন বািকটু েসস করেত হেব। এখন
এই state এর সােথ আমােদর score এর স ক িক? এখন পয আমরা score িনেয় একটুও
িচ া কির নাই, তরাং এখন একটু িচ া ভাবনা করা যাক। আমরা যিদ িতিট character এর জ
তার থম index এর িবেয়াগ করেত পাির আর শষ index টা যাগ করেত পাির তাহেলই িক হেয়
যােব। এখন িচ া কর আমরা যিদ (i, j) থেক (i + 1, j) বা (i, j + 1) এ যাই তাহেল এই যাগ
িবেয়ােগর কাজ করেত পারবা িকনা? দখা যাক! মেন কর আমরা (i, j) থেক (i + 1, j) ত যাব।
তার মােন আমরা S[i + 1] নব (ধির S হল থম ি ং)। এিট আসেল merged ি ং এ কত তম
index? i+j+1 তম তাই না? কারণ এর আেগ আমরা i+j িট character িনেয়িছ, তরাং এিট হেব
i + j + 1 তম। আর িক জানার দরকার? জানা দরকার য, S[i + 1] এই character িট S[1 . . . i]
বা T [1 . . . j] ত আেছ িকনা। যিদ এেদর কােনািটেতই না থেক থােক তার মােন এিট হেব এই
character এর থম occurance এবং সে ে আমরা এই ান অথাৎ i + j + 1 িবেয়াগ করব।
আর যিদ দিখ এিট শষ character অথাৎ S[i + 2 . . .] আর T [j + 1 . . .] এ এই character
নই তাহেল এই ান যাগ করব। আর সই সােথ যাগ করব (i + 1, j) state এর dp এর মানেক।
একই ভােব আমরা (i, j + 1) এর জ ও একই িজিনস িহসাব করব। যেহতু আমােদরেক score
সবেচেয় কম করেত হেব তরাং এই িট option এর মােঝ যিট আমােদর কম score দেব সিটই
হেব আমােদর DP (i, j) এর মান।
একিট িজিনস বািক থেক গেছ আর তাহল অমুক character S[1 . . . i] এর মােঝ আেছ িকনা
বা S[i . . .] এর মােঝ আেছ িকনা- এ িজিনস কীভােব বর করেব? এটা নানা ভােবই খুব ত উ র
করা যায়। এর মােঝ সবেচেয় বুি মান উপায় মেন হয় িত character এর জ বর কের রাখা য
সই character িট S এ সবার থম কাথায় আেছ আর সবেশেষ কাথায় আেছ। তাহেল এই সবার
আর শষ ােনর সােথ compare কের বেল ফলেত পারেব সই character িট S[1 (. . . i])
বা S[i . . .] এর মােঝ আেছ িকনা। আর এই সমাধােনর complexity তা বুঝেতই পারছ- O n2
( )
যখােন n হেলা ি ং এর length. কারণ আমােদর state O n2 আর state এর ভতের মা িট
transition.
১১৩
লািঠর দঘ 1000 সেহতু আসেল 10002 এর বিশ state হেব না। িক তুিম যিদ একটু িচ া কর
তাহেল বুঝেব আসেল এেতা state হেব না। মেন কর ে র উদাহরেন 2, 4 আর 7 এ দাগ িছল।
তরাং তুিম িক কখনও 8 বা 5 ইত ািদ ােন কাটেব না। অথাৎ আসেল n2 এর বিশ state হেব না।
এেক represent করাও িক বশ সহজ। তুিম ধু মাক িলর index রাখেব তাহেলই হেব। মােন
যমন ধর এর আেগর উদাহরেন যিদ mark[1] = 2, mark[2] = 4, mark[3] = 7 হয় তাহেল
(2, 7) না বেল আমরা বলেত পাির (1, 3) কারণ mark[1] = 2 আর mark[3] = 7. আমােদর
িক 0 আর 10 (অথাৎ 0 আর l) ও লাগেব। এেদরেক আমরা িট অিতির mark িহসােব রাখেতই
( )
পাির। যাই হাক মূল কথা- আমরা O n2 state এ একিট লািঠর টুকরা রাখেত পাির। আমােদর
DP ক িরটান করেত হেব এই টুকরা এর ভতের যত মাক আেছ সসেবর সব িলেক কাটেত হেল
সবিন কত খরচ হেব। এটা িক খুব একটা কিঠন না। তামার এই টুকরা এর ভতের যত িল মাক
আেছ, তােদর এেক এেক কাটার চ া করেত হেব। অথাৎ তুিম যিদ DP (i, j) ত থাক তাহেল সকল
i < k < j এর জ তামােক DP (i, k) + DP (k, j) + length(i, j) এর সবিন মান বর
করেত হেব। এেক িরটান করেলই হেব। এর মােন( আমরা
) DP ফাংশেনর ভতের একিট লুপ চালাি ।
তরাং আমােদর time complexity হেব O n3 .
১১৪
য আসেল লুপ চালানর কােনা দরকার নই। আমরা যিদ S[i] এর পেরই সই closing bracket
বিসেয় দই তাহেল িক কােনা িত নই।
যাই হাক, এই সম া িক চাইেল greedy ভােবও সমাধান করেত পার। একটু িচ া কের
দখ- কােনা একিট bracket sequence এ কয়িট অিতির character িদেল সিট balance
হেব সিট তুিম greedy ভােব বর করেত পার িকনা। খুব একটা কিঠন না িক ! Stack িদেয়ই এই
কাজ করা যায়।
১১৫
i − (n − 1). আশা কির এটা বুঝেত পারছ য যিদ i = 1 হয় তাহেল 0 − i বেল কােনা চইন
থাকেব না আর যিদ i = n − 2 হয় তাহেল i − (n − 1) বেলও কােনা চইন থাকেব না। এখন এই
চইন িটর জ recursively DP কল িদেলই হল। আর merge কীভােব করেব তােতা আেগই
আেলাচনা কেরিছ। তরাং আমােদর state হেব (a, b) যার মােন হল a হেত b এর চইন টু আর
a − b ইতমেধ ই একিট বা ারা জাড়া লাগান আেছ। এই DP এর িভতের আমােদর কাজ হেব
একিট i এর লুপ চািলেয় a − i − b ি ভুজ তির করা আর a − i, i − b এই চইন িটর জ DP
কল করা।
১১৬
UVa 1218 Perfect Service
সমস া: একিট n নােডর ি দওয়া থাকেব (n ≤ 10000)। তামােক ি এর নাড িলেক সাদা ও
কােলা রঙ করেত হেব যন সকল সাদা নােডর িঠক একিট কােলা নাড neighbor িহসােব থােক।
িট সাদা রেঙর নাড neighbor হেল সম া নই। এখােন neighbor মােন হল adjacent. বলেত
হেব সবিন কত িল নাডেক কােলা রঙ করেত হেব।
সমাধান: আবােরা ি েত DP করেত হেব। তেব এবার একটু বিশ িচ া ভাবনা করেত হেব। যিদও
এই সম ার ি িট rooted না িক আমরা চাইেল যেকােনা একিট নাডেক root িহসােব ক না
করেত পাির। এেত কের আমােদর dp চালান সহজ হেব।
মেন কর আমরা এখন একিট নাড u ত আিছ। এেক আমরা চাইেল সাদা রঙ করেত পাির আবার
কােলা করেত পাির। আমােদর বর করেত হেব এই ই ে সবিন কত িল নাড কােলা রঙ করেল
পুেরা সাবি আমােদর শত মানেব। এজ ভাবেত হেব u এর child সমুহ হেত আমােদর িক িক তথ
জানা দরকার। এর উপর িভি কেরই আমরা আমােদর state দাঁড় করােত পারব। থেমই ধরা যাক
আমােদর নাড যিদ কােলা রঙ করা হয় তাহেল িক হেব। সে ে এই নােডর যেকােনা neighbor
কােলা হেত পারেব। আবার সাদাও হেত পারেব তেব সই ে সই সাদা নােডর আর কােনা
neighbor কােলা নাড িহসােব থাকেত পারেব না। এখােন একটা িজিনস ল করার িবষয়- সটা
হল কােনা একিট নাড সাদা হেলও তার ই রকম অব া থাকেত পাের। এক- তার িনেচ কােনা
কােলা neighbor থাকা যােব না, ই- কােলা neighbor থাকেত হেব। তরাং আমােদর িতিট
নােডর এই িতনিট state থাকেব- u নাড কােলা, u নাড সাদা িক এর কােনা child কােলা হেত
পারেব না, u নাড সাদা এবং এর িনেচ কােলা একিট নাড থাকেতই হেব।
এখন এেক এেক দখা যাক িতিট ে আমােদর িক করেত হেব। মেন কর আমরা এখন যই
নােড আিছ তােক কােলা রঙ করেত চাই। সে ে child নাড িলেক সাদা রঙ করেত হেব এবং
তােদর িনেচ কােনা কােলা neighbor থাকা যােব না।
যিদ িনেজেক সাদা আর এর িনেচ কােনা কােলা না রাখেত চাই তাহেল িক করেত হেব? সে ে
িনেচর সব িল সাদা হেত হেব। িক ধরেনর সাদা? ি তীয় ধরেনর সাদা, অথাৎ তােদর অব ই একিট
কােলা নাড neighbor িহসােব থাকেত হেব। কন? কারণ যিদ তােদর িনেচও যিদ কােলা না থােক
তাহেল তা তােদর আর কােনা কােলা neighbor থাকা স ব না।
বািক থাকল যিদ আমরা িনেজেক সাদা করেত চাই আর তার িনেচ যিদ একিট কােলা থাকেত হয়।
সই ে আমােদর িনেচ যারা আেছ তােদর একিটেক কােলা করেত হেব আর বািক িলেক সাদা
করেত হেব। কান ধরেনর সাদা? যােদর অ ত একিট িনেচ কােলা আেছ, অথাৎ ি তীয় ধরেনর।
তাহেল এই গল আমােদর state আর state আপেডট করার উপায়।
এখন খয়াল কর, থম ই আপেডেটর ে কােনা লুপ নই (child এর DP কল করার
লুপ বােদ)। িক শষ আপেডেটর ে িক একটা লুপ লাগেছ। সই লুপ চািলেয় আমরা কােলা
নাড fix করিছ এর পর আেরকিট লুপ চািলেয়( আমরা
) বািক নােডর জ DP কল করিছ। তরাং
আমােদর time complexity হেয় যাে O n2 . যিদ আমােদর এই কােলা নাড fix করার লুপ
(অথাৎ আমার কান child
( ) কােলা হেব) child এর DP কল করার লুেপর সােথ nested ভােব না
থাকত তাহেল িক O n হত। আমরা িক কােনা ভােব এই লুপ বাদ িদেত পাির বা nested না
কের করেত পাির? াঁ পাির। এসব ে একিট কমন টকিনক আেছ। খয়াল কর, আমরা এখােন
কােলা নাড fix কের বািক নাড িলর ি তীয় ধরেনর সাদার cost এর যাগফল বর করিছ তাই
না? আমরা এই যাগফল কােলা নােডর লুেপর ভতের বর না কের বাইের বর কির। অথাৎ আমরা
আমােদর নােডর িনেচ যত িল child আেছ সবার ি তীয় ধরেনর সাদার যাগফল বর কির, ধরা
যাক S. এর পর কােলা নােডর জ লুপ চালাই। ধরা যাক আমরা একটা নাড িনবাচন কেরিছ য
এেক আমরা কােলা করব। তাহেল S হেত আমরা এই নাড ি তীয় ধরেনর সাদা করেত যই cost
লােগ তা বাদ দই আর এেক কােলা করেত যই cost তা যাগ কির। তাহেলই (তা) হেয় গল তাই
না? আমােদর এখন আর লুপ িট আর nested নই। তরাং এভােব আমরা O n এ আমরা এই
সম া সমাধান করেত পাির। তামরা চাইেল এই কাজ িট লুেপর পিরবেত একিট লুপ িদেয়ও করেত
পার।
১১৭
UVa 1252 Twenty Questions
সমস া: n িট িভ িভ সংখ া আেছ (n ≤ 128). তামার ব ু এই n িট সংখ ার মােঝ কােনা একিট
মেন মেন ধেরেছ আর তামােক বেলেছ য স কান সংখ ািট মেন মেন ধেরেছ তা বর করেত। তুিম
জান য এই n িট সংখ া িক িক। িতিট সংখ া m িবেটর (m ≤ 11). তুিম তামার ব ুেক িকছু
করেত পার যমন- i তম িবট িক 0 নািক 1. এরপর সই উ েরর উপর িভি কের তুিম আবার
নতুন করেত পার। বলেত হেব সবেচেয় কম কত িল কের তুিম বলেত পারেব তামার ব ুর
সংখ ািট কত। যমন মেন কর যিদ n = 1 হয় তাহেল িক তুিম কােনা ছাড়াই বেল িদেত পার
তামার ব ুর সংখ া কত। আবার n = 2 হয় আর সংখ া িট হয় 100 আর 110 তাহেল তুিম একিট
কেরই বুঝেত পারেব তামার ব ু কান সংখ ািট মেন মেন ধেরেছ (মােঝর িবট অথাৎ 1 তম িবট
িক 0 না 1).
সমাধান: অেনেকই হয়েতা েত ভাবেত পাের আমােক িকছু িবট এর পিজশন িনবাচন করেত হেব,
ধরা যাক [i0 , i1 , . . .] যন সসব িবট স েক িজ াসা করেল তুিম বুেঝ ফলেত পার য কান সংখ া
তামার ব ু মেন মেন ধেরেছ। কীভােব বুঝেত পারেব? মেন কর তুিম এই সব িবট স েক িজ াসা
করেল আর তামার িজ াসার উ র হল [b0 , b1 , . . .]. যিদ দখ য n িট সংখ ার িতিটর জ যিদ
এই উ েরর িল আলাদা আলাদা হয় এর মােন এই উ র দেখই তুিম বেল ফলেত পারেব য
কান সংখ ািট তামার ব ু মেন মেন ধেরেছ। যমন উপেরর উদাহরন 100, 110 এর ে তুিম
যিদ ধু মােঝর িবট স েক িজ াসা কর তাহেল উ েরর িল থম সংখ ার জ [0] আর ি তীয়
সংখ ার জ [1]. অথাৎ আলাদা। তরাং আমরা ধু এই িবট িনেয় করেলই বুেঝ যাব কান
সংখ া তামার ব ু মেন মেন ধেরেছ। িক একটু িচ া করেল বুঝেব এখােন তুিম একটা িবশাল বড়
িজিনস ignore কের িগেয়ছ। আর তাহল তুিম িক চাইেল " থম ে র" উ র এর উপর িভি কের
"ি তীয় " করেত পারেব। অথাৎ আিম িকছু ণ আেগ যা বললাম তােত িক তুিম কান কান িবট
িনেয় করেব তা িক আেগই িনধারণ কের ফেলছ। Dynamically তুিম করছ না। হয়েতা
dynamically করেল তুিম কম ে ই বর কের ফলেত পারেব তামার ব ু কান সংখ া ধেরেছ!
একটু যিদ িচ া কর তাহেলই তুিম এরকম একিট case বর কের ফলেত পারেব। যমন সংখ া িল
যিদ এমন হয়- 000, 001, 110, 100. একটা িবট িজ াসা কের য তুিম 4 টা সংখ া আলাদা করেত
পারবা না এটা একটা বাকাও বুেঝ। তরাং দখা যাক আমরা এমন টা িবট পাই িকনা যই িট
িবট িজ াসা করেল আমরা এই চারিট সংখ া আলাদা করেত পারব। ধরা যাক আমরা থম (msb)
আর মােঝর িবট িনেয় িজ াসা করব। তাহেল িক থম িট সংখ ার ে ই উ েরর িল হেব
[0, 0]. যিদ আমরা থম আর শষ িবট িনেয় িজ াসা কির তাহেল শষ টা সংখ ার ে উ েরর
িল পাব [1, 0]. আর যিদ আমরা মােঝর আর শেষর (lsb) িবট িনেয় িজ াসা কির তাহেল থম
আর শষ ই সংখ ার ে ই পাব [0, 0]. এর মােন কােনাই লাভ হে না। আমােদর িতনিট
করেতই হে । িক আমরা যিদ থম ে র উ েরর উপর িভি কের যিদ ি তীয় কির তাহেল
িক আমরা মা িট কেরই বর কের ফলেত পারব। ধরা যাক আমরা থম িবট (msb) িনেয়
করলাম উ র 0 হেত পাের আবার 1 ও হেত পাের। যিদ উ র 0 হয় এর মােন তামার ব ু হয়
000 নাহয় 001 ধেরেছ। আমরা যিদ এই ে শেষর িবট িনেয় িজ াসা কির তাহেলই বুেঝ যাব
য 000 নািক 001 উ র। িক যিদ আমােদর থম ে র উ র 1 হয় এর মােন তামার ব ু হয়
110 নাহয় 100 ধেরেছ। এই ে আমরা মােঝর িবট িনেয় িজ াসা করব। তাহেলই আমরা বুেঝ
যাব তামার ব ু িক ধেরেছ। এর মােন আসেল আমােদর এই সম া এেতা সহেজ সমাধান হেব না।
আমােদর ক একিট একিট কের করেত হেব আর সই ে র উ র িক তার উপর িভি কের
পেরর করেত হেব।
তাহেল এিট কীভােব সমাধান করবা? একটা উপায় হল তুিম একিট bitmask এ িলেখ রাখবা
এখনও কান কান সংখ া valid, অথাৎ তামার ব ু কান কান সংখ া মেন মেন ধরেত পাের। তুিম
একিট কের করবা। আর সই ে র উপর িভি কের তামার এই valid সংখ ার সট ই ভােগ
ভাগ হেয় যােব। এই ই ভােগ আবার DP চািলেয় দখবা য কান ভােগ বিশ করেত হেব।
এরকম িতিট িবট িনেয় িনেয় try করেলই হেব। িক সম া হল এই ে mask এর সাইজ 2n
যা অেনক বিশ। িক আমােদর m িক বশ ছাট মা 11. আমরা িক 2m জাতীয় িকছু করেত
পাির? আমরা 2m এ চাইেল mark করেত পাির য কান কান িবট স েক আমরা িজ াসা করব।
১১৮
িক তাহেলই তা যেথ হেব না। কারণ এই সব িবেটর ে র উ র িবিভ হেত পাের আর তার
উপর িভি কের আমােদর eligible valid number এর সট আলাদা আলাদা হেত পাের। তাহেল
আমরা এক কাজ করেত পাির আর তাহল সসব ে র উ র িক িক তারও একটা mask রাখেত
পাির (ধরা যাক কান কান কেরিছ সটা হল mask1 আর উ র িল mask2, যসব করা
হয় নাই সসেব 0 বা 1 যেকােনািটই থাকেত পাের, আমরা আমােদর িবধার জ 0 রাখব)। এর
মােন আমােদর state হেব 2m × 2m অথাৎ আমরা কান কান িবট িনেয় কেরিছ এবং সসব
ে র উ র িক িছল। িতবার আমরা নতুন একিট িবট িনবাচন করব আর সই িবট িনেয় িজ াসা
করব। উ র 0 বা 1 হেত পাের। িতিটর জ আমরা DP কল করব। যিদ দিখ য এই পযােয় এেস
mask1 িল কের উ র mask2 হেয়েছ এরকম সংখ ার পিরমান কবল একিট এর মােন আর
আমােদর করেত হেব না। এভােব DP করেলই হেব। অথাৎ মেন কর আমরা এখন DP(mask1,
mask2) ত এেসিছ। থেমই দখেত হেব এখন valid উ েরর সেট কত িল সংখ া আেছ (n এর
একিট লুপ চািলেয় চক করব য িতিট সংখ ােক mask1 িদেয় and করেল mask2 আেস িকনা)।
যিদ মা একিট সংখ া থােক এর মােন আমােদর আর করার দরকার নই (0 িরটান কের দাও)।
আর যিদ দখ একািধক আেছ এর মােন আমােদর করেত হেব। কান িবট স েক করব
তার একিট লুপ চালাব (i এর একিট লুপ 0 হেত m-1 পয )। এর উ র 0 হেত পাের বা 1 ও হেত
পাের। 0 এর ে আমােদর কল করেত হেব DP(mask1 | (1<<i), mask2) আর 1 এর ে
আমরা কল করব DP(mask1 | (1<<i), mask2 | (1<<i)). এর পর এেদর ভতের যিট বিশ
তার সােথ এক যাগ করেল (এখন য i তম িবট িনেয় করেল তার জ 1) তুিম পােব i তম িবট
িনেয় করেল এিট সহ আর সেবা কতিট করেত হয় তার পিরমান। এভােব িতিট i এর জ
আমরা যসব উ র পাব তােদর ভতর হেত যার জ তুিম সবেচেয় কম পােব সিটই হেব তামার
DP(mask1, mask2) এর উ র। ( )
আপাত দৃি েত তামার complexity O 2m × 2m × (n + m) কারণ িতিট state এর
ভতের তামােক একিট n আর আেরকিট m এর লুপ চালােত হে । তামরা চাইেল েতই একিট
precompute কের রেখ এখান থেক n সিরেয় ফলেত পার। আমরা n এর লুপ চািলেয় বর করিছ
য mask1 ে র জ কত িলর ে উ র mask2. আমরা যা করেত পাির তাহল DP চালানর
আেগই 2m × n একিট লুপ চািলেয় 2m × 2m সাইেজর একিট টিবল precompute কের রাখেত
পাির য mask1 ে র জ( mask2 উ র) কত িল সংখ ার জ । এেত কের আমােদর time
complexity কেম হেব O 2m × 2m × m .
( )
এখােন একটা িজিনস, যিদও আিম বললাম য আমােদর time complexity O 2m ×2m ×m
( m )
িক আসেল আমােদর complexity O 3 × m . কন? কারণ খয়াল কর, িতিট ে র জ
আসেল আমরা 3 িট ট রাখিছ। একিট হল " কির িন", আেরকিট হল " কেরিছ এবং 0 উ র"
আর সবেশষিট হল " কেরিছ এবং 1 উ র"। যেহতু আমােদর কােছ মাট m িট আেছ সেহতু
আমােদর state হল 3m িট, 2m × 2m না। যিদও আমরা 2m × 2m মমির ব বহার করিছ। তামরা
চাইেল 3m মমিরও ব বহার করেত পার। এে ে িট bitmask না রেখ একিট bitmask রাখেত
হেব িক সিট হেব 3 base এর। আেগ তা 0 আর 1 িদেয় বুঝাি লাম য কেরিছ িক কের নাই
বা ে র উ র িক 0 না 1. 3 base এর ে আমরা যটা করব তাহল 0 িদেয় বুঝাব কির
নাই, 1 িদেয় বুঝাব কেরিছ িক ে র উ র 0 আর 2 িদেয় বুঝাব কেরিছ িক ে র উ র
হল 1. বা চাইেল তামরা তামােদর ই া মত state define কের িনেত পার।
১১৯
উপরও আেরকটা িলিমট আেছ অথাৎ তুিম কােনা এক সমেয় এর বিশ সংখ ক শয়ার রাখেত পারবা
না এবং এই িলিমট সেবা 8 হেত পাের। তামােক িতিট শয়ার এর িতিদন এর দাম দওয়া
আেছ। তুিম এক িদেন খুব জাড় একিট শয়ার িকনেত পারেব বা একিট শয়ার বচেত পারেব, একই
সােথ িকনেত ও বচেত পারেব না বা একািধক কনা বচাও করেত পারেব না। বলেত হেব তুিম সকল
শত মেন কনা বচা করেল কত লাভ হেব। এছাড়াও বলেত হেব তুিম কীভােব শয়ার কনা বচা
করেব।
সমাধান: DP টা বশ সহজ। তুিম একিদন একিদন কের আগােব আর সই িদন তুিম িকছু িকনেব
নাহয় বচেব নাহয় িকছুই করেব না। তরাং তামােক িট িজিনস মেন রাখেত হেব (state). এক-
তুিম এখন কত তম িদেন আছ, ই- তামার কােছ এখন কান শয়ার কয়িট কের আেছ। তুিম যিদ
এই িট িজিনস মেন রাখেত পার তাহেল তা DP করা কােনা ব াপারই না। কথা হল কান িজিনস
কয়টা কের আেছ সটা state কের রাখেল িক খুউউউব বড় state হেয় যায় না? এখােন আমােদর 8
রকেমর শয়ার থাকেত পাের আর 8 রকেমর শয়ার এর িতিট 9 রকম ভােব থাকেত পাের ( যমন
কােনা একিট শয়ার 0 িট, 1 িট এরকম কের সেবা 8 িট থাকেত পাের)। তরাং আমােদর state
এর সাইজ হয় 98 = 43 × 106 আর এর সােথ ন হেব িদেনর সংখ া 100 অথাৎ 4 × 109 এর
মত। এর িভতের আবার আমরা কান শয়ার বচব বা কান শয়ার িকনব তার একিট লুপ চালাব।
তরাং আমােদর time complexity হেয় যাে 8 × 4 × 109 . অেনক বড়! এেক তা সমেয় আটেব
না, ই এ এেতা বড় state মমিরেত ধরেব না।
িক করা যায়? একটা িজিনস খয়াল কর আমরা য ধেরিছ য আমােদর কােছ এখন কান কান
শয়ার আেছ তা 98 রকম হেত পাের এটা িক একটা overestimate. কারণ মেন কর থম শয়ার
তামার কােছ 8 টা আেছ, তাহেল িক পেরর আর কােনা শয়ার তুিম িকনেত পারেব না। এখন
হল এটা কত বড় overestimate? তামরা চাইেল একিট backtrack কাড িলেখ দখেত পার য
আসেল কত িল valid state আেছ, অথাৎ তুিম খুব জাড় 8 ধরেনর শয়ার িকনেত পারবা আর
মাট 8 টার বিশ শয়ার িকনেত পারেব না। তাহেল কত িল িভ িভ valid state হেত পাের।
অথবা চাইেল তুিম mathematically ও বর করেত পার। এখােন আমােদর হল 8 ধরেনর
িজিনসেক 8 িট বাে মাট কত ভােব আমরা distribute করেত পাির। এটা combinatorics এ
খুবই common সম া। 8 িট িজিনসেক 8 িট 1 মেন কর, আর 8 িট বাে র জ 7 িট 0 ক না
কর। এবার এই 8 + 7 = 15 িট িজিনসেক permute কর। হেত থম 0 পয যত িল 1
আেছ স িল থাকেব থম বাে , থম 0 হেত ি তীয় 0 এর মােঝর 1 থাকেব ি তীয় বাে , এরকম
কের শষ (স ম) 0 এর শেষ যা থাকেব তা থাকেব শষ (অ ম) বাে । তার মােন আমরা যিদ বর
করেত পাির এই 15 িট িডিজট কত ভােব permute করা যায় তাহেলই আমরা পেয় যাব কত ধরেনর
state থাকেব। 15িট িডিজট যার 8 িট 1 আর 7 িট 0 এেদরেক মাট 7!8!
15!
= 6435 ভােব permute
করা যায়। এটা িঠক য আমরা এখােন িকছু িজিনস ধির নাই যমন- 7 িট িজিনসেক 8 িট বাে বা
7 িট িজিনসেক 7 িট বাে বা ইত ািদ। িক এটু বুঝা যাে য আমােদর মাট state এর সংখ া
আসেল 98 এর মত ভয় র বড় হেব না। কারণ দখ যিদ আমােদর 8 িটর কম ধরেনর শয়ার থােক
তাহেল আমরা চাইেলই নতুন শয়ার সৃি করেত পাির যার িলিমট হেব 0 বা যার দাম িতিদন 0 টাকা
হেব। তাহেলই হেব। বািক থাকল তুিম তা কােনা এক মুহূেত 8 িট শয়ার না রেখ 7 িট শয়ারও
রাখেত পার বা 6 িট বা এরকম আর িক। সে ে মেন কর তামার কােছ 8 িট না, মাট 9 িট বা
আেছ। আর তুিম শষ বা ধের ফেল িদেব। তাহেলই তা 0 . . . 8 যেকােনা পিরমান বলেক 8 িট
বাে কত ভােব রাখা যায় তা বর হেয় যােব তাই না? এর পিরমান কত? 8!8!16!
= 12870. তরাং
আমােদর valid state আসেল বিশ না।
তাহেল আমরা কাড করব কীভােব? যিদ memory সম া না হত তাহেল আমরা চাইেল 98
রকম কের state represent করেত পারতাম। এেত TLE খাবা না িক MLE খেয় যেত পার।
তাহেল িক করা যায়?
একিট উপায় হল state ক save কের রাখার জ আমরা য array ব বহার কের থািক তা না
কের একিট map ব বহার করেত পার। অথাৎ তুিম DP এর িভতের ঢুেক map চক কের দখবা
য তুিম এই state এ আেগ এেসছ িকনা আসেল উ র িরটান কের দাও। আর না আসেল উ র বর
হেয় গেল তা map এ রেখ দাও পের কােজ লাগেব এই ভেব। কান শয়ার কয়িট কের আেছ
সিট কােশর জ তামরা চাইেল 9 base এর সংখ া ব বহার করেত পার। আবার চাইেল একিট
১২০
vector ব বহার করেত পার। কারণ তুিম তা map ই ব বহার করছ, তরাং vector ক map
কের রাখেত কােডর িদক থেক কােনা সম া হেব না। যিদও হয়েতা একিট 9 base সংখ া রাখা
cost efficient. আবার cost efficient নাও হেত পাের, কারণ তামােক 9 base এর না ার থেক
ন ভাগ mod কের বুঝেত হেব কান শয়ার কয়টা আেছ ইত ািদ, যা হয়েতা costly হেত পাের।
তামােক একটু experiment কের দখেত হেব আর িক। 9 base এর না ার মােন তা বুঝছ? এর
আেগ যরকম 3 base এর না ার ব বহার কেরিছলাম িঠক সরকম।
১২১
ন ান আেস যিটর খরচ িত সেকে ড অেনক কের বােড়। আবার মেন কর এরকম একিট জায়গা
ডােনও আেছ। তাহেল তামার উিচত হেব তুিম বােম িগেয় ঐ বিশ খরেচর জায়গা কাভার কের ঘুের
ডােন এেস আবার বিশ খরেচর জায়গা কাভার করা, এরপর বািকটু কাভার করা যােব। এখােন
খয়াল কর আমরা িক বােমর বিশ খরেচর জায়গা পার কের পেরর ন জায়গা িলেত যাই নাই।
এবং একবাের বাম/ডান িগেয় পের একবাের ডান/বাম যাওয়ার থেক এভােব যাওয়া অব ই ভাল।
তাহেল একটু িচ া কের দখ তা আমােদর optimal উ র এর রা া দখেত কমন হেব? Zig-Zag
তাই না? অথাৎ থেম িকছু দূর বােম, এরপর িকছু দূর ডােন, এর পর িকছু দূর বােম, আবার িকছু
দূর ডােন এরকম কের। িক এটা কীভােব DP এর state আকাের িলখেব? বা DP design করেব
কীভােব? আমােদর মেন রাখেত হেব য আমরা বাম িদেক কত দূর ইতমেধ ই কাভার কেরিছ আর
ডান িদেক কত দূর। এই ই মাথা রাখেত হেব। িক আমরা কাথায় আিছ? খয়াল কর আমরা িক
বলেতই পাির আমরা হয় বাম মাথায় আিছ নাহয় ডান মাথায়। মােঝ থেক িক লাভ নই। আমরা
যখন বাম মাথায় আেছ তখন চাইেল আরও বােম যেত পাির। অথবা ডান িদেক যতদূর কাভার হেয়েছ
তার থেকও বিশ দূর যেত পাির। অথাৎ আমােদর state হেব i, j, k যখােন i হল বােমর মাথা,
j হল ডােনর মাথা আর k এর মান 0 মােন আমরা বােম আিছ আর 1 মােন ডােন আিছ। এই state
হেত আমরা i − 1, j, 0 ত যেত পাির আবার চাইেল i, j + 1, 1 এও যেত পাির। এভােব আমরা
পুেরা সম া সমাধান করেত পাির।
অথাৎ আমােদর DP ফাংশেনর parameter হল i, j, k. এর মােন- আমরা i হেত j কাভার
কেরিছ এবং k এর মান অ সাের আমরা হয় i এ আিছ অথবা j ত আিছ। এখন হল আমরা বািক
কাভার করা হয় নায় এরকম জায়গা িল কত কম খরেচ কাভার করেত পারব। আেগই বেলিছ আমরা
এই state হেত i, j + 1, 1 আর i − 1, j, 0 এই ই state এ যাবার চ া করব। ধরা যাক আমরা
i, j + 1, 1 এর জ DP কল করলাম এবং তা হেত DP িরটান হল। এখােন খয়াল কর কােনা এক
ন ােনর খরচ িক কান সমেয় সখােন িগেয়ছ তার উপর িনভর কের। অথাৎ আমােদর state এর
আেরকটা parameter লাগেব- সময়। িক তা করেল তা state অেনক বিশ হেয় যােব। আর িক
উপায় আেছ? উপায় হল, খয়াল কর, মেন কর আমরা i হেত a ত যাি । আর ইতমেধ ই i হেত
j কাভার হেয় িগেয়েছ। বািক যারা আেছ তােদর খরচ িত সেকে ড কত কের বােড় তা আমােদর
জানা আেছ। আমরা যা করব তাহল i হেত a ত যেত যই সময় লােগ সই সমেয় এসব ন ােনর
খরচ কত বাড়েব সটা িহসাব কের ফলব। তাহেল খয়াল কর কােনা ন ােন গেল তার খরচ আর
variable না, বরং fixed. এর খরচ যত বেড়েছ তা ইতমেধ ই িহসাব কের ফলা হেয়েছ। তরাং
আমােদর আর কােনা ঝােমলা বািক নই। আমরা িত DP ত DP কল করব আর যই ান িল
বািক আেছ তােদর খরচ কত বাড়ল তা িহসাব কের ফলব। একটা ছাট উদাহরন দই। মেন কর
আমরা i = 1 হেত a = 3 এ যাি , আর আমােদর j = 2. 1 হেত 3 এ যেত মেন কর সময় লােগ x.
এখন আমােদর দখেত হেব x সমেয় বািক ন ান িলর খরচ কত বােড়। সই পিরমাণটাই আমরা
যাগ কের ফলব। ফেল সমেয়র সােথ সােথ কােনা ন ােনর খরচ যা বােড় তা িত transition
এই াে ডল হেয় যায়।
১২২
বড় সংখ া বানােনা যায়। িক এখােন িকছু details বািক আেছ। যমন আমরা বাম হেত ডােন অংক
বিসেয় বিসেয় সংখ া তির করব নািক ডান হেত বােম বিসেয় বিসেয়, আমরা যই সংখ া তির করব
তা সবেচেয় বড় বানাব কীভােব ইত ািদ। ধীের ধীের আগােনা যাক।
এখােন clash of interest আেছ। মােন, মেন কর আমরা যিদ বাম হেত ডােন সংখ া তির
করতাম তাহেল িক সংখ ার mod কত হেব তা বর করা সহজ । আেগর mod যিদ a হয় তাহেল
নতুন mod হেব 10a + d (mod m) যখােন d হল তুিম এখন যই িডিজট বসােল তা। িক তুিম
যিদ ডান হেত বােম যাও তাহেল এিট একটু জিটল। মেন কর আমােদর একিট সংখ া আেছ এবং আমরা
এর বােম একিট িডিজট বসাি । ধরা যাক আমােদর ডােনর সংখ ার mod a এবং তার length b
আর তুিম বােম যই নতুন িডিজট বসা তাহল d. তাহেল আমােদর নতুন mod হেব d10b + a
(mod m). একটু জিটল। ধু জিটল না আসেল এভােব করেল dp এর state বেড় যােব। খয়াল
কর, আমরা কান িডিজট d বসাব তার একটা লুপ চালাি । আবার a আর m িক dp এর state এ
থাকেব বেলিছলাম। িক আমােদর তা b ও দরকার। তাহেল b কও state এ রাখেত হেব। যেহতু
n এর মান সেবা 100 আর 1 বানােত আমােদর সবেচেয় কম 2 িট কািঠর দরকার হয় তাই আসেল
b এর সেবা মান 100/2 = 50 (অথাৎ 50 িট 1). তরাং আমরা যিদ ডান হেত বােম যাই তাহেল
আমােদর একিট অিতির প ারািমটােরর েয়াজন হেব। যিদও সই প ারািমটােরর সেবা মান খুব
একটা বড় না।
আমরা িক এটা preliminary িচ া ভাবনা করলাম। আমরা এখনও সবিকছু ফাইনাল কির নাই।
ধু মা এটা দখলাম য আমরা বাম থেক ডােন গেল িক হয় আবার ডান থেক বােম গেল িক
হয়। এছাড়াও আমােদর আেরকটা িবষয় মাথায় রাখেত হেব য আমরা আমােদর শষ উ রটা বড়
করেত চাই।
আমরা থেম দিখ বাম হেত ডােন গেল িক হয়। অথাৎ আমরা বাম হেত এেক এেক িডিজট
বসাি । ধরা যাক বতমান mod a, আর আমােদর n িট কািঠ বািক আেছ- এই িট হল state. আর
আমােদর DP এর value হেব বািক n িট কািঠ ব বহার কের (সব য ব বহার করেত হেব এমন কথা
নই) এর ডােন সবেচেয় কত বড় সংখ া তির করা যায় যন পুেরা স ািট m ারা ভাগ যায়। আমরা
িতিট state এ d এর একিট লুপ চালাব। d বসােল আমােদর নতুন mod হেব 10a+d (mod m).
এবার এিট ব বহার কের আর n হেত d ত ব ব ত কািঠ িল বাদ িদেয় আমরা recursive ভােব
DP কল করব। আর আমােদর base case হেব যখন আমােদর state এর mod এর মান 0 বা
আমােদর কােছ থাকা n িদেয় যখন আর কািঠ বানােনা স ব না। এরকম কের আমরা িতিট d এর
জ চ া করব এবং দখব সবেচেয় কত বড় সংখ া আমরা ডােন বসােত পাির।
এখন এই DP ব বহার কের আমরা path printing এর মত কের সবেচেয় বড় সংখ া ি ট
করেত পাির। থমত খয়াল কর আমােদর বােমর সংখ া শূ হওয়া যােব না। তাই আমরা 1 হেত 9
এর লুপ চালাব এবং DP ক বলব য আমরা এই সংখ া বিসেয়িছ, আমােদর বতমান mod এেতা,
এখন বল আমােদর ডােন সবেচেয় বড় কত লংেথর সংখ া বসান যায়? 1 হেত 9 এর যিট বসােল
সবেচেয় বিশ সংখ ক অংক বসান যায় আমরা সই অংকিট বসাব, যিদ একািধেকর জ সবেচেয়
বিশ সংখ ক অংক বসান যায় তাহেল আমরা তােদর মধ হেত সবেচেয় বড় অংক বসাব। এরপর
হেত আমরা 0 হেত 9 এর জ চ া করব। অথাৎ এেদর িতিট বিসেয় বর করব আমােদর বতমান
mod কত, আর কয়িট কািঠ বািক আেছ। তার উপর িভি কের আমরা DP কল করব।
যিদ আমরা ডান হেত বােম DP করেত চাই তাহেল আমােদর state হেব আমােদর ডান িদেকর
লংথ কত, ডান িদেকর সংখ ার mod কত আর কয়িট কািঠ বািক আেছ- এখন বল বাম িদেক সেবা
আর কত িল অংক বসান যােব। িক এেত একটা সম া আেছ। এরকম DP এর ে path
printing একটু সম া। যিদ যেকােনা path চাইত তাহেল হয়েতা সম া িছল না, িক সবেচেয়
বড় সংখ া চেয়ই একটু কিঠন কের ফেলেছ। এভােব িচ া কর, আমরা ডান হেত বােম সংখ া বসাি ।
মেন কর ডােন 7 বসালাম এরপর DP ত দখলাম য বােম আর 3 িট সংখ া বসান যােব। আবার
মেন কর 5 বসােলও DP বলেছ য আর 3 িট বসােত পারব। িক আমরা তা জািন না কানটা বসােল
ভাল হেব। আমরা যিদ ডান হেত বােম আসতাম তাহেল ব াপারটা সহজ হত, তাই না? এই জ
এই সম ার ে ডান হেত বােম DP করা সম া। অস ব িক না। আমরা যিদ DP এর return
মান িহসােব বােম কত বড় লংেথর সংখ া বসান যায় তা না রেখ, বােম কত বড় সংখ া অথাৎ পুেরা
সংখ াটাই রািখ তাহেলই হেব। িক এে ে আমােদর bigint ব বহার করেত হেব কারণ আমােদর
উ র তা 50 লংেথর হেত পাের।
১২৩
তরাং আমােদর যিদ সবেচেয় বড় বা ছাট path ( লংেথ না, lexicographically বা numerically)
ি ট করেত বেল তাহেল একটু সাবধান হেয় DP িডজাইন করেত হেব।
সমাধান: সম াটা বশ কমন। আমরা সম াটা একটু সহজ কির। মেন কর আমরা জািন য সবসময়
clockwise যােব। তাহেল আমােদর সমাধান িক হেব? এটার সমাধান আমরা িশখব। তাহেল তুিম
মূল সম ার সমাধান িনেজরাই করেত পারেব।
এই সমাধােনর জ তামােক থেমই দখেত হেব য দ N িট ি ং এর মােঝ এমন কউ
আেছ িকনা য অ কারও ভতের substring আকাের আেছ। থাকেল ছাটটােক ধের ফেল িদেত
হেব। কারণ আমােদর উ ের যিদ বড়টা থােক তাহেল তা ছাটটা এমিন এমিনই থাকেব তাই না?
আমরা যিদ এই ছাটেদরেক সিরেয় না ফিল তাহেল আমােদর সমাধােন সম া হেব। এখন আরও
মেন কর এমন কােনা ি ং নই যটা পুরা circle ঘুের আেস। আমরা পের দখব এই assumption
না থাকেলও আমােদর সমাধান কীভােব কাজ কের। তার মােন আমােদর optimal উ র হেব এরকম-
থেম একিট ি ং থাকেব S1 , তােক যতদূর স ব overlap কের এরপর থাকেব S2 , এেক যতদূর
স ব overlap কের থাকেব S3 এরকম কের সবেশেষ থাকেব SN . এই SN আবার ঘুের িগেয়
S1 এর সােথ সবেচেয় বিশ দূর overlap কের থাকেব। খয়াল কর যখন আমরা S3 বসাি তখন
আমরা িক ধু S2 িনেয়ই িচ া করিছ, S1 ক পা াই িদি না। কন? কারণ S3 যিদ S1 এর সােথ
overlap কের আর এেদর মােঝ যিদ S2 থােক, এর মােন S2 পুেরাপুির S3 এর ভতের আেছ। িক
এরকম ি ং তা আমরা েতই সিরেয় ফেলিছ তাই না? তরাং আমােদর state এ যা রাখেত
হেব তাহল এখন পয কান কান ি ং ব বহার কের ফেলিছ আর সবেশেষ কান ি ং ব বহার
করা হেয়েছ। িঠক travelling salesman problem এর মত। তাহেল আমরা িকভােব সমাধান
করব? থেম আমরা যেকােনা একিট ি ং িনেয় করব (TSP ত যরকম যেকােনা একিট
নাড থেক কির)। যেকােনা ি ং থেক করেলই হেব কারণ িতিট ি ংই তা আমােদর
circle এ থাকেব তাই না? তরাং আমরা একিট ি ং িনেয় করলাম (ধরা যাক S1 ). এর পর
আমােদর state হেব সবেশষ কান ি ং ব বহার কেরিছ আর কান কান ি ং এই পয ব বহার
কেরিছ। এরপর আমরা কান ি ং িনব তার উপর লুপ চালাব। দখব য এই ি ং ইেতামেধ ই নওয়া
হেয়েছ িকনা। যিদ নওয়া হেয় থােক তাহেল তা আর এটা নবার ই আেস না। আর যিদ না নয়া
হয় তাহেল এটা নয়ার চ া করব। হল এটা িনেল cost কত হেব? Cost হেব এর আেগর
ি ং এ এই ি ং যতদূর স ব overlap করার পর যটু ি ং বািক থােক যাগ বািক অংেশর DP.
এভােব যসকল ি ং নওয়া বািক আেছ তােদর মােঝ যিট িনেল আমােদর cost সবেচেয় কম হয়
সিটই িনব। এভােব আমরা DP শষ করব। তাহেল এই DP ত আমরা ি ং িল এেকর পর এক
সবেচেয় কম খরেচ জাড়া লািগেয় একটা চইন বািনেয়িছ, এখনও একিট circle বানাই নাই। Circle
বানােনার জ তমন িকছু না আমােদর base case িনেয় একটু িচ া করেত হেব। আমােদর এই
DP এর base case িক? যখন সব ি ং নওয়া হেয় িগেয়েছ। আমরা যিদ একটু িচ া কির তাহেল
বুঝব য সব শষ ি ং একদম র ি ং এর সােথ সবেচেয় বিশ পিরমান overlap কিরেয় িদেত
পারেলই আসেল আমরা আমােদর circle কস া ডল কের ফলেত পারব (হয়েতা এেতা সহজ না,
একটু িচ া ভাবনা কের সিঠক ফমুলা বর করেত হেব, িক মূল আইিডয়া এটাই)। অথাৎ আমােদর
১২৪
এত ণ যই মাট খরচ হেয়েছ তা হেত র আর শেষর ি ং যত খািন( overlap) কের সটু র
cost আমােদর িবেয়াগ করেত হেব। এই DP এর time complexity O n2 2n যিদ আমরা িট
ি ং সবেচেয় বিশ কত খািন কের overlap কের থােক সটু precompute
( ) কের রািখ। ঐ িজিনস
precompute করেত তা বিশ cost নই তাই না? খুব জাড় O n2 L2 যখােন সেবা লংথ
হল L.
তাহেল আমরা সব িল ি ং ব বহার কের সবেচেয় কম লংেথর একিট circle বািনেয় ফললাম।
এবার আসা যাক আমরা য িকছু িজিনস বাদ িদেয়িছলাম সখােন। আমরা ধের িনেয়িছলাম য আমা-
দর এমন কােনা ি ং নই যিট পুেরা circle কাভার কের না। আমরা এই restriction উিঠেয় নই।
একটু িচ া করেল বুঝেব এই কস এমিন এমিনই া ডল হেয় যায়। এটা িক আিম অেনক বড় কথা
বেল ফেলিছ। আশা কির এই কথা তামরা চাখ বুেজ িব াস করেব না। একটু কাগেজ কলেম কের
দখ কন এই কথা সত । ফরমািল এই কথা মাণ করা খুব একটা সহজ কাজ না। আবার িবিভ
কস িদেয়ও য তামােদর ক convince করার চ া করব সটাও খুব একটা সহজ কাজ না। সহজ
কাজ হেব তামােদর উপর ছেড় দওয়া :) তামরা যভােব িচ া করেব তাহল anti case বানােনার
চ া করেব। মেন কর তুিম মেন করেতছ য এরকম case এ তামার এই সমাধান ভুল উ র দেব।
িক যখন দখেব য দয় না তখন িচ া করেব কন দয় না, কীভােব এই সমাধান তামার case
ক া ডল করেছ। এভােব তুিম আসেল বুঝেত পারেব কন এই সমাধান সিঠক। অথবা আেরক কাজ
করেত পার, িতিট ি ংেক ছাট কের ফলেত পার।
বািক থাকল আমরা য ধু clockwise ধেরিছ সটা। এটা া ডল করা খুব একটা কিঠন না।
যটা করেব সটা হল িতটা ি ং এর ই রকম ভােব িনেত পার এক সাজা ভােব আেরকটা উলেটা
কের। তরাং আমােদর bitmask এ N িটই িবট থাকেব কান ি ং নওয়া হেয়েছ কানটা নওয়া
হয় নাই তা বুঝানর জ । ওিদেক আেরকটা থাকেব যা বলেব সবেশষ কান ি ং িনেয়িছেল সটা
বুঝানর জ । আেরকটা নতুন সংখ া িনেত হেব যটা বলেব য শষ ি ংটা িক সাজা নওয়া হেয়িছল
নািক উলেটা। ব াস!
১২৫
থাকল 5 টা। তরাং আমােদর কােছ আেছ ইটা শলেফর উ তা, ইটা শলেফর স আর বই এর
অ ােরর কান পয বই নওয়া হেয়েছ। িক এই 5 টা িক independent, তরাং এেদরেক আর
এভােব কমান স ব না। একটা কমন টকিনেকর কথা বেলিছলাম। তাহল প ারািমটারেক ভ ালুেত
পাঠােনা। খয়াল কর আমােদর এই DP এর ভ ালু হল 0 বা 1, স ব িক স ব না। আমরা িক কােনা
ভােব উ র বা কােনা একটা প ারািমটারেক ভ ালুেত আনেত পাির না? স ব িক স ব না সটা নাহয়
-1 িদেয় বুঝাব? এরকম হেত পাের- আমরা ইটা শলেফর স জািন (তৃতীয় শলেফর স হল
এই পয নওয়া বই এর স িবেয়াগ এই ইটা শলেফর স ), আর একটা শলেফর উ তা জািন,
আর কান কান বই নওয়া হেয়েছ তাও জািন। ভ ালু ত থাকেব তৃতীয় শলেফর উ তা সবেচেয়
কম কত হেল আমােদর state এর 4 টা প ারািমটারই কাজ করেব। ধু ধু তা তৃতীয় শলেফর
উ তা বািড়েয় লাভ নাই তাই না? আমােদর যত কমােনা যায় ততই লাভ। তরাং এভােব আমরা 4
টা প ারািমটাের নামােত পাির। তাহেল আমােদর complexity দাঁড়ায় 21002 × 70 × 300. এখনও
বশ বিশ। অ ত আরও একিট কমােত হেব। এখন খয়াল কর আমােদর িক চেয়েছ। আমােদর
চেয়েছ মাট ফল। আমরা তা ভ ালু বা প ারািমটার িহসােব একিট উ তা বা একিট এরকম
কের রাখিছ। আমরা িক আমােদর উ র িক চেয়েছ তার িভি েত কােনা optimize করেত পাির?
এই ধাপটাই মেন হয় সবেচেয় কিঠন। উ র বেল িদি - আমরা চাইেল ভ ালু িহসােব একটা শলেফর
উ তা না বরং ইিট শলেফর উ তার যাগফল রাখেত পাির। আর একিট প ারািমটার ব বহার
করেত পাির এটা বলেত য এখােন কয়টা শলেফর উ তা আেছ, একটা না ইটা। তরাং আমােদর
state হেব 21002 × 70 × 2 আর ভ ালুেত থাকেব ইিট (বা একিট) শলেফর উ তার যাগফল।
িনঃসে েহ এটা খুব একটা সহজ observation না। িক এটা একটা িবশাল িশ া!
সমাধান: বলার অেপ া রােখ না য সম াটা খুব একটা সহজ নয়। খুব naive ভােব িচ া করেল
state হেব আমরা এখন কান পাহােড় আিছ, আর বতমান পাহােড়র modified height কত। তাহেল
আমরা কােনা একিট state এ এেস এর পেরর পাহােড়র height কত হেব তার উপর লুপ চালাব
তাহেলই হেব। যেহতু কােনা পাহােড়র height সেবা 109 হেত পাের সেহতু এটা একটা ব াপক
costly সমাধান। কী করা যায়?
একটু িচ া করেলই বুঝা যায় য- সব height আমােদর জ important না। িক কান কান
height আমােদর জ important তাও বুঝেত পারা খুব একটা সহজ না। মেন কর i < j. যিদ
hj > hi + d ∗ (j − i) হয় বা hj < hi − d ∗ (j − i) হয় এর মােন i আর j এর মােঝর পাহােড়র
উ তা যভােবই রােখা না কন সটা valid arrangement হেব না। কারণ i এর পেরর পাহাড় তার
থেক খুব জাড় d উ তা বিশ হেত পাের, তার পেরর পাহাড় 2d, তার পেরর পাহাড় 3d, এরকম
কের j তম পাহাড় খুব জাড় d ∗ (j − i) উচু হেত পারেব। একই ভােব কত কম উচু হেত পারেব
সটাও বর করা যােব। মূল কথা আমরা যিদ কােনা একিট পাহাড় িফ কির তাহেল এর আেগর বা
পেরর পাহাড় িলর জ bound পাওয়া যােব। সব িল পাহাড়েক তার bound িল মানেত হেব।
এখােন মূল observation হল কােনা একিট কলােম (পাহােড়) যত িল boundary আেছ স িলই
হেলা important height. অথাৎ তুিম িতিট পাহাড়েক িফ মেন কের বর কর য i তম পাহাড়িটর
জ bound িক িক। এই সব bound এর মান িলই হেলা important height. এখােন একটা
িজিনস খয়াল কর, সটা হল- optimal pattern য এই সব height ব বহার না কের হেত পারেব
না- তা না। িক এই সব height ব বহার কের optimal মান পাওয়া যােবই। চাইেল এটা আমরা
১২৬
ফমাল ভােব মাণ করেত পাির। আিম িনেজও িঠক িনি ত না কীভােব এটা মাণ করা স ব। িক
আসেল ািমং কে টে আমরা অেনক িজিনস ফমাল ভােব মাণ কির না। বরং িকছু উদাহরন, (িকছু)
intuition এর উপর িনভর কের আমরা সমাধান কের থািক। তাহেল িতিট পাহােড় আমােদর O n
িট স ব ান থাকেব (আসেল 2n − 1, কারণ িতিট j ত অ সকল i এর জ উপের আর িনেচ
িট কের বাউ ড পাওয়া যায়, আর তাছাড়া ঐ কলােমর initial height তা আেছই)। তরাং আমরা
i তম পাহােড়র িতিট interesting height থেক পেরর( পাহােড়র
) িতিট interesting height
িলেত যাবার চ া করব (d এর িলিমট মেন)। অথাৎ O n3 সমাধান।
( )
চাইেল অব এেক O n2 এ পিরনত করেত পার। মূল আইিডয়া হল, মেন কর তুিম i তম
পাহােড়র j তম interesting height এর জ optimal মান বর কেরছ। এখােন মেন কর i − 1
তম পাহােড়র a হেত b পয interesting height িল হেত আসা যায়। এখন তুিম যিদ i তম
পাহােড়র j + 1 তম interesting height এর জ optimal মান বর করেত চাও তাহেল একবার
িচ া কের দখ তা i − 1 পাহােড়র কান কান interesting height হেত আসেত পারেব? ায়
a হেত b পয interesting height হেত তাই না (a < b)? মেন কর j + 1 তম interesting
height, j তম interesting height অেপ া বড়। এর মােন হয়েতা দখা যােব a ানিট j + 1
তম interesting height হেত d এরও বিশ দূের চেল িগেয়েছ। তরাং আমােদরেক সটা খয়াল
রাখেত হেব এবং েয়াজেন a এর মান বাড়ােত হেব (বাড়ােনা নাও লাগেত পাের, বা একািধকবারও
বাড়ােত হেত পাের)। একই ভােব দখা যােব b + 1 তম interesting height িট আমােদর থেক
d রে চেল এেসেছ। তরাং b এর মানও হয়েতা বাড়ােনার েয়াজন হেত পাের। এভােব আমরা
j +1 এ কই কই থেক আসা যায় সই [a, b] রে র মান আমরা খুব সহেজই বর কের ফলেত পাির।
এভােব এক বাড়ােয় কমােয় [a, b] বর করার কারণ হল এেত কের i তম পাহােড়র সকল interesting
height এর জ এই র linear সমেয় বর কের ফলা যােব ( িতিট linear না, সব িল িমেল
linear. এেক amortized time বেল)। আমরা যখন র জেন ফেলিছ বািক টু করা বশ সহজ।
এখন আমােদর সম া হল- আমরা i তম পাহােড়র j তম interesting height এর জ উ র বর
করিছ, আর i − 1 তম পাহােড়র [a, b] রে র interesting height হেত আমরা এখােন আসেত
পাির। ধরা যাক আমরা k থেক আসিছ (a ≤ k ≤ b), সে ে আমােদর cost হেব- dp[i −
1][k] + ABS(height[i − 1][k] − height[i][j]). এরকম সকল k এর জ আমােদর যসকল
cost পাওয়া যােব, তােদর মাঝ হেত সবেচেয় কমিট আমােদর িনেত হেব। এিট খুব সহেজই RMQ
ব বহার কের করা যায়। মেন করা যাক আমরা [a, b] ক িট ভােগ ভাগ করিছ [a, c], [c + 1, b] যন
height[i][j] ≥ height[i−1][c] এবং height[i][j] ≤ height[i−1][c+1] হয়। তাহেল [a, c]
অংেশর জ cost এর ফমুলা আমরা িলখেত পাির dp[i−1][k]−height[i−1][k]+height[i][j]
আর অ অংেশর জ আমরা িলখেত পাির dp[i − 1][k] + height[i − 1][k] − height[i][j].
খয়াল কর তুিম যখন i তম পাহােড়র j তম interesting height এ দািড়েয় আছ তখন তামােদর
জ শষ term একিট constant. বািক থাকেছ র অংশটু েক minimize করা। আমরা র
িট টামেক এক কের একিট RMQ বানাব এবং আমােদর দরকাির রে ([a, c] বা [c + 1, b])
query করব।
সমাধান: এিটও বশ কিঠন সম া। মেন কর তুিম সকল undirected edge ক মুেছ ফলেল, এর
ফেল সবেচেয় বড় যই chain হয় তার দঘ মেন কর d. তাহেল তামার উ র কমপে d হেবই।
মেন কর আমােদর কােছ একিট ফাংশন আেছ (এিট একিট সংখ া x নয়) যােক আমরা যিদ িজ াসা
কির য undirected edge িলর direction এমন ভােব সট করা স ব িকনা যন সবেচেয় বড়
চইেনর দঘ x এর চেয় বিশ না হয়। এরকম একিট ফাংশন থাকেল আমরা এেক এেক এেক
d, d + 1, d + 2 . . . িনেয় করব। তাহেলই আমরা আমােদর উ র পেয় যাব।
১২৭
এখন আমােদর কাজ হল এই ফাংশন িলখা। আমরা আসেল এই ি এর উপের DP করব।
িতিট নােড ই ধরেনর মান থাকেব, f আর g. ধরা যাক i একিট নাড। আমরা তা i নােডর
িনেচর undirected edge সমুহেক নানা ভােব direction িদেত পাির যন x এর থেক বিশ বড়
chain তির না হয়। এরকম যত ভােব orient করা স ব তার মােঝ কােনা একিটর ে তা i
হেত িনেচ িগেয়েছ এরকম চইেনর দঘ সবেচেয় কম হেব তাই না? মেন কর সই দঘ হল f [i].
একই ভােব i এ উেঠ এেসেছ এরকম চইেনর দঘ সবেচেয় কম g[i]. আমরা দখব এই f আর
g কীভােব বর করব। আমােদর নাড i এর িক িতন ধরেনর child আেছ। ধরা যাক থম ধরেনর
child হল- a. এেদর ে i হেত তােদর িত ইেতামেধ ই একিট directed edge আেছ। ি তীয়
ধরেনর child হল-b. এেদর ে এেদর হেত i এর িদেক ইেতামেধ ই একিট directed edge
আেছ। আর তৃতীয় ধরেনর child হল c. এেদর সােথ i এর undirected edge আেছ। মেন কর a
সমুেহর মােঝ সবেচেয় বড় f এর মান হল f [a]. একই ভােব b সমুেহর মােঝ সবেচেয় বড় g এর মান
হল g[b]. এর মােন আমােদর ইেতামেধ ই f [a] + g[b] দেঘ র চইন তির হেয় িগেয়েছ। তরাং
আমােদর দখেত হেব এিট যন x এর থেক বিশ না হেয় যায়। এখন বািক থােক c নাড িল।
এেদর মােঝ িকছু নােডর ে i হেত িনেচ direction এ edge হেব, আর িকছুর ে উপেরর
direction এ। মেন কর আমরা c ক ই ভােগ ভাগ করলাম cf আর cg. i থেক cf এ edge
থাকেব আর cg থেক i এ থাকেব। এখন মেন কর cf সমুেহর মােঝ সবেচেয় f এর মান বিশ ধরা
যাক f [cf ]. এখন যিদ cg সমুেহর মােঝ যিদ এমন কােনা নাড থােক যার f এর মান f [cf ] এর
থেক কম, তাহেল িক আমরা তােক cg হেত সিরেয় cf এ আনেত পাির। এেত কের িক আমােদর
কােনা চইেনর দঘ িক একটুও বাড়েব না। কারণ এই নতুন আসা নােডর থেকও বড় f আলা
একিট নাড ইিতমেধ ই আমােদর cf এর মােঝ আেছ। তরাং আমরা যটা করেত পাির তাহল, c
এর নাড সমুহেক f এর মান অ যায়ী সট করেত পাির। এর পর একিট লুপ চািলেয় িঠক করেত পাির
য কান টু cf, আর কান টু cg. এটু যিদ িঠক হেয় যায় তাহেল আমরা f [cf ] আর g[cg]
বর কের ফলেত পারব। f [cf ] তা আমরা লুেপর ভতেরই বর কের ফলেত পারব, আর g[cg]
এর মান আমরা নাহয় আেগই উে ািদক হেত লুপ চািলেয় precompute কের রাখব। যাই হাক,
তরাং আমােদর কােছ এখন 4 িট মান আেছ- f [a], g[b], f [cf ], g[cg]. এেদর হেত আমরা থেম
দখব য এরা x এর শত ভ কের িকনা। যিদ না কের তাহেল আমরা এখান থেক optimal f [i]
বর করার চ া করব। একই ভােব i নােডর g এর মান বর করব। এভােব আমরা সকল নােডর
f, g বর করব। এই েসেসর সময় যিদ কখনই x এর শত ভ নাহয়, তার মােন এই x ই আমােদর
উ র।
মজার িজিনস হল, এই সম ার উ র হয় d হেব নাহয় d + 1. সজ আমরা ধু x = d চ া
করেলই বুঝব য উ র িক d নািক d + 1. কন d + 1 এর বিশ লাগেব না তার মাণ আিম জািন
না। হয়েতা তামরা( কাগেজ
) কলেম করেল িনেজেক convince করেত পারেব। এই সমাধােনর time
complexity O n2 .
১২৮
বা িহসােব িচ া না কের, একই রেঙর বা িলেক আমরা প কের ফিল। ফেল আমােদর ইনপুট
বা আমােদর অ াের হেব বাে র েপর। িতিট েপর একিট কের রঙ থাকেব আর বাে র পিরমান
থাকেব।
আমােদর state মেন কর (i, j) অথাৎ আমােদরেক i হেত j তম পেক েসস করেত হেব।
এখন িচ া কর তুিম বাম থেক ডােন আসছ। তামার হােত ইটা অপশন। তুিম বােমর পেক ি ক
করেব। তাহেল i তম পেক ি ক করেল যত cost হেব তা পােব আর (i + 1, j) ক সমাধান করার
জ যই cost হেব সটা। এটাই হল থম অপশেনর cost. ি তীয় অপশন হল ি ক না করা। সই
ে পরবতীেত এই প পেরর একই রেঙর আেরকিট েপর সােথ merge হেব, ধরা যাক সিট
হল k. এখন খয়াল কর i আর k ক merge করেত হেল িক (i + 1, k − 1) এই র েক গােয়ব
করেত হেব। এটু গােয়ব করার cost িক আমরা dp কল করেলই পাব। এখন আমােদর i আর k
প merge হেয় যােব। এই িজিনসটা আমরা dp ত কীভােব করব? খুব একটা কিঠন না, আমরা
(i, j) এর সােথ সােথ আরও একিট parameter রাখব, prev. যটা বলেব আমােদর বতমান প
i এর সােথ i এর বামিদেক থেক আসা কত িল বা merge হেব ( যমন উপের আমরা (k, j) কল
করব সই সােথ তৃতীয় parameter এ বলব য k েপর সােথ i এ থাকা বা িল যাগ হেব)।
তাহেল আমােদর dp এর parameter হল ) j, prev), আর এর ভতের আমরা k এর একিট লুপ
( (i,
চালাব। তরাং আমােদর dp িট হেব O n4 যিদও সব ট visit হেব না।
সমস া: তামার কােছ n িবেটর একিট সংখ া আেছ। তুিম এেক এেক িবট িল একিট নটওয়াক এর
ভতর িদেয় পাঠােব। i তম িবট তুিম পাঠােব i তম সেকে ড। এই িবটিট receiver পােব i + 1 হেত
i + d + 1 তম সেকে ডর যেকােনা সমেয়। যিদ একািধক িবট একই সমেয় পৗছায় তাহেল তােদর
অডার যেকােনা হেত পাের। যিদ receiver তার া িবট িলেক পাওয়ার অডাের সাজায় তাহেল
বেলত হেব কত িল িভ িভ িবট sequence স পেত পাের। n আর d এর মান সেবা 64 হেত
পাের।
১২৯
UVa 1628 Pizza Delivery
সমাধান: এটু তা বুঝা যাে য তুিম zig zag কের যােব। অথাৎ থেম িকছু র বােম, এরপর
িকছু র ডােন এরকম কের তুিম তামার ব ুেদর বাসায় যােব। তরাং তামার state হেব বােম কান
ব ুর বাসায় ইেতামেধ ই িগেয়ছ, ডােন ইেতামেধ ই কান ব ুর বাসায় িগেয়ছ আর এখন তুিম কাথায়
আছ ডােন না বােম। অথাৎ আমােদর ট 2n2 . খয়াল কর, আমরা যিদও কােনা সমেয় আমােদর
রে র ভতের থাকেত পাইর, িক আসেল তা state িহসােব রাখেল costly হয়। এর থেক তুিম
বাম াে বা ডান াে থাকেব এবং এর পর িঠক করেব তুিম কই যােব, বােম পেরর ব ুর বাসায়
যােব নািক ডােন পেরর ব ুর বাসায় যােব।
মেন কর তুিম (lef t, right, side) এ আছ। এরপের তুিম হয় lef t−1 এ যােব অথবা right+1
এ যােব। এখােন left মােন হল left তম ব ুর বাসা (একই ভােব right). side এর উপর িভি কের
সখােন যেত কত সময় লাগেব তা বর করা স ব। িক সম া হল এেত কের তা আমরা যই
ব ুর বাসায় যাি তার waiting সময় বর হে না। আসেল এই সম ায় যার কােছ যা তার
waiting সময় বর করেল হেব না। বরং এইেয এখন যই সময় লাগেছ সটা িক এখন পয যার
যার বাসায় যাওয়া বািক তােদর সকেলর waiting সমেয় contribute করেছ। যিদ এর পেরর ব ুর
বাসায় যেত সময় লােগ t (বতমান ব ুর বাসা হেত পেরর ব ুর বাসা র ), আর এখনও যিদ k জন
ব ুর বাসায় যাওয়া বািক থােক তাহেল মাট kt waiting সময় contribute হেব। এরপর আমরা
dp কল করব। এভােব সকল contribution যাগ করেল আমরা মাট waiting time পেয় যাব।
৮.১ অ শীলনী
৮.১.১ সম া
Simple
১৩০
Easy
UVa 242 Stamp and Envelope Size UVa 10723 Cyborg Genes
Medium
UVa 1439 Exclusive Access 2 UVa 1375 The best name for your baby
UVa 1632 Alibaba UVa 10641 Barisal Stadium
UVa 1289 Stacking Plates UVa 1443 Garlands
Hard
৮.১.২ িহ ট
UVa 10118: বশ tricky সম া। িতিট stack আর কয়িট কের ক াি ড আেছ এবং এখন ঝুিরেত
কান কান টাইেপর ক াি ড আেছ তা িমেল ট। িক এই ট তা িবশাল! ায় 404 × 205 .
মজার িজিনস হল কান কান ক াি ড এখন ঝুিরেত আেছ তা ট এ রাখার েয়াজন নই। কারণ
তুিম যিদ জান য এখন কান কান ক াি ড stack এ আেছ এর মােন তুিম জান কান কান ক াি ড
ইেতামেধ ই তুিম েসস কেরছ। আর েসস করার সময় তা জাড়া হেলই তুিম পেকেট ঢুিকেয়ছ
তাই না? এর মােন তুিম ধু দখেব কান কান ক াি ড এই মুহূেত odd স কবার েসস হেয়েছ।
স িলই এখন ঝুিরেত পের আেছ। অথাৎ তুিম চাইেল DP ফাংশেনর প ারািমটার িহসােব ঝুিরেত
কান কান ক াি ড আেছ তা পাঠােত পার, িক তা dp এর state িহসােব রাখার কােনা েয়াজন
নই।
UVa 1439: এটা বশ মজার সম া। থমত তুিম এেক ােফ represent কের ফল। িতিট
character এর জ একিট কের নাড থাকেব আর িতিট েসেস যই িট character আেছ
তােদর মােঝ একিট edge িদেয় দাও। তামার সম া তাহেল দাঁড়াল য- িতিট edge ক একিট
direction িদেত হেব যন এখােন কােনা cycle তির না হয় এবং সবেচেয় বড় চইন এর দঘ যন
সবেচেয় কম হয়। এখােন একটা িজিনস খয়াল রাখেত হেব য আমােদর নােডর সংখ া িক মা 15.
আরও একটা িজিনস খয়াল করেত পার তাহল এখােন িক বেল নাই য "যিদ সবসময় deadlock এ
পের তাহেল impossible ি ট কর"। এর মােন উ র সবসময় স ব। কন? উ র িক বশ সহজ
আমরা চাইেল নাড িলেক একটা অডাের রাখেত পাির আর িতিট edge ক আেগর হেত পেরর
িদেক direction দব, অথাৎ topological sort এর মত। মােন আমরা থেম নাড িলেক একটা
অডার দব, ধর L − M − N − . . . এরকম, এর পর যিদ L আর N এর মােঝ কােনা edge থােক
তাহেল দখেব এেদর ক আেগ ক পের আেছ আমােদর অডাের। এে ে L আেগ আর N পের।
তাহেল আমরা L হেত N এর direction এ edge দব। তাহেলই আমােদর ােফ আর সাইেকল
১৩১
থাকেব না। িক আমােদর ল হল chain এর দঘ সবেচেয় কম করা। এই কাজ কীভােব করবা?
মেন কর আমােদর সবেচেয় বড় চইেনর দঘ d. তাহেল আমরা িক এই নাড িলেক d েপ ভাগ
করেত পাির যখােন িতিট েপর মােঝ কােনা edge নই, আর এই েপর অডার অ সাের edge
িলর direction হেব। এর মােন আমােদর সম া দাঁড়াল আমরা আমােদর নাড িলেক সবেচেয়
কম কত িল েপ ভাগ করেত পাির যন এই প িলর িনেজেদর মােঝ কােনা edge না থােক।
কীভােব করবা? খুব একটা কিঠন না। যেহতু আমােদর নাড সংখ া কম সেহতু আমরা নাড সমুেহর
একিট bitmask রাখেত পাির য কান কান নাড িল ইেতামেধ ই নওয়া হেয় গেছ। এরপর এখন
িঠক করেব কান প নেব। এইেয কান প নেব তােক অব ই এখন পয নওয়া হয় নাই তার
submask হেত হেব। এই submask এর ভতের যিদ কােনা edge না থােক তাহেলই কবল
আমরা এই submask িনেত পারব। তাহেল কান কান submask আমরা িনেত পারব তা আেগ
থেকই precompute কের ফিল। িতিট mask এর জ আমরা ইিট for লুপ চািলেয় দখব
এই মাে র ভতের আেছ এরকম নাডেদর ভতের কােনা edge আেছ িকনা। ( যিদ) থােক তার মােন
এই মা invalid আর না থাকেল valid. এই precompute করেত O 2n n2 এর বিশ সময়
লাগেব না। আর ওিদেক আমােদর dp ত সময় লাগেব 3n কারণ আমরা িতিট মাে িগেয় তার
submask িনেয় িনেয় চ া করিছ। কন এটা 2n × 2n নাহেয় 3n হল তা তা আমরা আ িরদম ও
ডটা াকচার বই হেত জেন ফেলিছই।
UVa 1375: এই ধরেনর সম ার ে একিট ি ক হল কােনা ল যিদ হয় A = XY Z তাহেল
এেক পিরবতন কের িলখা A = XT1 , T1 = Y Z অথাৎ কােনা েলর ডান িদেক ইিটর বিশ
character থাকেব না। এই কাজ করেল dp করেত সহজ হেব। আমােদর dp এর state হেব
আমরা এখন কান character এ আিছ (হেত পাের এিট ইনপুেটর কােনা character বা কােনা
temporary character, যমন উপেরর T1 ) আর আমােদর কত লংেথর শ বানােত হেব। িরটান
ভ ালু হেব সই লংেথর lexicographically সবেচেয় ছাট ি ং অথবা empty ি ং যিদ সই
লংেথর কােনা শ বানােনা স ব না হয়। তাহেল তুিম dp এর ভতের িক করেব? থমত দখেব
বতমান character িক ছাট হােতর িকনা (terminal symbol) তাহেল তা একটাই অপশন, 1
লংেথর শ (যিদ ট এর লংথ 1 নাহয় তার মােন কােনা শ বানােনা স ব না)। আর যিদ
terminal symbol না হয় এর মােন আমরা এই symbol ক নানা ভােব expand করেত পাির।
আমরা সকল ভােবই expand করার চ া করব এবং এই সকল চ ার মােঝ lexicographically
সবেচেয় ছাটিট তুিম িরটান করেব। এখন এই য expand করার চ া- সটা িক ভােব করেব?
যেহতু আমােদর সেবা মা িট character থাকেব expansion এ, তরাং এই কাজ বশ
সহজ। আমরা একিট লুপ চািলেয় িঠক করব কত লংথ বাম থেক আসেব, কত লংথ ডান থেক।
১৩২
অধ ায় ৯
Graph Theory
১৩৩
ি ড পিজশন জুেড় থােক তােদর মাক কের দব। সকল বাে র জ মাক করা শষ হেয় গেল
volume বর করা খুবই সহজ। ধু নেত হেব মাট কয়িট তরেলর ঘর আেছ (কীভােব বর করবা
একটু পেরই বলিছ)। বাইেরর পৃে র ফল বর করাও িক বশ সহজ। আমরা িনি ত য 0, 0, 0
বাইেরর তরেলর একিট ঘর। আমরা এই ঘর হেত কের একিট BFS করব যিট সকল unmark
ঘর িদেয় যায়। এর ফেল আমরা সকল তরল এর সল বর কের ফলেত পারব ( মাট আয়তন থেক
এিট িবেয়াগ করেলই আমরা structure এর volume পাব)। এর ফেল িক হেব? এখন আমরা
িতিট ঘের যেত পাির, যিদ এটা তরেলর ঘর হয় তাহেল আমরা এর ডান বাম উপর িনেচ সামেন
িপেছ দখব য কােনা বাে র সল আেছ িকনা। থাকেল আমরা পৃ তেলর খ ফল এক বাড়ােয়
দব। িক সম া হল এটা বশ costly. কারণ আমােদর test case এর পিরমাণ 100 িট। তাহেল
100 বার 500 × 500 × 500 করা একটু সম া। এছাড়াও আমরা েত 50 িট বা িনেয় তা দখল
কের এরকম িতিট ঘর মাক কেরিছ এটা করেতও িক িত কেস 50 বার 5003 কাজ করেত হেব।
কীভােব আমরা এই কাজেক একটু ত করেত পাির? coordinate compression টকিনক।
মেন কর তামার কােছ একিট বা আেছ যার এক কানা (2, 2, 2) এ আর আেরক কানা (5, 5, 5) এ।
আমােদর িক 500 × 500 × 500 ি েডর দরকার নই। খয়াল কর x = 100 ত যা ঘেট x = 200
তও একই িজিনস ঘেট। এখােন interesting coordinate হল x = 2, 5 একই ভােব y, z এও।
অথাৎ যিদও বা িল িবশাল জায়গা জুেড় আেছ িক আমরা ধু মা িট কেয়ক coordinate িনেয়
interested. যেহতু আমােদর মা 50 িট বা আেছ সেহতু আমরা িতিট বাে র বাম আর ডান
িমলােয় মাট 100 িট x coordinate িনেয় interested (একই ভােব y আর z coordinate ও)।
তরাং আমােদর আসেল 5003 সাইেজর ি ড না িনেয় 1003 সাইেজর ি ড িনেয় কাজ করেলই হেব।
িঠক কীভােব এটা কাড করেত হয় সটা তামরা িনেজরাই একটু িচ া করেল বর করেত পারেব।
িজিনসটা কিঠন না। তামরা ইনপুেট দওয়া সকল x, y আর z coordinate িল িল করেব।
এরপর তােদরেক সট কের unique কের নেব। মেন কর x এর িল দখেত এরকমঃ 10, 30,
40. তাহেল তামরা বাে িগেয় coordinate িলেক rename করেব। 10 মােন 1, 30 মােন 2,
40 মােন 3 এরকম। আর ওিদেক িলেখ রাখেব 1 মােন আসেল 10, 2 মােন আসেল 30 ইত ািদ।
এরপর ছাট ি েড তুিম BFS কের সকল তরল বর করেব। আর যখন তুিম volume বা area এর
িহসাব করবা তখন তুিম যই সেলর জ িহসাব করছ তােক real coordinate এ পিরবতন কের
নেব।
১৩৪
UVa 10129 Play on Words
সমস া: তামােক সেবা 100,000 িট ইংেরিজ শ দওয়া থাকেব। তামােক বলেত হেব তুিম
এই সকল শ পাশাপািশ এক লাইেন রাখেত পারবা িকনা যােত পাশাপািশ থাকা িট শে র ে
আেগরটার শষ অ র আর পেররটার র অ র একই হয়।
সমাধান: থমত খয়াল কর কােনা একিট শে র থম আর শষ অ র বােদ বািক অ েরর কােনা
কাজ নই। তরাং আমরা িতিট শ েক িট অ েরর ক না করেত পাির (এক অ েরর হেল িক
করবা তা আশা কির িনেজরা বর করেত পারবা)। এখন আমরা এখান থেক একটা directed াফ
বানাব। ােফর নাড হেব ইংেরিজ ভাষার অ র িল। আর edge হেব িতিট শে র থম অ র
হেত শষ অ র এর িদেক directed edge. এবার িচ া কর তা আমােদর উ র আেছ মােন িক?
মােন হল- একিট নাড হেত আর কের িতিট edge একবার কের traverse কের কােনা একিট
নােড শষ হওয়া। অথাৎ directed ােফ euler path আেছ িকনা সটা িজ াসা করেছ। আর এই
কাজ কীভােব করেত হয় তােতা আমরা া ািমং কে ট বই এ দেখিছ।
১৩৫
সমাধােন আমােদরেক িতিট edge এর উপর লুপ চািলেয় b িঠক করেত হেত পাের। তরাং সই লুপ
হেব 1002 এর, কারণ 100 িট নােডর ােফ ায় 1002 িট edge থাকেত পাের।(এরপর আমােদর
)
বািক edge িলর উপর MST করেত হেব। আর MST এর complexity হল O m log m যিদ
( )
kruskal কর। তরাং আমােদর complexity দাঁড়াে ায় O 1004 log 1002 . এই সম ার
ে এই সমাধানই accepted হয়।
তেব তামরা চাইেল এর থেক একটু ভাল সমাধানও দাঁড় করােত পার। মেন কর তুিম edge
িলেক ছাট হেত বড়েত সট করেল। এরপর তুিম এেক এেক edge িলেক ( ছাট হেত বড় cost
এর েম) আমােদর ােফ insert করার চ া করেব। কােনা একিট edge ক insert করার আেগ
দখেব তার ই মাথা ইেতামেধ ই connected িকনা। যিদ না হয় তাহেল চাখ ব কের এই edge
ক insert কর। আর যিদ ই মাথা ইেতামেধ ই connected হেয় থােক তাহেল মেন কর এই ই
মাথা হল a আর b. তুিম দখ a আর b এর মােঝ যই path সই path এ সবেচেয় কম cost
এর edge কানিট। তুিম তােক graph থেক মুেছ ফল আর তামার নতুন edge ক insert কর।
বতমান edge যিদ insert করা শষ হয় তাহেল দখ এখন ােফ সবেচেয় বড় cost আর সবেচেয়
কম cost এর edge কান কানিট। তােদর উপর িনভর কের তুিম তামার উ র আপেডট কের ফল।
তেব খয়াল রখ তামােদর ােফ যন n − 1 িট edge থােক, তা না হেল াফিট connected হেব
না। আমােদর এই সমাধােন কােনা এক মুহূেত আমােদর ােফ n − 1 িটর বিশ edge থাকেব না।
তরাং n2( িট) edge ক insert করেত গেল তামােক একিট ( BFS
) করেত হেব এবং তার cost
আসেল O n . তাহেল আমােদর মাট complexity হেব O n3 .
১৩৬
িডিজট ব বহার কের 0 ত পৗঁছােত পারব। আর যিদ আমরা কােনা নাড থেক যসকল edge বর
হয় সসকল edge ক ছাট হেত বড় order এ চক কির তাহেলই আমরা lexicographically
ছাট পাথ পেয় যাব।
DP িদেয় য করা যােবই না তা না, তেব সে ে DP ত mod এর পাশাপািশ length এর
আেরকিট প ারািমটার রাখেত হয়, ফেল এর state এর পিরমাণ বেড় যায়।
১৩৭
সােথ তুলনা বা আপেডট না কের আমরা max(d[u], w) িদেয় তুলনা বা আপেডট
( করব।
) তাহেলই
হেয় যােব। এই সমাধােনর complexity হেব dijkstra এর মত অথাৎ O m log n এর মত।
কউ কউ এেক prim এর মতও মেন করেত পার।
আমরা চাইেল একটু সহজ ভােবও সমাধান করেত পারতাম। িকছু ণ আেগ বললাম উপেরর
সমাধানটা িকছুটা prim এর মত। আমরা চাইেল kruskal এর মতও সমাধান দাঁড় করােত পাির।
থেমই edge িলেক তার cost অ যায়ী সট কের ফল। এর পর ছাট হেত বড় েম এেক এেক
edge িলেক নাও। িতটা edge িনবা আর তার ই া েক merge করবা। এরপর দখবা য s
আর t িক connected হেয় গল িকনা। যিদ হেয় যায় তাহেল শষ যই edge ব বহার করলা তার
cost ই হল উ র। আমার মেন হয় priority queue ব বহার কের prim এর মত কাড করার থেক
union find ব বহার কের kruskal এর মত কাড করা তুলনামুলক সহজ।
িক এটা তা বুঝাই যাে য উপেরর িট সমাধান 10,000 query এর জ বার বার করা
স ব না। TLE হেয় যােব। উপায় িক?
এবার আমরা িতনিট সমাধান দখব। থেম এভােব িচ া করেত পার- আমােদর যিদ ব বার
query কের িট নাড এর মােঝ shortest পাথ বর করেত বেল তাহেল িক করব? একিট উপায়
হল আমরা েতই িতিট নাড হেত dijkstra চালােয় িতিট নাড হেত
( অপর সকল
) নােডর
shortest path বর কের রাখব। একবার dijkstra চালােত খরচ হয় O m log n . তাহেল n
( )
বার চালােত খরচ হেব O nm log n . একই ভােব আমরা আমােদর উপেরর modified dijkstra
সমাধানটা েতই n বার চালােল িতিট নাড জাড়ার মােঝর জ উ র বর হেয় যােব।
ি তীয় উপায় হল- আমােদর all pair shortest path বর করার জ একিট িবেশষ algorithm
িছল- floyd warshall. সটােক এই সম ার জ আমরা modify করেত পাির। এটা একটু িচ া
করেলই পারেব। Floyd warshall এর ে আমরা d[u][v] এর সােথ d[u][k] + d[k][v] এর
তুলনা করতাম। এই সম ার ( ে) d[u][v] এর সােথ max(d[u][k], d[k][v]) তুলনা করব। খুবই
সহজ। Complexity হেব O n3 .
তৃতীয় উপায় তুলনামুলক কিঠন। িক আশা কির এই সমাধােনর টকিনক তামােদর অ কােনা
সম ায় কােজ লাগেব। থম িট সমাধােন আমরা উপেরর dijkstra বা prim এর মত সমাধানেক
আপে ড কেরিছ। আমরা িক কােনা ভােব kruskal এর মত সমাধানেক আপে ড করেত পাির?
এই িচ া থেকই এই সমাধান। আেগর মতই আমরা edge এর cost িলেক সট করব। এরপর
এেক এেক ছাট হেত বড় edge িল এেক এেক েসস করব। থেম দখব য বতমান edge
এর ই া ইেতামেধ ই connected িকনা। যিদ হয় তাহেল তা িকছু করার নই। আর যিদ না
হয় তার মােন এই edge এর ই া িট connected component এ আেছ। ধরলাম এই িট
component হল A আর B. তাহেল A ত থাকা নাড এবং B ত থাকা নাড এই িট নােডর
জ উ র হেব বতমান edge এর cost. এই সমাধােনর complexity এবার িহসাব করা যাক।
আমােদর এরকম merge অপােরশন িক n − 1 বার এর বিশ হেব( না )(MST এর িতিট edge
এর জ )। Worst case এ এই merge অপােরশন সময় নেব O n2 (যিদ িট component
এ n/2 এর মত কের নাড(থােক)।) যেহতু আমরা এই কাজ n বার এর মত করব সেহতু আমােদর
মাট complexity হেব O n3 .
( ) ( )
তামরা চাইেল O n log n এ preprocess কের O log n এ িত query উ র করেত
পার। এজ তামােদরেক kruskal এর মত কাজ কের া tree এর উপর Least Common
Ancestor (LCA) টকিনক খাটােত হেব। সংে েপ বিল। Kruskal এর algorithm খািটেয় আমরা
থেমই tree বািনেয় ফলব। এরপর িতিট নাড v এর জ আমরা 2i তম parent বর কের
রাখব। িঠক LCA যভােব করা হয়। পাথক হল, আমরা এখন কবল মা 2i তম parent বর করব
না, বরং িঠক একই ভােব 2i তম parent পয ( পােথর) উপেরর সবেচেয় বড় cost এর edge এর
cost ও বর করব। এরফেল আমরা যভােব O log n এ LCA বর করেত পাির, িঠক একই ভােব
আমরা ি েত িট নােডর মােঝ সবেচেয় বড় cost এর edge এর cost ও বর করেত পাির।
১৩৮
UVa 11671 Sign of a Matrix
সমস া: েত একিট n×n সাইেজর সকল element 0 ওয়ালা একিট ম াি থাকেব (n ≤ 100)।
তুিম এক অপােরশেন কােনা একিট কলাম বা কােনা একিট রা এর সকল element ক এক বাড়ােত
বা কমােত পার। তুিম এক বা একািধক অপােরশন চালােত পার। এখন ইনপুট িহসােব তামােক একিট
n × n সাইেজর ম াি দওয়া থাকেব যার িতিট element হেব 0, + বা -. 0 মােন হল তুিম
সকল অপােরশন চালানর পর ঐ জায়গার সংখ া 0, + মােন হল সকল অপােরশেনর পর ঐ ােনর
সংখ া ধনা ক আর - মােন ঐ জায়গার সংখ া ঋণা ক। বলেত হেব সবেচেয় কম কয়িট অপােরশন
কের তুিম ইনপুেট দওয়া ম াি ে র মত একিট ম াি বানােত পারেব।
সমাধান: ািসকাল একিট সম া। থেম িচ া কের দখ কােনা একিট রা ত িক একে +1 আর
-1 অপােরশেনর কােনা দরকার আেছ? নাই। মেন কর তুিম কােনা একিট রােত 10 বার +1 কেরছ
আর 3 বার -1. এর থেক িক 7 বার +1 করা ভাল না? এরমােন িতিট রা/কলােম আমরা হয়
ধু যাগ করব নাহয় ধু িবেয়াগ করব। এখন িতিট রা আর কলােম একিট কের সংখ া িলিখ ধর
সংখ ািট হেত পাের +10, -5, +4, 0 ইত ািদ। এর মােন তা বুঝছ? ঐ রা বা কলােম +1 বা -1
অপােরশন িল কতবার কের চালােনা হেয়েছ তা। যেহতু ঐ সংখ া আমরা জািন না, আমরা এেদরেক
একিট ভ ািরেয়বল ারা িনেদশ করেত পাির। যমন i তম কলােমর সংখ া Ci আর i তম রা এর সংখ া
Ri . এই ভ ািরেয়বল িলর সােপে আমরা ইনপুট ক কীভােব িলখেত পাির? মেন কর (i, j) একিট
সল। এখােন 0 আেছ। এর মােন Ri + Cj = 0. যিদ সখােন + থােক এর মােন Ri + Cj > 0
আর যিদ - থােক তার মােন Ri + Cj < 0. তাহেল আমােদর সম া দাঁড়াে য- িকছু equation
∑
দওয়া আেছ, বলেত হেব এর সমাধান আেছ িকনা। থাকেল abs(Ri ) + abs(Ci ) এর সবিন
মান কত।
এখন আমরা একটা নতুন টকিনক িশখব। মেন কর আমােদর িকছু equation দওয়া আেছ
di + w[i][j] ≥ dj যখােন di িল হল ভ ািরেয়বল আর w[i][j] হল constant. এরকম মেন কর
d1 . . . dn ভ ািরেয়বল ব বহার কের িকছু inequality দওয়া আেছ। আমােদরেক
∑ বলেত হেব এর
সমাধান আেছ িকনা, থাকেল এমন একিট সমাধান বর করেত হেব যখােন abs(di ) এর মান
সবিন হয়।
খয়াল কর, আমরা যিদ এই নতুন সম া সমাধান করেত পাির তাহেল আমােদর মূল সম াটা
সমাধান হেয় যােব। কীভােব? খুব সহজ, আমরা ধরব d1 = R1 , . . . dn = Rn আর dn+1 =
−C1 . . . d2n = −Cn . তাহেল আমরা এেক এেক আমােদর equation িল দিখ Ri + Cj = 0
ক আমরা িলখেত পাির di − dn+j ≥ 0 এবং di − dn+j ≤ 0 যা di ≥ dj + w[i][j] এর মত
তাই না? অ িল দিখ, Ri + Cj > 0 ক আমরা িলখেত পাির di − dj+n ≥ 1. একই ভােব
তৃতীয় equation কও আমরা আমােদর কাি ত ফেম িলখেত পাির। এর অথ দাঁড়াল আমরা যিদ
আমােদর এই নতুন সম া সমাধান করেত পাির তাহেলই মূল সম া সমাধান হেয় যােব। কথা হল
এই নতুন সম া কীভােব সমাধান করব।
এক কথায় বলা যায় আমােদর এই নতুন সম ােক আমরা shortest path সম ায় কনভাট
করেত পাির। কীভােব? এই কীভােবটা আমার মেন থােক না। আিম কীভােব িচ া কির খয়াল করেত
পার-
মেন কর u হেত v ত w cost এর একিট edge আেছ। ধরা যাক কােনা একিট সাস থেক
এই ােফ তুিম িতিট নােড shortest path বর কেরছ। ঐ সাস হেত u পয shortest path
হল d[u], একই ভােব v পয shortest path d[v]. তাহেল িক d[u] + w[u][v] ≥ d[v] হেব।
কন d[u] + wuv < d[v] হেত পারেব না? কারণ এর মােন হল তুিম যিদ সাস হেত u ত d[u]
cost এ আেসা এর পর u হেত v এর w[u][v] cost এর edge িদেয় v ত যাও তাহেল তামার
cost হেব d[u] + w[u][v] যা equation মাতােবক d[v] হেত কম। তােতা স ব না কারণ d[v]
হল সাস হেত v পয shortest path. তরাং d[u] + w[u][v] ≥ d[v] হেব।
তরাং আমরা যটা করব তাহল, েত ক d[u] + w[u][v] ≥ d[v] equation এর জ u
হেত v ত w[u][v] cost এর একিট directed edge দব। এরপর আমরা একিট সাস নব
এবং তা হেত সকল নােড 0 cost এর edge দব। এরপর আমরা এই সাস হেত সকল নােডর
shortest path বর করব। যেহতু w[u][v] negative হেত পাের সেহতু আমােদরেক bellman
১৩৯
ford অ ালগিরদম চালােত হেব। যিদ দিখ আমােদর ােফ negative cycle আেছ তার মােন এই
সম ার কােনা সমাধান নই। আর যিদ negative cycle না থােক তাহেল এই shortest path
অ
∑ালগিরদম তামােক optimal d[u] এর মান দেব। অথাৎ এমন সব d[u] এর মান দেব যন
abs(d[u]) এর মান যন সবেচেয় ছাট হয়। কন? মাণ জানেত চাইেল তামরা Coreman
এর বই দখেত পার।
সমাধান: খুব একটা কিঠন সম া না। তুিম িতিট নােডর জ িট cost রাখেব। একটু হল
shortest path এর cost ধরা যাক d1 [i] আর আেরকিট হেব second shortest path এর cost
ধরা যাক d2 [i]. এরপর তুিম াভািবক ভােব dijkstra বা যেকােনা shortest path অ ালগিরদম
চািলেয় d2 [N ] বর করেব। েত d1 [1] = 0 হেব। এরপর এেক তুিম priority queue ত ঢুকােব,
অথাৎ কান নাড আর d1 নািক d2 . এরপর আমরা priority queue হেত এেক এেক state তুলব।
এরপর এই নােডর adjacent edge িল দখব। ধরা যাক আমরা এখন যই state এ আিছ তার
cost d আর আমরা এখন যই edge দখিছ তার cost w, আর এই edge এর ওপর মাথা v.
তাহেল আমরা d + w ক d1 [v] আর d2 [v] এর সােথ তুলনা করব। যিদ d + w এর মান d1 [v]
এবং d2 [v] এর থেক কম হয় তাহেল d2 [v] = d1 [v] করব আর d1 [v] = d + w করব। যিদ তা না
হয়, তাহেল দখব d1 [v] < d + w < d2 [v] িকনা। তাহেল d2 [v] = d + w করব। মােন আমরা v
এর second shortest path ক আপেডট করব। এভােব যখন priority queue যখন ফাঁকা হেয়
যােব তখন আমরা d2 [N ] আউটপুট করব। এখােন িকছু details আিম বাদ িদেয়িছ, যমন েত
d1 ও d2 ক infinity িদেয় initialize কের িদেত হেব, কােনা একিট d1 [v] বা d2 [v] আপেডট হেল
তােক priority queue ত ঢুকােত হেব ইত ািদ।
১৪০
LOJ 1221 Travel Company
সমস া: একিট N নােডর (N ≤ 100) directed াফ দওয়া আেছ যােত সেবা 9900 িট edge
থাকেত পাের। িতিট edge এর িট কের weight আেছ। একিট হল income আর আেরকিট হল
expense. তুিম যিদ একিট নাড হেত আর কের িকছু edge ঘুের আবার র নােড ফরত
আেসা এবং তামার যিদ মাট expense যিদ হয় E আর মাট income যিদ হয় I তাহেল profit
ratio হেব I/E. তামােক বলেত হেব এমন একিট সাইেকল পাওয়া স ব িকনা যার profit ratio
এর মােন P অেপ া বড়।
সমস া: তামার কােছ 100 িটর মত device আেছ এবং একিট ঘের 100 িটর মত াগ আেছ।
একিট দাকােন িকছু converter আেছ যা এক ােগর ধরনেক আেরক ােগ কনভাট কের। সব
ধরেনর কনভাটার নই, তেব য েলা আেছ তা অেনক পিরমােণ আেছ। কান িডভাইস এর িকরকম
াগ দরকার তা বলা আেছ। তুিম চাইেল সই িডভাইসেক সই ধরেনর ােগ লাগােত পার অথবা এক
বা একািধক কনভাটার ব বহার কের অ ােগ লাগােত পার। বলেত হেব সেবা কত িল িডভাইস
তুিম একে ােগ লাগােত পারেব।
সমাধান: একিট ােগ একািধক িডভাইস লাগােত পারবা না, সেবা কত িল িডভাইস লাগােনা স ব-
ইত ািদ হল max flow এর িহ ট। Maxflow সম ার ে িকছু কমন টাম হল- "এেতািটর বিশ
ব বহার করেত পারবা না" (capacity), "সেবা কতিট" (maximum flow), আর িজিনস িলর
মােঝ একটা general স ক বজায় থােক, মােন এই সম ার ে খয়াল কর এক ধরেনর কনভা-
টার তুিম একািধক বার একািধক িডভাইেসর জ ব বহার করেত পার- এটা একটা general স ক।
DP সম ার ে সাধারনত এরকম many to many স ক থােক না। যাই হাক এ েলা অব
স এর ব াপার। যত বিশ সম া সমাধান করবা, তামার এই সকল স তত পির ার হেব।
এই সম ার ে া এর িডজাইন কীভােব করবা? কেয়কটা িজিনস পির ার। আমােদর সাস
এর সােথ থাকেব িডভাইস আর িস এর সােথ থাকেব াগ। এই সকল edge এর ক াপািসিট হেব
1. এখন কথা হল িডভাইস, াগ আর কনভাটার এর মােঝ edge িল কীভােব িদবা। থেম খয়াল
কর, িডভাইস আর ােগর মােঝর edge িল িক obvious. যই িডভাইস যই ােগর সােথ
compatible তােদর মােঝ একিট edge িদেত হেব। edge এর capacity আসেল ব াপার না।
তুিম চাইেল 1 িদেত পার আবার infinity ও িদেত পার। কারণ source থেক তা একিট িডভাইেস
একিটর বিশ া আসেব না। এখন কথা হল যিদ িডভাইসিট সরাসির ােগ না িগেয় কনভাটাের
যায়? একিট উপায় হল, যই াগ থেক অ য ােগ কনভাটার আেছ তােদর মােঝ edge দওয়া।
এর মােন হেব, কােনা একিট িডভাইস এই টাইেপর ােগ লািগেয়িছ, এখন এই াগ চাইেল আেরক
ােগ ঢুকান যােব অথবা চাইেল কােরে ট লাগােনা যােব (তাহেল আমােদর হল- সেবা কত িল
িডভাইস কােরে ট লাগােনা যােব)। এই edge এর ক াপািসিট কত হেব? Infinity. কন? কারণ
আমরা তা একই ধরেনর কনভাটার একািধক বার ব বহার করেত পাির তাই না? এই সম ায়
Infinity িহসােব কত মান আমরা ব বহার করেত পাির? যেহতু আমােদর িডভাইস সংখ া 100 িট,
সেহতু কােনা কনভাটার 100 এর বিশ বার ব বহার হেব না। তরাং infinity এর মান 100 এর
বিশ বা সমান হেলই হেব। এই ােফর maxflow ই হেব উ র।
১৪১
UVa 11082 Matrix Decompressing
সমস া: একিট ম াি দওয়া আেছ। ম াি এর সেবা ডাইেমনশন কােনা একিদেক 20 হেত
পাের (অথাৎ 20 × 20 হল সবেচেয় বড় ম াি )। তামােক এই ম াি ে র িতিট রা এবং কলােমর
সংখ ার যাগফল দওয়া আেছ। তামােক ম াি িট ি ট করেত হেব। ম াি এর িত ঘের 1 হেত
20 পয সংখ া বসেত পাের।
সমাধান: এটা য া এর সম া সটা বুঝা ওতটা সহজ না। িক একবার দখেল আশা কির এর পর
থেক এরকম সম া সমাধান করেত পারবা। যেহতু িতিট ঘের কমপে 1 িদেতই হেব সেহতু
আমরা িতিট ঘের 1 িদেয় দই। সই অ সাের আমরা িতিট রা এবং িতিট কলােমর যাগফলেক
adjust কের নই। এখন আসা যাক কীভােব াফ বানাব স িবষেয়। এই সম ার ে আমােদর
সাস এর সােথ রা িলর edge থাকেব আর কলাম িলর সােথ িস এর edge থাকেব। edge
িলর capacity হেব ঐ রা বা কলােমর সংখ া িলর যাগফল। আর িতিট রা থেক িতিট কলােম
edge থাকেব। সই edge এর capacity হেব 19 (কারণ িতিট সেল সেবা 20 থাকেত পাের
আর 1 তা ইেতামেধ ই িদেয় ফেলিছ)। এই ােফ া চালােলই আমােদর উ র পাওয়া যােব।
এখােন িক হে খয়াল কর, িতিট রা এর যই যাগফল তা সাস থেক বর হেয় সই রা এর
িবিভ সেলর ভতর িদেয় িবিভ কলােম যাে । সাস আর রা এর মধ কার capacity এটা িনি ত
করেছ য সই রা এর সংখ া িলর যাগফল যন আমােদর দ যাগফলেক অিত ম না কের।
একই ভােব কলােমর যাগফলও আমরা আমােদর capacity িদেয় বাউ ড করিছ। িতিট রা আর
কলােমর মােঝর 19 capacity এর edge িদেয় আমরা িনি ত করিছ য কােনা ঘের যন 19 এর
বিশ সংখ া না যায়। আর আমরা maxflow চািলেয় িনি ত করিছ যন িতিট সাস- রা edge িল
saturated হয়। খয়াল কর, যিদ এরকম হয় য এমন একিট সাস- রা edge আেছ যা saturated
হয় নায়, তার মােন আমােদর এরকম কােনা ম াি পাওয়া স ব না। তেব এই সম ার ে বলা
আেছ য উ র সবসময় স ব। তরাং এই সম ায় আমােদর এটা চক করার দরকার নই।
১৪২
অথাৎ আমরা a থেক কেরিছলাম a তই শষ কেরিছ। মােন সাইেকল। এরকম এক বা একািধক
সাইেকল গঠন হেব n িট pair িদেয়। যেহতু কােনা (u, u) মাকা pair নাই সেহতু সাইেকল িল
কমপে 2 দেঘ র হেবই। আর যেহতু আমরা "mincost" maxflow করিছ সেহতু এই সাইেকল
িলর cost এর যাগফল সবেচেয় কম হেব।
১৪৩
x ক পািন বানােনার cost. আর বািক থাকল "বাউ ডাির এর কােনা সল পািন হেত পারেব না"। এর
জ আমােদর যা করেত হেব তাহল েতই বাউ ডাির এর সকল পািনর সলেক f খরচ িদেয় ঘােস
পিরনত করেত হেব। এরপর আমরা এই সকল সলেক t এর সােথ infinity cost এর একিট edge
িদেয় দব। আেগই বেলিছ t হল ঘােসর নাড। আর আমরা চাইনা এসকল নাড t হেত িবি হাক।
তাই আমরা বললাম যিদ িবি করেতই হয় তাহেল infinity cost দাও। এর মােনই হল mincut
এ এরা কখনও আলাদা হেব না, তাই না? কারণ এেদর আলাদা না কের s হেত বািক সব নাডেক
আলাদা করা লাভ জনক (অথাৎ সকল নাডেক f খরেচ ঘাস বািনেয় ফলা)।
তাহেল আমােদর সকল নাড আর সকল edge বানােনা শষ। এখন আমােদর কাজ s হেত t ত
া চালােনা। Maxflow এর মানই হেব আমােদর mincut এর মান।
১৪৪
করেল আর c িট edge মন কেরছ। তাহেল তামার cost হেব d × X − c × Y . তামার ল
হল cost ক সেবা করা।
১৪৫
উ র। এিটই negative cycle cancellation algorithm.
১৪৬
আর এই িজিনস union find িদেয় খুব সহেজই করা স ব।
৯.১ অ শীলনী
৯.১.১ সম া
Simple
UVa 1151 Buy or Build UVa 247 Calling Circles
UVa 1658 Admiral UVa 821 Page Hopping
UVa 820 Internet Bandwidth UVa 10305 Ordering Tasks
Easy
UVa 1600 Patrol Robot UVa 658 Its not a Bug, its a feature!
UVa 10651 Pebble Solitaire UVa 12661 Funny Car Racing
UVa 1001 Say Cheese UVa 1660 Cable TV Network
Uva 1025 A spy in the metro UVa 1601 The Morning after Halloween
Medium
UVa 1279 Asteroid Rangers UVa 12549 Sentry Robots
১৪৭
১৪৮
অধ ায় ১০
Adhoc
সমস া: একিট প ানেকক এর াক দওয়া আেছ। ােকর িতিট প ানেকেকর সাইজ দওয়া
আেছ। িট কেকর সাইজ এক হেব না। তুিম এক অপােরশেন ােকর উপেরর িকছু কক িনেয়
তােদর উলিটেয় আবার ােকর উপের রাখেত পারেব। তামার ল হল সবার িনেচ যন সবেচেয়
বড় কক, তার উপর তার থেক ছাট এভােব সবার উপের যন সবেচেয় ছাট কক থােক। তামােক
য সবেচেয় কম অপােরশেন এই কাজ করেত হেব তা না। যেকােনা valid sequence ি ট করেলই
হেব। এই সম ায় সেবা 30 িট কক থাকেত পাের।
সমাধান: খুব সহজ সম া তাই না? থেম দখ সবেচেয় বড় কক কাথায় আেছ? এটা িক সবার
িনেচ আেছ? তাহেল তা এর জ িকছুই করেত হেব না। যিদ সবার উপের থােক তাহেল তােক আমরা
এক অপােরশেন িনেচ আনেত পাির তাই না? আর যিদ মাঝা মািঝ কাথাও থােক? তাহেলও সহজ
তােক এক অপােরশেন আমরা উপের আনেত পাির আর আেরক অপােরশেন একদম িনেচ আনেত
পাির। এভােব আমরা সবেচেয় বড় কক ক িনেচ আনেত পাির। এটা হেয় গেল আমরা এই কেকর
কথা ভুেল যেত পাির। যেহতু কেকর সংখ া খুব কম সেহতু আমােদর এই সমাধােনর complexity
িনেয় ভা ার দরকার নই।
সমস া: n দল আেছ (n ≤ 50). তামােক একিট যেকােনা সাইেজর একিট 3d grid িনেত হেব।
এই ি েডর িতিট সল তামােক কােনা না কােনা দলেক িদেত হেব। শত ইটা। এক- যেকােনা
িট দল অব ই কাথাও না কাথাও পাশাপািশ িট সেল থাকেব। ই- িতিট দেলর সল িল
িনেজেদর ভতের connected হেত হেব। ি েডর সাইজ কত হেব তা তামার ই া। ি েড সেবা
106 িট সল থাকেত পারেব।
সমাধান: এধরেনর সম ার িনিদ কােনা টকিনক নাই। Puzzle এর মত। একিট সমাধান হেত
পাের ই লয়ােরর ি ড বানােনা। িনেচর লয়াের েত ক রােত একিট কের দল থাকেব। আর উপ-
রর লয়াের িতিট কলােম একিট কের দল থাকেব। িনেজেদর লয়াের তা িতিট দল connected.
আবার িতিট দেলর ই লয়াের যই connected জায়গা আেছ তােদর মােঝ connection থা-
কেবই। আবার িত িট দেলর মােঝও connection আেছ। তরাং এই সমাধান একিট সিঠক
সমাধান।
১৪৯
UVa 1152 4 Values whose Sum is 0
সমস া: আমােদর কােছ 4 িট িল আেছ। িতিট িলে n িট কের সংখ া আেছ। n এর মান সেবা
4000 হেত পারেব। বলেত হেব তুিম কত ভােব এই 4 িল হেত 4 িট সংখ া িনবাচন করেত পারেব
( িতিট িল হেত একিট) যন তােদর যাগফল 0 হয়।
সমাধান: খুব একটা কিঠন না। তুিম িচ া কর যিদ 4 টা িল না থেক 2 িট িল থাকত তাহেল
কীভােব সমাধান হত? তুিম থম িল scan করেত। মেন কর x থম িলে র একিট সংখ া।
তাহেল তুিম দখেত য ি তীয় িলে −x আেছ িকনা। তুিম চাইেল map, set, hash ইত ািদ
ব বহার করেত পার। আবার চাইেল তুিম িট(িল েক sort
) কের two pointer মথড খাটােত
( ) পার।
যাই হাক, এেদর যেকােনা িটর সমাধান O n log n এর মত (hash করেল অব O n ).
আমােদর সম ায় চারিট িল আেছ িক তারা খুব ছাট সাইেজর, মা 4000. তাহেল আমরা
( )
থম িট িল হেত একিট িল বানােয় ফলেত পাির O n2 সমেয়। এই িলে থাকেব ঐ িট
( )
িলে র যেকােনা িট element এর যাগফল। অথাৎ এই নতুন িলে র সাইজ হেব O n2 . একই
ভােব শষ িট িল িনেয় আমরা আেরকটা িল বানােত পাির। এরপর তা সহজ। িকছু ণ আেগ
বলা ই িলে র সমাধান আমরা এই ই িলে খাটােত পাির।
১৫০
িকনা। যিদ এ িট কাজই পার তাহেল তা সমাধান হেয় গল। খয়াল কের দখ আমােদর সম া কত
সহজ হেয় গল! 2d একিট সম া 1d ত পিরবতন হেয় িগেয়েছ। আমরা যিদ রা এর জ সমাধান
করেত পাির তাহেল একই সমাধান আমরা কলােমর জ খাটােবা। আর আমার মেন হয় রা এর জ
সমাধান কমন হেব তা তামরা জান, তাই না? Greedy. িকছুটা line sweep এর মতও বলেত
পার। তুিম এেক এেক রা িলেত যােব। থেম থম রা, এরপর ি তীয় রা এরকম কের সকল
রা ত যাবা। মেন কর তুিম এখন একিট রােত আছ। এখন দখ এই রা হেত কান কান নৗকার
র হয়। সসকল রে র শষ মাথা একটা data structure এ রােখা। তরাং বতমােন data
structure এ সই সকল নৗকা আেছ (মােন নৗকার রে র শষ মাথা) যােদরেক তুিম বতমান রা
ত বসােত পার। িক কান নৗকােক বসাবা? যার শষ মাথা সবেচেয় ছাট, অথাৎ যার ভিব েত
বসােত সম া হেত পাের, এরকম নৗকােক তুিম বসাবা। অথাৎ Data structure ক বলবা তামার
কােছ সবেচেয় ছাট সংখ া কত আেছ তােক দাও। এই নৗকােক এই ােন বসাবা। তেব বসােনার
আেগ একবার দেখ নাও এর রে র শষ মাথা ইেতামেধ ই পার কের এেসছ িকনা। তাহেল িক
আর তুিম এই নৗকােক বসােত পারবা না, তার মােন সমাধানও নই। তুিম এখােন data strcture
িহসােব map বা multiset ব বহার করেত পার।
সমাধান: যেহতু চািহদার পিরমান অিতির থাকার পিরমােনর সমান সজ এই কাজ greedy
ভােব করেলই তুিম optimal সমাধান পােব। Greedy মােন হল- তুিম মেন কর বাম থেক ডান
িদেক যা । যিদ দখ থম জন এর িকছু চািহদা আেছ এর মােন এই পিরমান ডান িদক থেক
আসেব। আর যিদ দখ এর িকছু অিতির আেছ এর মােন এই পিরমান ডান িদেক যােব। তাহেল
িক পিরমান ডােন বা বােম যােব তার উপর িভি কের তুিম তামার উ রেক আপেডট করবা। এরপর
ি তীয় জেনর কােছ যাবা। এবার একটু িহসাব িনকাশ কের দখ থম ই জন আর বাদ বািক সবার
মােঝ িক পিরমান আদান দান হেব। সই মাতােবক উ র আপেডট কর। এভােব চলেত থাকেব।
অথাৎ, এখােন ক কােক িদল সটা িচ া না কের আমােদরেক িচ া করেত হেব থম i জন আর বাদ
বািক জেনর মােঝ িক পিরমান আদান দান হেব। অথাৎ িতিট edge এ িক পিরমান আদান দান
হেব।
যমন মেন কর আমােদর চািহদা (ঋণা ক) আর অিতির (ধনা ক) এর পিরমান িল হল:
3, 1, −5, 1. এখােন থম জেনর আেছ 3. এর মােন বাম িদেক থেক 3 িট িজিনস ডােন যােব।
এরপর দখ থম ই জেনর আেছ 4 িট। এর মােন থম ই জন হেত পেরর জেনর কােছ যােব 4 িট
িজিনস। থম িতন জেনর কােছ আেছ −1 িট িজিনস, অথাৎ থম িতন জেনর 1 িট িজিনেসর চািহদা
আেছ যা আসেব ডান িদক থেক। আর থম চারজেনর চািহদা/অিতির আেছ 0 িট। তরাং আর
িকছু না। তাই এখােন মাট 3 + 4 + 1 = 8 cost হেয়েছ। এিটই সবিন ।
১৫১
সমাধান: বশ ি িক সম া। থেমই আমরা last নােমর একিট অ াের বর করব। last[i] এর মান
হেব অ ােরর i তম ােন যই সংখ া আেছ সিট i index এর আেগ কান index এ আেছ। যিদ এর
আেগ কাথাও না থােক তাহেল আমরা এর মান 0 দব। last এর অ াের বর করা িক খুব একটা
কিঠন না। আমরা একিট map রেখ আমােদর ইনপুেটর অ ােরেক বাম হেত ডােন scan করেলই
last অ ােরর মান িল পাব। মেন কর আমরা অ ােরর বাম হেত ডােন যাি । িতিট ােন এেস এই
ােন থাকা সংখ ােক আমরা map এ খুঁজব। যিদ না পাই তার মােন এর last এর মান 0. আর যিদ
পাই তাহেল map এ সই সংখ ার জ যই মান আেছ তাই হেব last এর মান। অতঃপর আমরা
map এ এই সংখ ার মান িহসােব বতমান index িলেখ রাখব। অথাৎ যেকােনা মুহূেত map এ
থাকেব এর আেগ অমুক সংখ া কান index এ আেছ। তরাং এভােব আমরা last এর মান বর
করেত পাির।
এখন িচ া করা যাক last এর অ ােরেক ব বহার কের আমােদর সম া কীভােব সমাধান করেত
পাির। িট variable নয়া যাক l আর r যােদর initial মান 1. l মােন হল সাবঅ ােরর বাম া , আর
r হল ডান া । এখন আমরা r এর মান এক কের বাড়ােবা। বাড়ােনার পর বতমান r এর জ দখব
last[r] এর মান িক বতমান l এর থেক বড়? যিদ বড় হয় তাহেল l = last[r] কের দব। মােন
আমরা আমােদর সাবঅ ােরেক ছাট কের ফলিছ। এরকম কের r ক আমরা এেক এেক 1 হেত n
পয (আমরা ধের িনি অ ােরিটর index 1 হেত n) নব এবং l এর মান েয়াজেন আপেডট করব।
এই আপেডট করা শেষ আমরা দখব সই l আর r এর মান িক optimal িকনা (অথাৎ আমােদর
দরকার সবেচেয় বড় r − l + 1 এর মান)।
সমাধান: থম কথা, এই ধরেনর সম া angle sweep কের করেত হয়। কীভােব িচ া করবা?
মেন কর তামার optimal line কাথাও না কাথাও আেছ। এখন তামােক চ া করেত হেব এই
লাইনেক একটু িসে েম কীভােব আনা যায়। থেম এই লাইনেক একটু ডােন বা বােম সরােল িক
তামার উ র পিরবতন হেব না। তুিম চাইেল তত ণ পয কােনা এক িদেক সরােত পার যত ণ
না স একটা িব েক শ কের। তরাং আমরা বলেত পাির আমরা এমন একিট অি মাল লাইন
অব ই পাব যা দ িব িলর কােনা একিটর উপর িদেয় যােব। এবার এই লাইন যই িব র
উপর িদেয় যায়, তােত ি র রেখ তুিম লাইনেক চাইেল ঘুরােত পার। আেগর মতই একটু ডান বা
বােম ঘুরােল িক উ র পিরবতন হেব না। তরাং তুিম চাইেল এই লাইনেক ঘুরােত থাকেত পার
যত ণ না স আরও একিট িব েক শ কের। অথাৎ এমন একিট অি মাল লাইন আমরা পাবই যা
দ িব িলর কােনা িটর উপর িদেয় যােবই। এই ব াপারটা আসেল আমােদর সমাধানেক অেনক
সহজ কের দয়। আমােদর এখন আর অসীম সংখ ক লাইন candidate িহসােব নই। মা n2 টা
candidate লাইন। এই লাইেনর একিদেক ভাববা কােলা আেরকিদেক সাদা, এরপর েন দখবা ( )
তামার পেয় ট কত। তরাং িত candidate এর জ আমােদর পেয় ট িহসাব( 3)করেত আরও O n
সময় লাগেব। তরাং এভােব করেল আমােদর time complexity হেব O n . আমােদরেক time
complexity কমােত হেব।
এখােনই আসেব angle sweep. খয়াল কর আমরা যিদ আমােদর লাইনেক একটা িব েত fix
কির, তাহেল এেক যিদ আমরা ডােন বা বােম ঘুরাই তাহেল িক আমােদর উ র ওত বিশ পিরবতন
হয় না। এই আইিডয়াটাই আমােদর কােজ লাগােত
( ) হেব। আমরা থেম একিট একিট কের িব fix
করব। এেত কের আমােদর সময় লাগেব O n . এবার বাদ বািক িব িলেক আমরা এই fixed
িব সােপে সট কের ফিল। মেন কর আমােদর fixed িব হে 0 আর বাদ বািক িব িল হল
১৫২
1 . . . n − 1 এবং মেন কির আমােদর এই িব িল angle অ সাের counter clockwise সট
করা। েত মেন কর তামার লাইন হে 0 আর 1 িদেয় য লাইন যায়- সই লাইন। তুিম সবসময়
মেন করবা তামার ডান পাশ সাদা, আর বাম পাশ কােলা। এখন তুিম েন দখ তামার ডান পােশ
কয়টা সাদা আর বাম পােশ কয়টা কােলা িব আেছ। এই কাজ থমবার তুিম লুপ(চািলেয় ) করবা।
িক এর পর থেক আর লুপ চালাবা না। কারণ িতবার লুপ চালােল তা আবার O n হেয় যােব
3
তাই না (fixed point এর একিট লুপ, 0 − i রখা িনবাচেনর একিট লুপ, আর ই পােশ সাদা কােলা
দখার জ আেরকিট লুপ)? তাহেল আমরা িক করেত পাির? মেন কর আমরা 0 − 1 এর জ
উ র জািন। এখন আমরা 0 − 2 এর জ উ র বর করব। এেত কের িক আমােদর উ র খুব
একটা পিরবতন হেব না তাই না? আমরা 0 − 1 থেক 0 − 2 যাবার ফেল 1 িব িট এখন আমােদর
ডান িদেক এেস গেছ, আর 2 িব িট আমােদর রখার উপর এেস গেছ। তরাং আমরা আমােদর
িদেকর সাদা কােলা িব র সংখ া adjust কের িনেত পাির। ওিদেক 0 এর পছন িদেকও িকছু িব
এিদক ওিদক হেয় িগেয়েছ। মােন, তুিম যিদ 1 হেত 0 হেয় পছন িদেক লাইন টান, আর 2 হেত 0
হেয় পছন িদেক লাইন টান তাহেল এেদর মােঝ িকছু িব আেছ এবং তারা তােদর সাইড পিরবতন
কেরেছ। তরাং সটাও আমােদর িহসাব রাখেত হেব। এটা আসেল খুব কিঠন না, তুিম একিট index
রাখেব য 1 হেত 0 হেয় পছেন লাইন টানেল সবার শষ ডান পােশর িব কানটা। এবার যখন তুিম
2 ত আসেব, তখন দখেব এবার সই শষ িব ক, িঠক line sweep এর মত। Line sweep
এ আমরা হয়েতা আমােদর ডান মাথা এক বাড়াতাম, আর তার উপর িভি কের বাম মাথা হয়েতা
অেনক কয়ঘর বাড়ােত হত। এখােনও িঠক তাই। এভােব আমরা i এর(মান) 1 . . . n − 1 িনব এবং
পােশর সাদা কােলা িব র সংখ া নেত থাকব। তাহেলই আমরা O n2 সমেয় উ র বর কের
( )
ফলেত পারব। আসেল এই time complexity হেব O n2 log n কারণ আমােদর থম লুেপর
ভতের একিট সট আেছ। এছাড়া বািক angle sweep এর অংশটু linear.
যারা বশ অিভ কাডার তারা এই সমাধানেক আরও simplify কের! খুবই িবষয়। খয়াল
কর- আমরা চাইেল কােলা িব িলেক fixed point এর সােপে reflect করেত পাির। এর ফেল
আমােদর সম া আর সাদা কােলা থাকেব না। আমরা বলেত পাির- এই fixed point সােপে লাইন
টানেল এর এক পােশ সবেচেয় বিশ সংখ ক িব থাকেত হেব। এেত কের আমােদর সম া অেনক
simplify হেয় যায়। আমােদর এখন আর সাদা কালর সংখ া মেন রাখেত হেব না। এখন আমােদর
কাডেক আরও সহজ করা যােব।
এই সমাধানেক আরও আরও সহজ করা যায়! এটা হয়েতা িলেখ বুঝান একটু কিঠন হেব। তাও
বিল, তামােদর যােদর আ হ আেছ তারা িচ া কের দখেত পার। আমরা চাইেল fixed পেয় ট এর
সাপে িতিট িব র জ বর করেত পাির য আমােদর লাইন কত হেত কত angle এর ভতের
থাকেল আমােদর িব িট ডান িদেক থােক। অথাৎ িতিট িব র একিট entry angle থাকেব আর
exit angle থাকেব। এবার আমরা এই entry আর exit ক event িহসােব ক না কের সট করেত
পাির এবং line sweep এর মত কের বর করেত পাির য কােনা এক মুহূেত সেবা কত িল িব
active িছল।
১৫৩
থেম আমরা দিখ i index এর জ i তম ান সহ এর ডান িদেক strictly increasing
sequence এর লংথ কীভােব বর করা যায়। এটা সহজ এবং কমন। আমরা ডান িদক থেক
আসব। েত length1[n] = 1 অথাৎ n তম ােনর জ উ র 1. এর পর i তম ােনর জ
আমরা দখব এই ােনর সংখ া i + 1 তম ােনর সংখ ার থেক ছাট িকনা। যিদ ছাট হয়, তাহেল
আমােদর i তম ােনর উ র i + 1 তম ােনর উ েরর থেক এক বিশ হেব। আর যিদ ছাট না
হয়? তাহেল তা সহজ, উ র 1. এভােব আমরা i তম ােনর জ i তম ান সহ এর ডােন strictly
increasing sequence এর মান বর করেত পারব।
এবার কিঠন অংশ। কীভােব i তম ােন দািড়েয় আমরা বর করেত পারব i এর বাম িদেক
কাথাও a[i] হেত ছাট কােনা সংখ ায় শষ হওয়া সবেচেয় বড় strictly increasing sequence
এর লংথ কত। থমত িকছু ণ আেগই আমরা িতিট ােনর জ সই ান সহ তার ডান িদেক
strictly increasing sequence এর সেবা লংথ বর কেরিছ। একই ভােব আমরা খুব সহেজই
বর করেত পারব i এ শষ হওয়া (i তম ান সহ) strictly increasing sequence এর লংথ কত,
ধরা যাক এটা আমরা length2 নােমর এক অ ােরেত রেখিছ। যিদ এটু হেয় যায় তাহেল আমােদর
কাজ হেব হেব- িতিট i এ িগেয় সব িল j < i দখা যােত কের a[j] < a[i] হয় এবং length2[j]
সেবা হয়। এই কাজ নানা উপােয় করা যায়।
একিট উপায় হেত পাের আমরা i এর লুপ বাম থেক ডােন যাব। আর একিট segment tree
রাখব। আমরা segment tree ত িজ াসা করব- "আ া a[i] থেক ছাট index এ সবেচেয় বড়
কত সংখ া আেছ?"। আর আমােদর i এ কাজ শষ হেয় গেল এেক আমরা segment tree ত
রেখ দব। আমােদর আপেডট অপােরশন হেব- "a[i] এ length2[i] রেখ দবার চ া কর তা!"।
চ া বললাম এ কারেন য, হয়েতা a[i] এ ইেতামেধ ই length2[i]
( এর) থেকও বড় সংখ া আেছ।
তাহেল এভােব segment tree রেখ আমরা খুব সহেজই O n log n এ এই সম ার সমাধান
করেত পাির।
আমরা চাইেল binary search বা set ব বহার কেরও করেত পাির। মেন কর আমােদর set এ
(a[j], length2[j]) সমুহ আেছ। আমরা i তম index এ আসব। এেস সটেক িজ াসা করব য a[i]
এর থেক immediate ছাট কান a[j] আেছ? এই কাজ আমরা lower bound ব বহার কের সহ-
জই করেত পাির। সই a[j] বর কের তার length2[j] নব। িক এমনও তা হেত পাের য কােনা
immediate ছাট a[j] না িনেয় তার থেকও ছাট কােনা a[j] এর জ length2[j] ভাল। হেত পাের,
তেব এখােনই মজা। আমরা যখন (a[j], length2[j]) ঢুকাব তখনই দখব য এর থেক ছাট a[k]
কত? তার length2[k] কত? সটা িক length2[j] এর থেক বড়? তাহেল তা (a[j], length2[j])
ঢুকানর কােনা দরকার নই। অথাৎ আমােদর সট টােত সবসময় a িল increasing আকাের থাক-
ব ( সেটর property অ সাের) আর length2 ও থাকেব increasing অডাের (আমরা এটা িনি ত
করব)। একই ভােব সেট (a[i], length2[i]) ঢুকােনার পর যিদ দিখ এর পেরর length2[k] এর
মান আমােদর length2[i] এর থেক ছাট, তাহেল তা সই (a[k], length2[k]) রাখার আর দর-
কার নই। এভােব আমরা সট ক সবসময় িঠক ভােব maintain কের রাখব।
১৫৪
খয়াল কর, এই বাইনাির ি ত থেমই weight িল ই ভাগ হত, এর পর িতিট নােড আরও
ই ভাগ হত। এরকম কের যত ণ না একিট সংখ া থােক তত ণ ভাগ হেতই থােক তাই না? বা
অ ভােব িচ া কর, িতিট নােড ই প সংখ া যাগ হয়। এরকম করেত করেত root এ িগেয়
সব সংখ া একে যাগ হয়। এটাই তা আমােদর বতমান সম ােতও হে তাই না? Huffman
coding এর সম ােত আমােদরেক মাট কােডর লংথেক সবিন করেত হত। মাট কােডর লংথ
মােন হল িতিট কােডর লংথ আর তার weight (ঐ অ র কত বার আেছ) এর নফল। আমােদর
সংখ ােতও weight দওয়া আেছ ( িতিট সংখ া কত)। আমােদরেক বর করেত হেব িতিট সংখ া
কতবার কের যাগ হয়, মােন huffman coding এ িতিট অ েরর length যত, ততবারই তা ঐ
সংখ া যাগ অপােরশেন অংশ নয় তাই না? আর কােনা একিট সংখ া যাগ অপােরশেন অংশ িনেল
আমােদর cost িদেত হয়, আর আমােদর সম ার মূল ল ই হল এই cost কমােনা। এটাই তা
huffman coding এর কাজ তাই না?
১৫৫
UVa 1451 Average
সমস া: তামােক সেবা 100,000 লংেথর একিট অ াের দওয়া আেছ যার িতিট element হয়
0 নাহয় 1. তামােক একিট সাব অ াের িনবাচন করেত হেব যার লংথ কমপে L হয় এবং এেত
এক এর সংখ া গেড় সবেচেয় বিশ হয়। মােন যিদ এই সাব অ াের এর লংথ হয় s আর এেত 1 এর
সংখ া হয় a তাহেল আমােদর ল হল a/s ক সেবা করা যখােন s ≥ L. L এর মান সেবা
1000 হেত পারেব।
সমাধান: অথাৎ আমােদরেক i আর j িট index বর করেত হেব যন j − i + 1 ≥ L হয় আর
i হেত j পয 1 এর সংখ া যিদ S হয় তাহেল আমােদর ল j−i+1
S
এর মান যন সবেচেয় বিশ
হয়। কথা হল S এর মান কীভােব বর করেব? বশ কমন একটা টকিনক ব বহার করেত হেব।
Cumulative sum. আমরা যিদ 1 এর cumulative sum যিদ p নােমর একিট অ াের ত রািখ
তাহেল S = p[j] − p[i − 1]. তাহেল আমােদর average 1 এর ফমুলা হেব p[j]−p[i−1]
j−i+1 . এই
ফমুলা দখেত বশ জিটল লাগেছ। আমরা যিদ i = i − 1 বসাই তাহেল বশ র ফমুলা হেব
p[j]−p[i]
j−i . একটু িচ া কের দখ তা এই ফমুলা পিরিচত লােগ িকনা? এটা slope এর ফমুলার মত।
তুিম যিদ i, j এ লেক x িহসােব ভাব আর p িলেক y িহসােব ভাব তাহেল এটা হল slope. তাহেল
আমােদর ে ম modify করেল দাঁড়ায়, তামার কােছ n িট িব দওয়া আেছ। তামােক i < j
choose করেত হেব যন j − i ≥ L − 1 হয় এবং slope সবেচেয় বড় হয়।
মেন কর তামার কােছ অেনক েলা িব আেছ। এখন তামােক বলল এেদর ভতর থেক
এমন একিট িব িনবাচন করেত যটা আেরকটা িব q এর সােথ সবেচেয় বড় slope তির করেব,
যখােন q এই িব িল থেক বােম অবি ত। একটু িচ া কের দখ তা q কীভােব বর করবা?
সহজ। তুিম যিদ এই িব িলর convex hull তির কর তাহেল q হেত tangent টানেলই তুিম
সবেচেয় বড় slope তির করেত পারবা। আসেল convex hull এর দরকার নাই। ধু upper left
hull তির করেলই হেব।
তাহেল িক দাঁড়াল? আমরা ডান থেক বােম আসব। যখন আমরা i এ আিছ তখন i + L ক
upper left hull এ insert করব। এরপর আমরা i তম িব হেত tangent টানব। এখন ইটা -
কীভােব upper left hull বানাবা আর কীভােব tangent টানবা।
Upper left hull বানােনা িক খুব একটা কিঠন না। মেন কর এই hull এর িব িল হল-
u[1], u[2] . . . u[m] ডান থেক বােম এই অডাের। এখন যখন নতুন একিট িব p আসেব, তুিম
দখেব p, u[m], u[m − 1] এরা িক counter clockwise এ আেছ িকনা, থাকেল u[m] ক ধের
ফেল িদেত পার এবং আবার ঐ turn চক করেত হেব যত ণ না turn টা clockwise এ থােক
(অথবা 2 এর কম element থােক)। সবেশেষ p ক u অ ােরেত insert করেত হেব। এভােব আমরা
upper left hull ক maintain করেত পাির।
এখন ি তীয় , কীভােব tangent টানেব? বশ সহজ, আমরা আমােদর u এর অ াের ত
ternary search করেত পাির সবেচেয় বড় slope কান িব েত হয় তা বর করার জ । আমার
িব াস এটা সমাধােনর জ যেথ । তেব ই া করেল অিতির log n factor না এেনও সমাধান
করা যায়। ছা একটা িহ ট দই। যিদ q হেত tanget টানেল হােলর িব িট যিদ হয় u[k] তাহেল
িক u[1] . . . u[k − 1] এই িব িল কখনও optimal slope এর অংশ হেব না। এই property
ব বহার কের তুিম ternary search ব বহার না কের amortized linear সমেয় সমাধান করেত
পার।
১৫৬
সমাধান: মােঝ মােঝ িচ া করেত হয়- যিদ আমার উ র জানা থাকত তাহেল িক আমরা বর করেত
পারতাম য আমরা আমােদর ইনপুেটর অ ােরেক k বা তার কম ভােগ ভাগ করেত পারব িকনা?
এে ে ব াপারটা সহজ তাই না? মেন কর আমরা জািন আমােদর সবেচেয় বড় যাগফল হল S.
তাহেল আমরা অ ােরর থম থেক সংখ ােক থম ভােগ রাখেত থাকব যত ণ যাগফল S অিত ম
না কের। এর পর ি তীয় ভাগ িনেত থাকব। এভােব চলেত থাকেব। এভােব সব সংখ া নয়া হেয়
গেল দখব কয়টা ভাগ হেয়েছ।
িক সম া হল আমরা তা আমােদর উ র জািন না তাই না? িক উপায়? Binary search.
খয়াল কর আমরা মেন কর ই রকম guess করলাম, একটা হল S1 আেরকটা S2 যখােন S1 <
S2 . S1 এর জ মেন কর ভাগ হয় K1 আর S2 এর জ K2 . আমরা বলেত পাির K1 ≥ K2 .
কারণ যিদ আমােদর S কম হয় তাহেল তা ভােগর সংখ া বেড় যােব তাই না? তরাং আমরা binary
search কের সিঠক S এর মান বর কের ফলেত পারব। যিদ কােনা একিট guess এর জ দিখ
K এর মান আমােদর কাি ত মােনর থেক বিশ হেয়েছ এর মােন হেব আমােদর S বাড়ােত হেব।
কারণ এই S এর ফেল আমােদর ভাগ সংখ া বিশ হেয় িগেয়েছ (K এর মান বিশ), তরাং আমােদর
S এর মান বািড়েয় K এর মান কমােত হেব। একই ভােব যিদ কােনা একিট guess এর জ যিদ
দিখ K এর মান আমােদর কাি ত মােনর থেক হেয়েছ তাহেল S কমােত হেব। এভােব আমরা
optimal S এর মান বর করেত পারব।
সমাধান: এটা একটা পােজল জাতীয় সম া। আমরা কােনা একিট রা ায় যেত য পিরমান গ াস
খরচ হয় সই পিরমান গ াস আমরা তার আেগর গ াস সন থেক িবেয়াগ করব। তাহেল আমােদর
বেলম পিরবতন হেয় দাঁড়ায়- একিট N দেঘ র circular অ াের আেছ। আমােদরেক বলেত হেব
অ ােরর কান জায়গা থেক করেল পুেরা অ ােরর সংখ া িল যাগ করেত করেত ঘুের আসেলও
কাথাও আমােদর যাগফল ঋণা ক হেব না।
আমরা আমােদর কাজ সহজ করার জ এই অ ােরেক তার িনেজর মত এক অ ােরর (আেগরটার
কিপ) সােথ জাড়া লাগােয় 2N লংেথর বানাব। অথাৎ i তম index এ য সংখ া আেছ i + N তম
index এও একই সংখ া আেছ (1 ≤ i ≤ N আর ধের িনি অ ােরিট 1 indexed). এবার এই
অ ােরর থম ান থেক িতিট ান পয cumulative sum বর করব। এই cumulative sum
এর অ াের মেন কর S. মেন কর আমরা যা া করব i এর িঠক পের থেক তাহেল j ত পৗঁছােত
গ ােসর পিরমান হেব S[j] − S[i]. আমােদর ল এমন একিট i িনবাচন করা যন সকল j > i
এর জ S[j] − S[i] ≥ 0 হয়। এখােন তামরা ভাবেত পার আিম কন হঠাত 2N দেঘ র অ াের
িনলাম। এটা আসেল circular ে মেক িলিনয়াের কনভাট করার একিট র টকিনক। তুিম যিদ
েত ক [i, i + N − 1] রে র জ সমাধান করেত পার (1 ≤ i ≤ N ) তাহেল পুেরা সাইেকল
এর জ সমাধান হেয় যােব (সব সম ার ে ই য স ব তা না, িক বশ অেনক সম ার জ
স ব)। যমন এই সম ার ে আমােদর কাজ হল 1 ≤ i ≤ N মেন এমন একিট i িনবাচন
করেত হেব যন [i + 1, i + N ] এই রে র ভতের যেকােনা j এর জ S[j] − S[i] ≥ 0 হয়
(আসেল j ≤ i + N এর জ সত হেল আমােদর সম ার ে সকল j ≤ 2N এর জ ও সত
হেব)। এখােন S[j] − S[i] এর মােন হল i + 1 থেক j পয সংখ ার যাগফল। আর আমরা চাই
এই যাগফল যন ঋণা ক না হয়। এখন তামরাই িচ া কের দখ কান i িনবাচন করবা? আসেল
যেকােনা j এর জ S[j] তা fixed. আমরা যিদ S[i] ক কমােত পাির তাহেল S[j] − S[i]
সবেচেয় বড় হেব। আর আমােদরেক িক i ≤ N িনবাচন করেত হেব তা না হেল তা i + N তা
2N এর থেক বিশ হেয় যােব। তাহেল আমরা 1 ≤ i ≤ N এর জ সবেচেয় ছাট S[i] িনবাচন
১৫৭
করব। এরপর আমরা েত ক j এর জ চক কের দখব য S[j] − S[i] ≥ 0 হয় িকনা।
১৫৮
UVa 12174 Shuffle
সমস া: তামার গােনর িলে s (সেবা 100,000) িট গান আেছ। গান িল 1 হেত s ারা কাশ
করা হেব। তুিম shuffle িফচার ব বহার কর। অথাৎ একদম েত তামার সফটওয় ার গান িলর
একিট random permutation করেব এরপর সসব শষ হেয় গেল আবার নতুন একিট random
permutation করেব এরকম কের চলেত থাকেব। তামােক গােনর partial history দওয়া আেছ
(সবেশষ বাজা n িট গান, n ≤ 100, 000)। অথাৎ শষ এতটা গান িক িক িছল। বলেত হেব কয়টা
গান পর তামার সফটওয় ার আবার গােনর িল shuffle করেব। তামােক আসেল কয়টা গান পর
বলেত হেব না, বলেত হেব "কয়টা গান পর" এর কয়টা উ র আেছ। অথাৎ যিদ এরকম হয় য, 2 টা
গান পরও শাফল হেত পাের, 4 টা গান পরও হেত পাের, আর কােনা অপশন নাই। এর মােন এরকম
2 টা উ র আেছ। এমনও হেত পাের য দ history টা ভুল, সে ে 0 আউটপুট করেত হেব।
সমাধান: মেন কর গােনর অ ােরিট হল 1-indexed. এর মােন হল গােনর একিট অ ােরেত 1 হেত n
index এ সবেশষ n িট গান দওয়া আেছ। আমরা যটা করব তাহল িতিট i এ যাব আর মেন করব i
এর আেগ িদেয় শাফল হেয়িছল, ফেল i হেত i + s − 1 পয গান িলর index আলাদা আলাদা হেব।
বা অ ভােব বলেল দাঁড়ায় তুিম যিদ দখ য i হেত i + s − 1 এর মােঝ যিদ কােনা duplicate
সংখ া থােক তার মােন হেব i থেক কােনা শাফল হেত পারেব না। এরকম কের আমরা সকল i
এ বর করব য সখান থেক কােনা শাফল হেত পাের িকনা। কান কান i আমােদর চক করা
উিচত? যসকল i এর জ [i, i + s − 1] এই র িট আমােদর ইনপুট এর সােথ intersect কের।
তার মােন [2 − s, n] এই রে র মােঝর সকল মানেক i িনেয় িনেয় চ া করেত হেব। কােনা একিট
i এর জ (এই ) s লংেথর অ াের sequence চক করা তা সহজ। িক িতিট i এর জ তা আর
আমরা O s এ এই কাজ করেত পাির না তাই না? এখােন আমরা sliding window টকিনক এর
সাহায নব। আমরা থেম দখব য [2 − s, 1] এর মােঝ কােনা duplicate আেছ িকনা, এরপর
দখব [1 − s, 2] এর মােঝ আেছ িকনা এরকম কের আমরা window ক এক ঘর কের সরােত থাকব
যত ণ না আমরা সব window এর িহসাব কের ফলিছ। কীভােব িহসাব করবা তােতা সহজ। আমরা
একিট অ াের িনব যােত িলখা থাকেব বতমান segment এ কান সংখ া কয়বার কের আেছ। আর
আেরকটা variable রাখব য এই অ ােরেত এখন কয়টা 2 বা 2 এর বিশ আেছ। যেহতু আমরা
িত window আপেডেট মা একিট সংখ া মুেছ যায় বা নতুন যাগ হয় সেহতু আমরা এই অ াের
আপেডট আর এই অিতির ভ ািরেয়বল আপেডট এর কাজ খুব সহেজই করেত পারব।
এই কাজ শষ হেয় গেল এখন দখেত হেব কান কান জায়গা থেক shuffle হেত পাের।
মেন কর i তম ান থেক shuffle হেত পাের। এর মােন হল i ± s, i ± 2s . . . এর িতটা হেতই
shuffle হয়। এর মােন আমােদরেক 0 হেত s − 1 পয িতিট mod এর জ চক করেত
হেব য সই mod এর সকল index থেকই shuffle হেত পাের িকনা। যা খুবই সহজ কাজ।
১৫৯
( )
িক আবার হেব না, তাহেল আবার O n2 হেয় যােব কারণ আমরা য সবসময় মাঝামািঝ ভাগ
করেত পারব তার িক িন য়তা? এমনও তা হেত পাের িতবার আমােদর ( ) ভাগ হে এক মাথায়।
তরাং আমােদর থমবার n, এরপর n − 1 এরকম কের মাট O n2 বার কাজ করেত হেব।
উপায়?
মেন কর আমরা [i, j] এই সাব অ াের ত আিছ। আমরা িজ াসা করব i এর সংখ া িক unique?
নাহেল j এর সংখ া িক unique? না হেল i + 1 এর স ািক unique না হেল j − 1 এর সংখ ািক
ইউিনক? এরকম কের zigzag ভােব িজ াসা করব। তাহেল লাভটা িক? লাভ হল মেন কর এই
েসস শেষ আমরা আমােদর সাবঅ ােরেক a আর b এই ই সাইেজ ভাগ কেরিছ। আর এই ভােগর
জ আমােদর খরচ হয় min(a, b) তাই না? কারণ দখ a = n − 1 আর b = 1 হেল আমরা ি তীয়
ধােপই বর করেত পারব য আমােদর সবেশেষ ইউিনক সংখ া আেছ। যেহতু a + b = j − i + 1
সেহতু আসেল a আর b এর সবিন মান (j − i + 1)/2 এর বিশ হেব না। ( )তুিম একটু যিদ
কাগেজ কলেম িহসাব কের দখ দখবা এ কােজর জ তামার খরচ হেব O n . তেব এখনও
একটা িজিনস বািক আেছ সটা হল কােনা একিট সাবঅ ােরেত কােনা একিট element ইউিনক
িকনা তা কীভােব বর করেব? সিট সহজ, আমরা দখব য এর সমান বাম িদেক সবেশষ কাথায়
আেছ, আর ডানিদেক সবার আেগ কাথায় আেছ। যিদ এ িটর কানিটই [i, j] সীমানার মােঝ না
থােক তার মােন এিট ইউিনক। কােনা একিট সংখ ার সমান সংখ া এর আেগ কাথায় আেছ বা এর
পের কাথায় আেছ তা আমরা খুব সহেজই map ব বহার কের precalculate কের রাখেত পাির।
সমাধান: তুিম যিদ থেমই ক কার সােথ খলেব সটা িঠক কর অথাৎ ি এর leaf এ ক কাথায়
আেছ সটা যিদ থেমই িঠক করেত যাও তাহেল নানা রকেমর সম ায় পরবা। যমন মেন কর
তামার িটম যােদর হারােত পাের না তারা হল B আর যােদরেক তামার িটম হারােত পাের তারা হল
A. তাহেল এরকম িকছু scenario িচ া করেত পার- A এর একটা িটম B এর সব িটম ক হারােত
পাের, িক স আবার A এর বািক িটম এর কােছ হাের। A এর অ রা B এর কােনা িটমেক হারােত
পাের না। এর মােন সই special দল যন অ কােনা A এর দেলর কােছ যন না হাের সটা
িনি ত কের planning করেত হেব। এছাড়াও আরও অেনক িকছু খয়াল রাখেত হেব। মেন কর B
ত একটা িটম আেছ য কারও কােছ হাের না ধু মা A এর একটা িটম এর কােছ হাের। তরাং
আমােদর খয়াল রাখেত হেব A এর সই িটম যন আবার অ কারও কােছ হের না বেস। এরকম
নানা িজিনস খয়াল রেখ একবাের যিদ তুিম দেলর schedule িঠক করেত চাও তাহেল সমাধান
করা বশ কিঠন হেয় যায়।
এই ে অেনক সময় যটা কােজ লােগ তাহল তামার ে ম ক িত রাউে ড ছাট কের
ফলা। যমন মেন কর- এই সম ার ে বলা আেছ য, মাট দল n টা ( যটা একটা 2 এর
power, 2k ). এর মােঝ তামার একটা দল, িকছু A দল যােদর সংখ া মেন কির a, আর িকছু B
দল যােদর সংখ া মেন কির b. তুিম A এর সবাইেক হারােত পার। B এর সবাই তামােক হারােত
পাের। B এর িতিট দল A ত আেছ এমন কােনা একিট দেলর কােছ হাের। a ≥ n/2 = 2k−1
আর b < n/2 = 2k−1 . আমােদর বলা আেছ য এরকম ে কােনা না কােনা ভােব schedule
করা স ব য তামার দল শেষ িজতেব।
আমরা যিদ এক রাউ ড খলা করাই তাহেল বািক থােক n/2 = 2k−1 দল। আমরা িক থম
রাউ ড এমন ভােব schedule করেত পাির যন, এই ি তীয় রাউে ড তামার দল থােক, িকছু A দল
১৬০
থােক যন তােদর সংখ া a′ ≥ n/4 = 2k−2 হয় আর B দেলর সংখ া b′ < n/4 = 2k−2 হয় আর
যসকল B দল এখনও বািক আেছ তােদরেক হারােত পাের এরকম কােনা এক দল যন এখনও A
ত বািক থােক। যিদ আমরা এভােব থম রাউ ড schedule করেত পাির তাহেল তা এটা আবার
আমােদর কােছ নতুন িক ছাট একই রকম ে ম দাঁড়ােব তাই না? তরাং আমরা যিদ এরকম
কের একিট কের রাউ ড schedule করেত পাির তাহেল সব রাউ ড শেষ আমােদর দল িজতেব।
এখন হেল কীভােব এই schedule করবা? একটু িচ া করেলই মেন হয় তা বর কের
ফলেত পারবা। আমরা A আর B িনেয় কাজ করব। B থেক একটা িটম িনব আর দখব A এর
কউ তােক হারােত পাের িকনা। পারেল এেদর জনেক একে schedule কের দব আর তােদর
জনেক A আর B থেক বাদ দব। িক এমন তা হেত পাের য B এর যই দলেক আিম এখন
schedule করেত চাি তােক A এর যারা হারােত পারত তােদর ইেতামেধ ই B এর অ দেলর
সােথ schedule কের ফেলিছ। কােনা সম া নাই। সই ে আমরা এেক অ যেকােনা B
দেলর সােথ schedule করােয় দব। আর যিদ স একাই বািক থােক B দেলর ভতর থেক তাহেল
তােক যেকােনা একটা A দেলর সােথ schedule কের দব। যেহতু B দেলর সংখ া A দেলর
সংখ ার থেক কম সেহতু আমােদর এই েসেস B এর সট আেগ ফাঁকা হেয় যােব। তখন আমরা
আমােদর দলেক A এর যেকােনা দেলর সােথ schedule করব আর বািক A দলেক িনেজেদর মােঝ
যেকােনা ভােব schedule করব। হল এভােব schedule করেল আমােদর পেরর রাউ ড এ
সব শত মেন দল িল থােক িকনা।
আমােদর কােছ িক িক শত িছল?
আমরা আেগই দেখিছ য যেহতু B দেলর সংখ া A দেলর সংখ ার থেক কম সেহতু B দেলর
সকেলর scheduling এর পর A দেল কউ না কউ বািক থাকেব। তরাং আমরা আমােদর দলেক
A দেলর কারও না কারও সােথ schedule করিছ। তরাং আমােদর দল পেরর রাউে ড যােবই।
মেন কর আমােদর েসেস b দেলর মােঝ t দল A এর সােথ schedule হয়। এর মােন বািক
b − t দল িনেজেদর মােঝ অথবা শষ জন A দেলর কারও সােথ schedule হয়। এর মােন ঐ t
দেলর কউ পেরর রাউে ডর মুখ দখেব না। বািক b − t দল িনেজেদর মােঝ খলেব আর তার ফেল
এেদর অেধক জন পেরর রাউে ড যােব। যিদ b − t িবেজাড় হয় তাহেল শষ িবেজাড় দল A এর
কাউেক হািরেয় পেরর রাউে ড যােব। ওিদেক a − t িট A এর দল বািক থাকেব (বা a − t − 1 যিদ b
িবেজাড় হয়)। তাহেল িক a′ > b′ হেব? খয়াল কর যিদ আমরা a′ > b′ মাণ করেত পাির তাহেল
ই আর িতন না ার শত িক একবােরই পুরন হেয় যােব। কারণ a′ + b′ = n/2 − 1 আর a′ > b′
হেল 2b′ < n/2 − 1 বা b′ < n/4. একই ভােব আমরা অ শত মাণ করেত পাির। তাহেল
আমােদর এখন দখােত হেব য a′ > b′ . যেহতু েতই a > b িছল, তরাং আমরা যিদ ঐ t
িলেক যিদ schedule কের ফিল তাহেলও a − t > b − t থাকেব। এবং এই t দল িল খলার
পর সখােন A দল িলই িজতেব, B দল িল সসব খলায় আর পেরর রাউে ড যােব না। খয়াল
কর এখােন t এর সংখ া িক কমপে 1 হেবই (যিদ না হয় এর মােন B ত কউ নাই, সে ে
তুিম কার সােথ কােক schedule করলা তা িক ব াপার না, তামার দল িজতেবই কারণ এখন আর
কােনা B নই)। এখন b িবেজাড় হেল একটা B ক A এর সােথ খলােত হেব এবং স ে B
এর দল পেরর রাউে ড যােব। যেহতু t থেক একটা না একটা A এর দল পাবই আর এখােন একটা
B এর দল পাি তরাং এখন পয B এর দল সংখ া িক A এর দল সংখ া থেক বিশ হয় নায়।
এখন এই িবেজাড় দল খলার পরও a − t − 1 > b − t − 1. তার মােন আমরা যিদ এখন A আর
B ক িনেজেদর মােঝ খলাই তাহেল িক A এর দেলর সংখ া B এর দেলর সংখ ার থেক কম হেব
না বরং বিশ হেত পাের। আমরা এখােন মাণ করলাম a′ ≥ b′ . িক তুিম এখন যিদ িচ া কর কখন
a′ = b′ হেত পাের তখন একটু যিদ case analysis কর তাহেল বুঝেব য a′ = b′ হেত পাের না।
কন? দখ, a′ = b′ তখনই হেব যিদ t = 1 হত আর b − t ত িবেজাড় সংখ ক দল থাকত। শষ
১৬১
িবেজাড় দলেকও মেন কর schedule করলা। বািক থাকল b − t − 1 সংখ ক জাড় দল। ওিদেক
তামার দল আর a − t − 1 সংখ ক িবেজাড় দল বািক থাকেব। কারণ B এর প আর তুিম িমেল
িবেজাড়। যেহতু জাড়ায় জাড়ায় খলা হেব সেহতু A দেলর বািক দর সংখ া তা িবেজাড় হেবই।
মেন কর তুিম A এর কারও সােথ খলেল। তাহেল A এর বািক দর সংখ া B দর বািক দর সংখ ার
খুব জাড় সমান হেব। িক আসেলই িক সমান হেত পারেব? সমান হেল তা পেরর রাউে ড তামার
দেলর সােথ খলার আর কাউেক পাওয়া যােব না। এর মােন আসেল A ত B এর থেক আরও ই
জন বিশ আেছ। এর মােন (a − t − 1)/2 > (b − t − 1). মাণটা একটু জিটল হেয় গল।
হয়েতা আরও সহজ মাণ আেছ। িক আসেল এেতা details এ মাণ করার দরকার নাই। তুিম
যিদ convince হউ য এটা কাজ করেছ তাহেলই হল। আর তুিম যিদ চাও তাহেল ক কের মাণ
করেতই পার। সিত কথা বলেত এই মাণ আিম করার জ কেরিছ। এবং এই মাণ আিম িনেজ
পের বুঝেত বশ ক হে । করার িকছু নই। এধরেনর মাণ এরকম জিটলই হয় সাধারণত। এজ
সবেচেয় ভাল হয় িনেজরাই এরকম case analysis কের কের মাণ করা। আর যিদ কউ একা ই
মাণ দখেত চাও তাহেল ঠা া মাথায় এখােন িলখা মাণ কেয়ক িদন ধের কেয়ক বার কের পড়,
আশা কির বুঝবা।
১৬২
খয়াল কর, এই ােনর ডান িদেক যারা আেছ তারা িক এখন f উ তা পয তরল রাখেত
পারেব। কারণ এই ান হেত ডান িদেকর তরেলর উ তা যত ণ না f অিত ম করেব তত ণ
তারা i এর বােম যেত পারেব না আর L কও violate করেত পারেব না। তাহেল এই কেস
যা করেত হেব তাহল L = f .
তরাং আমরা যিদ উপেরর এই েসস বাম আর ডান ই িদক থেক কির তাহেল েত ক ােনর
জ আমরা L পাব। আর L পেল তা আমরা তা থেক মেঝর উ তা বাদ িদেলই ঐ ােন িক
পিরমান তরল থাকেত পারেব তা পেয় যাব।
সমস া: একিট R × C ি ড আেছ (R, C ≤ 1, 000)। ি েডর িবিভ সেল পািন আেছ। তুিম
এক বা একািধক সাবি ড মাক করেত পার যন তার ভতের কােনা সেল পািন না থােক। তেব
খয়াল রাখেত হেব য একািধক সাবি েডর িনেচর-ডান কাণা যন একই না হয়। তামার ল
এসব সাবি েডর পিরিধর যাগফল যন সেবা হয়। বলেত হেব সাবি ড সমুেহর পিরিধ কত কত।
( )
সমাধান: এরকম সম ার ে আমােদরেক maximum 0 area subrectangle এর O n2
সমাধােনর টকিনক খাটােত হয়। এই টকিনক না জানেল আেগ তা পেড় আেসা। ওখােন আমরা
িক কেরিছলাম? আমরা থেম subrectangle এর base িঠক কেরিছলাম। এরপর িতিট কলাম
এেকর পর িগেয়িছলাম এবং তা stack এ রেখ েসস কেরিছলাম। মেন কর আমরা একিট base িঠক
করলাম, অথাৎ একিট রা িঠক করলাম য যসকল rectangle এর base এই রা ত আেছ তােদর
উ র আমরা এখন বর করব। এবার আমরা বাম হেত ডােন যাই। িতিট কলােম িগেয় আমােদর
জানেত হেব এই কলােম আমােদর(িঠক) করা base এর থেক কত উচু পয পািন ছাড়া সল আেছ।
এই সংখ া আমরা খুব সহেজই O n2 এ precompute কের রাখেত পাির। এখন আমরা stack
এ এই height িল রেখ েসস করব। যিদ stack ফাঁকা হয় তাহেল আমরা stack এ ঢুিকেয়
রাখব বতমান কলাম আর তার height. যিদ ইেতামেধ ই stack এ কউ থােক তাহেল দখব stack
এর উপের য আেছ তার height িক আমার বতমান কলােমর height থেক বড় িকনা। যিদ বড়
হয় তাহেল তা লাভ নাই তাই না? কারণ ওত বড় height এর rectangle বতমান কলাম থেক
বানােনা স ব না। সজ তােক ধের ফেল দব। এরকম কের stack এর উপের যত জন আমার
বতমান কলােমর থেক বিশ height এর আেছ তােদর ধের ফেল িদেত হেব। এই কাজ করার পর
আমােদরেক stack এ বতমান height েবশ করােত হেব। তেব এই height হেব কই থেক?
সবেশষ যােক তুেল ফেলছ স যখান থেক হেয়িছল সখান থেক। এভােব আমােদরেক stack
েসস করেত হেব। আর বতমান কলােমর েসস করা হেয় গেল তুিম আসেল বতমান কলােমর জ
সবেচেয় বড় perimeter এর rectangle কত সটাও বর কের ফলেত পারেব। দখ বতমান base
আর কলাম িক fixed. সেহতু তামােক চ া করেত হেব তামার stack এ থাকা কান কলােমর
r − c সবেচেয় বিশ (c মােন stack এর কােনা একিট element কান কলাম থেক হেয়িছল
তা, আর r মােন তার উ তা)। কারণ আমােদর perimeter এর ফমুলা তা c′ − c + r এর মত (মত
বললাম কারণ এর সােথ হয়েতা 1-2 যাগ িহসােব আেছ বা িকছু সংখ া ন িহসােব থাকেত পাের)।
এই কাজ stack এ যখন কােনা একিট কলাম েবশ করােব তার সােথ সােথ বতমান সেবা r − c
ও রাখেলই হেয় যােব। অথাৎ stack এর িত element এ িলখা থাকেব য stack এ তার িনেচ
যারা আেছ ( স সহ) তােদর সবার মােঝ সেবা r − c এর মান কত।
১৬৩
১০.১ অ শীলনী
১০.১.১ সম া
Simple
UVa 1149 Bin Packing UVa 1610 Party Games
UVa 12545 Bits Equalizer UVa 11491 Erasing and Winning
UVa 1611 Crane UVa 1616 Caravan Robbers
Easy
UVa 177 Paper Folding UVa 11925 Generating Permutations
UVa 1612 Guess UVa 1153 Keep the Customer Satisfied
UVa 1615 Highway UVa 10570 Meeting with Aliens
Medium
UVa 1613 K-Graph Oddity UVa 1614 Hell on the Markets
UVa 1620 Lazy Susan UVa 1621 Jumping Around
UVa 1622 Robot UVa 1623 Enter The Dragon
১৬৪
অধ ায় ১১
Geometry
সমাধান: নানা উপােয় এই সম া সমাধান করা যায়। একটা িজিনস খয়াল কর- তুিম যিদ কােনা
একিট ফেম বৃে র সমীকরণ বর করেত পার তাহেল তােক অ ফেম পিরনত করা আসেল কােনা
ব াপারই না। তাই আমরা চ া করব যেকােনা একিট ফেম সমীকরণ বর করেত।
থম সমাধান- আমরা x2 + y 2 + cx + dy − e = 0 এই সমীকরেণ c, d, e এর মান বর
করেত চ া করব। আমােদর কােছ িতনিট িব আেছ। সই িতনিট িব র x আর y এর মান িল
যিদ আমরা এই সমীকরেণ বসাই তাহেল আমরা িতনিট equation পাব যখােন িতনিট unknown
মান থাকেব (c, d, e). আমরা খুব সহেজই এই িতনিট equation সমাধান কের িতনিট variable
এর মান বর কের ফলেত পাির। এজ তামরা determinate এর প িত ব বহার করেত পার,
gaussian elemination ব বহার করেত পার, হােত হােত সমাধান বর করেত পার।
ি তীয় সমাধান- আমরা (x − h)2 + (y − k)2 = r2 এই সমীকরেণ h, k, r এর মান সমাধােনর
চ া করব। থেমই আমরা িতনিট িব র x আর y এর মান বিসেয় িতনিট আলাদা সমীকরণ বর
কের ফিল। এই িতনিট সমীকরেণর format হেব h2 + ah + k 2 + bk + c − r2 = 0 যখােন
a, b, c হল িতনিট constant (মােন আমরা যিদ x আর y এর মান বসাই তাহেল a, b, c এর জায়গায়
িকছু constant মান ওয়ালা সমীকরণ পাব)। আমরা যিদ আমােদর একিট সমীকরণেক বািক ইিট
সমীকরণ হেত িবেয়াগ কির তাহেল আমরা ইিট সমীকরণ পাব যােদর ফরম াট হেব ah+bk+c = 0
টাইেপর। অথাৎ িট সমীকরণ আর িট variable (h, k). খুব সহেজই আমরা h আর k এর মান
বর কের ফলেত পারব। এরপর এেদর মান কােনা একিট সমীকরেণ বিসেয় আমরা r এর মান বর
কের ফলেত পারব। তাহেলই হেব।
তৃতীয় সমাধান- আমরা ি েকাণিমিতর R = abc 4A এই খািটেয় খুব সহেজই দ িতনিট
িব র ি ভুেজর পিরবৃে র ব াসাধ R বর কের ফলেত পারব (এখােন a, b, c হল ি ভুেজর িতনিট
বা র দঘ আর A হল ি ভুেজর ফল)। বৃে র ব াসাধ যখন জেন গিছ তখন আমরা দ িব
িতনিটর যেকােনা িটেত এই R ব াসােধর বৃ আঁকেত পাির যারা সেবা ইিট িব েত পর রেক
ছদ করেব। এই িট িব র কােনা একিটই হেব আমােদর সমাধান বৃে র ক । তরাং আমরা যিদ
িট বৃে র ছদ িব বর করেত পাির তাহেলই এই সম া সমাধান হেয় যায়। িট বৃে র ছদ িব
কীভােব বর করেত হয় তা আমরা া ািমং কে ট বইএ দেখ এেসিছ।
১৬৫
UVa 378 Intersecting Lines
সমস া: িট সরলেরখা দওয়া আেছ। ইনপুেট িতিট সরলেরখার জ তােদর উপর অবি ত িট
আলাদা িব দওয়া থাকেব। খয়াল কর, এখােন ইনপুট িক সরল রখা, সরল রখাংশ না। তা-
মােক বলেত হেব এই িট রখা কীভােব পর রেক ছদ কের। িতন রকম কািহনী হেত পাের- তারা
পর রেক ছদ কের না (যখন তারা parallel হয়), তারা জন একই সরল রখা িনেদশ কের, অথবা
তারা পর রেক একিট িব েত ছদ কের। বলেত হেব এই িতন ঘটনার কানটা ঘেট দ ইনপুেটর
ে । যিদ তৃতীয় ঘটনা হেয় থােক, তাহেল ছদ িব র coordinate ও িদেত হেব।
সমাধান: মেন কর থম রখার িব িট A ও B. আর ি তীয় রখার িব িট C ও D. থেম আমরা
থম িট কস াে ডল কির। আমরা ABC আর ABD এই িট ি ভুেজর signed ফল বর
কির। যিদ দিখ এই িট ফলই শূ , এর মােন এিট ি তীয় কেস পেড়। কারণ ABC ি ভুেজর
ফল শূ মােন A, B, C একই সরল রখায়। আবার A, B আর D ও যিদ একই রখায় হয় তার
মােন A, B, C আর D চারিট িব ই আসেল এক রখায়।
যিদ এই িট ি ভুেজর signed ফল শূ না হয়, িক এেদর signed মান যিদ সমান হয়
তার মােন AB আর CD সমা রাল। এখােন signed ফল তুলনা করা জ ির। কারণ এমন তা
হেতই পাের য AB এর ই পােশ C আর D িক তারা AB এর সােথ সমান ফল তির কের।
িক সে ে েতা AB আর CD পর রেক ছদ কের। তরাং আমােদরেক signed ফল তুলনা
করেত হেব। আর ফল সমান হেল য তারা সমা রাল হয় এই উপপাদ তা ুেলর বইএ আেছ
তাই না?
আর যিদ উপেরর কােনা কস না হয় তাহেল তারা পর রেক ছদ কের। িট রখা দওয়া আেছ,
তােদর ছদ িব কীভােব বর করেত হেব তা া ািমং কে ট বইেয় আমরা দেখিছ। তামরা চ া
কর vector বা প ারােমি ক ফেমর মাধ েম এর সমাধান করার।
১৬৬
কেরিছ। এরপর আমােদরেক চক কের দখেত হেব য, আমরা য বর কেরিছ C এর ডান বাম উপর
িনচ কাথায়, তা িক আসেলই হেত পাের? যিদ হেত না পাের তার মােন C বলেত কউ নাই। আর
যিদ হেত পাের তাহেল তা আমরা তার ই কাণার coordinate পেয় গিছ। এখন তামােদর কাজ
হেব কাগজ কলেম িকছু ছিব এঁেক এই েসস য কাজ কের তা িনেজেক convince করা। িবেশষ
কের, যখন কােনা intersection থােক না তখন এই প িত কন কাজ কের তা বুঝাটাই পূণ।
সমাধান: আমরা যিদ ব িটর আয়তন বর করেত পাির তাহেল তােক যিদ আমরা specific gravity
এর সােথ ন কির তাহেল আমরা একই আয়তেনর তরেলর ভর পাব। আর আমরা এই তরেলর ভর
আর আমােদর ব র ভর তুলনা করেলই বুঝেত পারব য আমােদর ব িট তরেল ভাসেব না ডুবেব।
d এর িলিমেটর িদেক তাকাও। িক বুঝলা? িট গালেকর ক একিট আেরকিটর ভতের থাকেব
না। এখন িট গালক পর রেক ছদ কের যই বৃ তির কের তার ভতর িদেয় একিট তল আঁিক।
এর ফেল এই তেলর ই িদেক িট গালেকর অংশ থাকেব। মেন কর তেলর বাম িদেক আেছ A
গালক আর ডান িদেক B গালক। আসেল তেলর বাম িদেকও B গালেকর িকছু অংশ থাকেব, তেব
তা স ূণ ভােব A গালেকর ভতের থাকেব। এই য তেলর বাম িদেক B গালেকর িকছু অংশ য A
গালেকর ভতের আেছ তােক B গালেকর spherical cap বেল। তামরা চাইেল নেট সাচ িদেলই
এর আয়তন আর পৃ তেলর ফল বর করেত পারবা। অথবা চাইেল আমরা হােত হােত calculus
ব বহার কের এই মান িলর ফমুলা বর করেত পাির। আমরা যিদ এই spherical cap এর আয়তন
বর করেত পাির তাহেল পুেরা গালেকর আয়তন হেত তা িবেয়াগ কের কােনা গালেকর যই অংশ
বাইের আেছ তার আয়তন বর করেত পারব।
আমরা ধের িনেত পাির আমােদর দওয়া িট গালেকর একিট আেছ মূল িব েত আেরকিট আেছ
(d, 0, 0) ত। এবার তুিম XY তল ক না কর। এখােন P, Q ক িবিশ িট বৃ দখেত পােব
যােদর ব াসাধ r1 , r2 আর তােদর মধ বতী র d. মেন কর তারা A আর B িব েত ছদ কের। AB
লাইন টান। এটা তা জানই য AB লাইন বৃে র ক িটর সংেযাগকাির লাইন PQ এর উপর ল ।
মেন কর PQ আর AB এর ছদিব D. আমরা PD আর QD বর করব। আমরা যিদ PD জািন
তাহেল P গালেকর যই অংশ Q গালেকর ভতের আেছ তার আয়তন এবং পৃ তেলর ফল বর
কের ফলেত পারব। একটা িজিনস, তামরা হয়েতা খয়াল কেরছ য আিম P আর Q ক একবার বৃ ,
একবার গালক আর একবার তােদর ক বলিছ। ক বলােত আশা কির আিম কােনা অপরাধ কের
ফিল নাই। তেব অেনেক গালক আর বৃ এই িট ব বহার করায় নােখাশ হেত পার। আমােদরেক
আসেল P আর Q হেত তােদর ছদ তেলর র (বা AB লাইেনর র ) বর করেত হেব।
যাই হাক। তাহেল আমােদর কােছ P A = r1 আেছ, QA = r2 আেছ আর P Q = d আেছ।
আমােদর বর করেত হেব P D এর মান। আমরা যিদ APQ ি ভুেজর উ তা AD (PQ ক ভুিম
ধের) বর করেত পাির তাহেলই িক হেয় যায় কারণ P D2 = P A2 − AD2 . যেহতু APQ
ি ভুেজর িতনিট বা জানা আেছ সেহতু তামরা হরেনর ফমুলা ব বহার কের সহেজই ি ভুেজর
ফল বর করেত পারবা। আবার ি ভুেজর ভুিম উ তা এর ফমুলা ব বহার কের উ তা AD এর
মান বর করেত পারবা যেহতু আমােদর ভুিম PQ জানা। অথবা চাইেল PAD আর QAD ি ভুজ
িটর িপথােগারােসর ফমুলা যিদ িলখ সখান থেকও PD এর মান বর করেত পারবা। মাট কথা
আমরা PD এর মান বর করেত পারব। খয়াল কর PD হল ক হেত cap এর তেলর র ।
তাহেল আমরা আমােদর সম ােক িট গালক হেত একিট গালেক পিরবতন করেত পাির।
আমােদর নতুন সম া হেব- আমােদর একিট গালক দওয়া আেছ যার ব াসাধ r, এবং ক হেত
১৬৭
এর cap এর তেলর র h দওয়া আেছ। বলেত হেব এই cap এর আয়তন কত আর পৃ তেলর
ফল কত।
এবার ক াল লাস এর পালা। আমরা আমােদর কাজ সহজ করার জ ধের নব গালকিট মূল
িব েত আেছ এবং আমরা x = h হেত x = r এই অংশটু র আয়তন এবং পৃ তেলর ফল বর
করেত চাই। এখােন পৃ তল বলেত আমরা ধু গালেকর বাইেরর অংশটু র কথা বলিছ।
যেহতু আমরা x = h হেত x = r পয অংেশর আয়তন জানেত চাই সেহতু আমােদর
integration এর িলিমট হেব h থেক r. আমরা এই h থেক r অংশেক ছাট ছাট dx অংেশ
ভাগ কির। এই ছাট ছাট অংশেক আমরা cylinder িহসােব ক না করেত পাির। কন? আমােদর
গালেকর ক মূল িব েত আেছ। এখন তুিম x = 0 আর x = 1 ইিট plane আঁক। এরপর এই
ই plane ক খুব কােছ আেনা। Plane এর ভতেরর এই অংশটু দখেত cylinder এর মত তাই
না? কারণ এর বাম পােশর অংশ একিট বৃ , ডান পােশর অংশ একিট বৃ । যিদ এই ই plane
খুব কােছ থােক তাহেল আমরা বলেত পাির এই বৃ িটর ব াসাধ ায় সমান, আর সমান হেলই
তা এিট একিট cylinder হয় তাই না? যাই হাক √তাহেল একিট িসিল ডােরর উ তা হেব dx আর
ব াসাধ হেব ∫y. কােনা একিট x এ y এর মান হেব r2 − x2 . তাহেল আমােদর integration এর
r
ফমুলা হেব h f (x) যখােন f (x) = π(r2 − x2 ) dx হেব যিদ আমরা আয়তন বর করেত চাই
√
আর f (x) = 2π r2 − x2 dx হেব যিদ আমরা পৃ তেলর ফল বর করেত চাই। আশা কির
এরকম integration কীভােব করেত হয় তা তামােদর জানা আেছ? ভুেল িগেয় থাকেল বা না জানা
থাকেল calculus বই পড়েত হেব!
১৬৮
সমাধান: Vector বা প ারােমি ক ফেমর মাধ েম িট রখা ছদ কের িকনা বা ছদ করেল সই ছদ
িব িক তা জানার যই প িত সই প িত খািটেয় আমরা সহেজই বর করেত পাির দ রখা বা
রখাংশ দর মােঝ intersection হয় িকনা বা হেল intersection িব িট কানিট।
এখন আরও িকছু কস বািক থােক। একিট কস হল দ চারিট িব ই একই সরল রখার উপর
অবি ত। এই ে যিদ ইনপুেটর কউ সরল রখা হয় তার মােন তােদর মােঝ র 0. আর যিদ
তা না হয়, তার মােন আমােদর ইনপুট িট সরল রখাংশ। সে ে দখেত হেব কােনা রখাংেশর
কােনা একিট া িব অ িটর ভতের আেছ িকনা, থাকেল 0. না থাকেল আমরা জািন এক
রখাংেশর এক া আর আেরক রখাংেশর আেরক াে র মােঝ সবেচেয় কম র পাওয়া যােব।
িক কান া িট? এটা ক কের খুঁেজ বর করার থেক আমরা িতিট pair ( মাট চার ভােব)
চ া কের তােদর মােঝ সবেচেয় কমটা িনেলই পাির।
আেরকিট কস হল যখন দ রখা/ রখাংশ িট সমা রাল হয়। একই ভােব আমরা দিখ জেনর
মােঝ কউ রখা আেছ িকনা। থাকেল আমরা অপর রখা/ রখাংেশর যেকােনা া হেত অপর রখার
উপর ল টানব। সটাই আমােদর optimal র হেব। আর যিদ িটই রখাংশ হয়? তাহেল একটু
ঝােমলার। থমত আমরা া িব র িবিভ ভােব pair িনেয় চ া করব। এরপর আমরা িতিট া
িব হেত অপর রখাংেশর উপর ল টেন দখব য লে র া িব অপর রখাংেশর উপর আেছ
িকনা। থাকেল সই ল র একিট candidate হেব। এরকম সকল candidate এর মােঝ থেক
আমােদর সচেবেয় কম মান িনেত হেব।
আসেল আমােদর বািক যই কস আেছ- দ ইনপুট এর রখা/ রখাংশ পর রেক ছদ কের
না আবার parallel ও না- সে ে ও উপেরর ি তীয় কস খাটেব। অথাৎ আমরা া িব েদর pair
িনেয় তােদর র দখব আর িতিট া হেত ওপর রখাংেশ ল টানব এবং দখব সই লে র
পাদ িব ওপর রখাংশ/ রখার উপর আেছ িকনা।
এেতা গল case analysis. বািক থাকল কােনা একিট িব হেত কােনা একিট রখার উপর
ল টানা। কীভােব করবা? খুব একটা কিঠন না যিদ তুিম parametric equation বা vector
ব বহার কর। মেন কর তুিম C হেত AB রখার উপর ল টানবা। মেন কর AB এর উপর যেকােনা
একিট িব P. আমরা parametric form ব বহার কের P ক িলখেত পাির A + (B − A)t. এখন
যিদ CP আর AB ল হয় তাহেল আমরা িলখেত পাির CP.AB = 0. এখান থেক আমরা t এর
মান সমাধান করেত পাির। একটা উদাহরন কের দখান যাক। মেন কর আমরা C(0, 2) হেত AB
এর উপর ল টানেত চাই যখােন A(−5, 0) আর B(1, 0). তাহেল আমরা AB এর উপর যেকােনা
িব P এর parametric form িলখেত পাির A + (B − A)t বা (−5, 0) + [(1, 0) − (−5, 0)]t
বা (−5, 0) + (6, 0)t বা (1, 0)t বা (t, 0). এখন যিদ CP আর AB ল হয় তাহেল আমরা িলখেত
পাির CP.AB = 0 বা [P − C].[B − A] = 0 বা [(t, 0) − (0, 2)].[(1, 0) − (−5, 0)] = 0 বা
(t, −2).(6, 0) = 0 বা 6t = 0 বা t = 0. তাহেল P এর মান পেত আমরা P এর parametric
form (t, 0) ত t এর মান বসাই। তাহেল P হেব (0, 0). এখােন অব ই অেনক বিশ শূ নওয়ােত
আমােদর িহসাব িনকাশ অেনক সহজ হেয় িগেয়েছ িক আশা কির এেত উদাহরন বুঝেত িবধা হেব।
তুিম এই িহসাব িল যেকােনা A, B, C এর জ করেত পার। তাহেল C হেত AB এর উপর লে র
পাদ িব পেয় যােব।
১৬৯
তাই আমরা িতনিট কের vertex িনেয় চক কের দখেত পাির তারা সমৈরিখক িকনা। যিদ না হয়
তাহেল তােদর িত িটর মােঝ edge আেছ িকনা। ধু এখােন একটা িজিনস খয়াল করবা য একই
িব েক তুিম যন একািধক বার vertex িহসােব ক না কের না বস। কারণ দখা যােব িট রখার
ছদ িব আর অ িট রখার ছদ িব একই হেত পাের। তরাং তুিম যখন vertex এর সট বর
কেরছ তখন সকল duplicate ধের ফেল দেব।
১৭০
Timus 1697 Sniper Shot
সমস া: একিট 3d coordinate িসে েম একজন sniper বেস আেছ। Sniper এর পিজশন
coordinate দওয়া আেছ, ধরা যাক S. একটা লাক A িব হেত B িব েত যােব। A এবং B িব-
র coordinate দওয়া আেছ এবং এই িট িব ই XY ন এর উপর অবি ত। এছাড়াও এখােন
n িট িবি ং (n ≤ 100) আেছ। িতিট িবি ং আয়তাকার ঘনক (rectangular parallelepiped).
এেদর িনেচর তল XY েনর সােথ আেছ। ইনপুট িহসােব XY েন তার িবপরীত ই া এবং
এই িবি ং এর উ তা দওয়া আেছ। Sniper এর িলর বগ infinity. তরাং স লাকেক দখেত
পাওয়া মা ই িল করেত পারেব। লাকিট A হেত B ত যায়। বলেত হেব কান িব েত সবার আেগ
তােক মারা যােব। খয়াল রাখেত হেব তামার িল যন কােনা িব ীং এর ভতর িদেয় না যায়,
চাইেল শ করেত পারেব। আরও বলা আেছ AB রখাংশটা কােনা িব ীং এর ভতর িদেয় যায় না
এবং sniper এর পিজশনও কােনা িবি ং এর ভতর হেব না।
সমাধান: বশ কিঠন সম া। এধরেনর সম া সহেজ কউ কাড করেত চাইেব না। িবেশষ কের
কে ট সমেয়। কারণ এসব সম ায় দখা যায় অেনক ধরেনর কস হয় এবং কাডও অেনক বড় হয়।
তরাং দ না হেল এধরেনর সম ায় AC পাওয়া ায় অস ব। সমাধােনর মূল আইিডয়া িক কিঠন
না। িক খয়াল করেল দখবা এই সমাধােন অেনক িল component আেছ, িতিট component
িনেজরা জিটল হওয়ায় দখা যায়, ব ধরেনর corner case আমরা overlook করিছ। এরপর আবার
দখা যােব precision error িনেয়ও মাথা ঘামােত হে । এজ ই এই সম ােক বশ কিঠন বেলিছ।
তেব একটা িজিনস ভাল য, এধরেনর সম ার ে আমােদর time complexity িনেয় খুব একটা
ভাবেত হয় না।
থেমই দখ য S িক AB রখাংেশ আেছ িকনা। থাকেল A তই মারা স ব। কারণ আমােদর
বলা আেছ য AB রখার উপর কােনা িবি ং থাকেব না। আেরকটা কস হেত পাের S িব AB
রখার উপের (িক AB এর উপর না)। সে ে দখেত হেব য S আর A বা B এর মােঝ িক কােনা
িবি ং আেছ িকনা।
তা না হেল আমরা SAB িদেয় একিট plane ক না করব। আমরা যিদেক ট করব তা িক এই
েন আেছ। সম া হল আমােদরেক বর করেত হেব কান কান িদেক ট করেল AB লাইনেক টাচ
করার আেগই কােনা একিট িবি ংেক িহট করেব। সজ আমরা িতিট িবি ং এর জ বর করব
সই িবি ং আর SAB েনর ছদ অংশ। যেহতু এই ছদ অংশ AB এর উপের থাকেব না সেহতু
হয় তা SAB েন AB এর যিদেক S আেছ সিদেক আেছ নাহয় িবপরীত িদেক আেছ। আবার
যিদেক S আেছ সিদেক থাকেলও হয়েতা দখা যােব S এর পছন িদেক আেছ। আমরা এইসকল
কস ে ডল কের বর করব িতিট িবি ং এর জ AB রখার কান কান অংশ S দখেত পায়
না। এর পর এই দখেত পায়না অংশ িল আর AB িনেয় একটু িহসাব করেলই আমরা থম কান
িব দখেত পায়, বা আদউ কােনা িব দখেত পায় না তা বর করা যােব।
এখন চল এেককিট অংশ কীভােব সমাধান করা যায় তা দখা যাক।
থম অংশ- িবি ং এর সােথ SAB এর ছদ অংশ কীভােব বর করবা। যেহতু িতিট িবি ং
convex সেহতু যেকােনা একিট েনর সােথ তার ছদ অংশ একিট convex polygon হেব। যিদ
িবি ং concave হত তাহেল িক এই কথা সত হত না। তরাং এই আইিডয়া কােজ লাগােয় আমরা
আমােদর সমাধানেক একটু সহজ করেত পাির। আমরা িতিট িবি ংেক এখন থেক 12 িট 3d লাইন
সগেম ট িহসােব ক না করব (অথাৎ ঘনেকর 12িট বা )। আমরা এই িতিট সগেম টেক SAB
েনর সােথ intersect করাব। এরপর যই intersection িব িল পলাম তােদর িনেয় একিট
convex polygon বানাব। তাহেলই আমরা আমােদর 3d ে মেক 2d ত কনভাট করেত পারব।
এই থম অংেশর আবার িট অংশ। থম অংশ- একিট 3d লাইেনর সােথ েনর intersection
করা। এখােন নানা কস থাকেত পাের, যমন হয়েতা 3d লাইন েনর parallel, তরাং তােদর
কােনা intersection নই। বা দখা যােব, পুেরা লাইন সগেম টই এই 3d েনর উপর আেছ।
এই কস িট তামােক খয়াল রাখেত হেব। আর যিদ এই িট কেসর কােনািটই নাহয় এর মােন
তুিম parametric equation ব বহার কের বশ সহেজই লাইেনর সােথ েনর intersection বর
করেত পারেব। এরপর তামােক দখেত হেব এই intersection িব িক আেদৗ লাইন সগেমে টর
উপর অবি ত িকনা। ি তীয় অংশ হল- যখন তুিম সব intersection িব পেয় যােব তখন তােদর
১৭১
convex hull বানােত হেব।
এবার ি তীয় অংশ- িতিট িবি ং এর জ আমরা কীভােব বর করব AB সগেমে টর কান
কান অংশ সই িবি ং ঢেক রেখেছ। খয়াল কর, এখােন িবি ং মােন 3d না, আমরা এর আেগর
অংেশ এেক 2d বািনেয় ফেলিছ। এখন তুিম S এর সােথ িবি ং এর িতিট শীষিব র সংেযাগকারী
লাইন টান। ধরা যাক আমরা এখন িবি ং এর T িব িনেয় কাজ করিছ। তাহেল তুিম দখ ST এর
বিধত অংশ (T এর িদেকর) AB সগেম টেক ছদ কের িকনা। যিদ কােনা শীেষর জ ই ছদ না
কের তার মােন আমােদর এই িবি ং িনেয় কােনা কাজ নই। এই য ST এর বিধত অংশ, AB
সগেম ট এসব য special condition, তুিম যিদ parametric ফেম বা vector ফেম এই লাইন
লাইন intersection বা line plane intersection এসব সমাধান কর তাহেল খুব সহেজই তুিম
parameter এর মান দেখ বুঝেত পারেব য এটা িক লাইন সগেম ট এর উপর আেছ িকনা, বা
T এর িদেকর বিধত অংেশ আেছ িকনা ইত ািদ। এখােনও একই রকম িকছু সম া আেছ, যমন
হয়েতা ST আর AB সমা রাল ইত ািদ। িক এসব ঝােমলা শেষ আমরা পাব য ST এর বিধত
অংশ এর সােথ AB এর ছদ িব । এখােন একটা িজিনস, তাহল ST আর AB যিদ সমা রাল হয়
তাহেল আসেল সটা কান িদেকর infinity তা বর করেত হেব। A এর িদেকর না B এর িদেকর। এর
জ যা করবা তাহল ST এর সােপে SA এর কান আর SB এর কাণ দখবা, যার জ কােণর
মান কম তার িদেকর infinity ক ছদ িব িহসােব িনবা। এবার িবি ং এর সকল শীেষর জ ছদ
িব পেল তুিম একদম বােমর ছদ িব আর একদম ডােনর ছদ িব িনেয় একিট সগেম ট গঠন
করেব যা AB লাইন এর উপর অবি ত। বা অ ভােব বলা যায়- এই লাইন সগেম ট এর অংশটু
এই িবি ং িদেয় ঢেক থাকেব।
এবার তৃতীয় অংশ- ি তীয় অংশ শেষ আমােদর ে ম এখন 1d ত চেল এেসেছ। িতিট িবি ং
এর জ আমরা এখন AB লাইেনর উপর একিট কের সগেম ট পেয়িছ, যা S থেক দখা যায় না।
হল AB এর কান িব থম S থেক দখা যায়। খয়াল কর, এমন হেত পাের য, একিট
িব [A, C] অংশ ঢেক রেখেছ আেরকিট িবি ং [C, B] অংশ ঢেক রেখেছ (A < C < B).
সে ে িক তুিম আসেল C িব দখেত পাও। কারণ বেলেছ য তামার িল িবি ংেক শ
করেত পাের। িক যিদ এখােন আেরকটা িবি ং থাকত যা [A, B] পুরটা ঢেক রাখত, তাহেল িক
C দখেত পারেব না। িক এই িট ে ই তুিম িক A আর B িট ানই দখেত পােব। তরাং
এইসকল কস মেন রেখ আমােদর সমাধান করেত হেব। আমরা এই সগেম ট িলর া িলেক
event িহসােব ক না কির। A এর িদেকর event হল starting আর B এর িদেকর event হেব
ending. A এর িদেকর event িল আেগ থাকেব এইভােব আমরা সকল event সট করব। যিদ
একই িব েত একািধক event থােক তাহেল আমরা ending ক আেগ রাখব আর starting ক
পের। এভােব সকল event ক সট কির। এরপর এই সট করা event িলেক এেক এেক েসস
কির। আমরা একটা counter রাখব যার মান েত শূ । যখন আমরা starting event পাব তখন
তােক এক বাড়ােবা, আর যখন ending event পাব তখন এক কমাব। এই এক বাড়ােনার আেগ বা
এক কমানর পের আমরা দখব য counter এর মান শূ িকনা। যিদ শূ হয় এর মােন এিট একিট
candidate িব । আমরা দখব এই িব AB সগেম ট এর উপের আেছ িকনা। থাকেল এই িব ই
সমাধান। িক এরকম যিদ কােনা িব না পাও তার মােন কােনা সমাধান নই। এখােন একটাই
িজিনস খয়াল রাখেত হেব, আর তাহল আমােদর এর আেগর অংেশর infinity যন এখােন িঠক মত
া ডল হয়।
১৭২
পার তাহেল বািকটু ডাল ভাত।
এই ধরেনর সম ােক বলা হয় packing সম া। এখােন তামােক ছাট বৃে র ব াসাধ বর কর-
ত হেব যন সব বৃ একে pack হেয় থােক। এধরেনর সম ার ে শ িব আর symmetry
ক খুব ভাল কের খয়াল করেত হয়। আর এধরেনর সম ায় ায়ই দখা যায় binary search ব -
বহার করেল সম া অেনক সহজ হেয় যায়।
যমন এই সম ার ে , আমরা ছাট ছাট বৃে র ক িলেক যাগ কের একিট সম n ভুজ
(n sided regular polygon) বানােত পাির যার ক হেব বৃে র ক । যিদ n < 3 হয় তাহেল
িক িঠক মত সমভুজ তির হেব না। তরাং তুিম ওেদরেক আলাদা কের া ডল কের ফল। তাহেল
আমরা এখন মেন করেত পাির n ≥ 3. এখন আমােদর যা করেত হেব তা হল এই সমভুেজর সােথ
বড় বৃে র স ক বর করেত হেব। একটা খুব সহজ স ক হল এেদর ক িট একই। এখান থেক
আমরা বলেত পাির, ক থেক সমভুেজর কােনা িব র রে র সােথ ছাট বৃে র ব াসাধ যাগ
করেল আমরা বড় বৃে র ব াসাধ পাব। এই সমীকরণ সমাধান করেলই আমরা ছাট বৃে র ব াসাধ
পেয় যাব।
মেন কর আমােদর ছাট বৃে র ব াসাধ r. তাহেল সমভুেজর এক বা র দঘ হেব 2r. এখন এই
বা র দেঘ র সােথ ক হেত সমভুেজর শীেষর রে র স ক িক? আমরা সমভুেজর একিট বা র
িট া েক কে র সােথ যাগ কির। যেহতু সমভুেজ n িট বা িমেল কে 2π কাণ তির কের
সেহতু একিট বা 2πn কাণ তির করেব। আর এই য বা িট কে র সােথ য ি ভুজ তির কের
তা একিট সমি বা ি ভুজ। আমােদর ল এই সমি বা ি ভুেজর অ িট বা র দঘ বর করা
যখােন সমভুেজর বা র দঘ 2r. কীভােব বর করেব? আমরা ক হেত ঐ বা র উপর একিট
ল টািন। তাহেল এই ছাট ি ভুজ একিট সমেকাণী ি ভুজ হেব যার অিতভুজ আমােদর বর করেত
হেব। আমােদর ভুিমর দঘ r, কাণ nπ . তরাং আমােদর অিতভুজ হেব r/ sin nπ . এিটই হল ক
হেত সমভুেজর শীষ িব র র । এর সােথ r যাগ করেল এিট হেব বড় বৃে র ব াসাধ R. অথাৎ
r + r/ sin nπ = R যখােন r unknown. আমরা এই সমীকরণেক খুব সহেজই সমাধান করেত
পাির।
সমাধান: সম ােত দওয়া িচ িট ভাল কের খয়াল কর। িচে র বগিট বাম ডান ব ালা কের আেছ।
এছাড়াও খয়াল কর বেগর ডান আর বােমর শীষ িট প ভুেজর বা র উপর আেছ। এই টু তথ
ব বহার কের আমরা বেগর সাইজ বর কের ফলেত পাির।
বগ আর প ভুেজর যই শীষ একই িব েত তা থেক িবপরীত বা র উপর ল টান। তামার
বেগর ক অব ই এই লে র উপর থাকেব। তুিম এই ক এর উপর binary search করেত পার।
ক বিশ িনেচ ধরেল বগ অেনক বড় হেব ফেল বেগর শীষ প ভুেজর বাইের চেল যােব। আবার
যিদ ক বিশ উপের হেয় যায় তাহেল বগ বিশ ছাট হেব। এবং এর ফেল বেগর শীষ প ভুেজর
ভতের থাকেব। এরকম কের binary search করেল দখেব একসময় বেগর শীষ প ভুেজর উপের
থাকেব। এই বেগর সাইজই হেব আমােদর উ র। আসেল বেগর শীষ প ভুেজর ভতের না বাইের
তা চক করা ওত কিঠন না। তুিম প ভুেজর বা সােপে turn দখেব তাহেলই হেব (point in
a polygon technique). আরও একিট িজিনস খয়াল কর, তামােক এই binary search িক
িত ইনপুেট করেত হেব না। তুিম যিদ 1 দেঘ র প ভুেজর জ উ র বর কর a, তাহেল f দেঘ র
প ভুেজর জ উ র হেব f a.
এছাড়াও তুিম চাইেল বেগর বা র দেঘ র জ ফমুলা বর করেত পার। বাইনাির সাচ না কেরও
এই সম া সমাধান করা স ব।
১৭৩
UVa 10695 Find the Point
সমস া: একিট ি ভুজ ABC এর িতনিট শীষ িব র coordinate দওয়া আেছ। সই সােথ এর
ভতের একিট O এর জ ̸ AOB, ̸ BOC, ̸ AOC দওয়া আেছ। তামােক O এর coordinate
ি ট করেত হেব অথবা বলেত হেব এমন কােনা O নই।
সমাধান: মেন কর একিট বৃ আেছ যার একিট জ া হল AB. এখন তুিম যিদ AB এর যেকােনা এক
িদেকর বৃ চাপ নাও তাহেল সই চােপর যেকােনা িব েত AB একই পিরমান কাণ তির করেব।
উলটা ভােব বলেল বলা যায়- মেন কর AB দওয়া আেছ আর বলা আেছ O িব েত AB ̸ AOB
তির কের। তাহেল আমরা এমন একিট বৃ আঁকেত পাির যার একিট জ া AB এবং সই বৃ চােপর
উপের েত ক িব েত AB জ া ̸ AOB তির করেব।
অথাৎ মেন কর A আর B fixed আর ̸ AOB ও fixed. তাহেল O িব র লাকাস (locas)
হেব একিট বৃ চাপ। আসেল একিট বৃ চাপ বলা িঠক হে না। AB এর এক পােশ O এর লাকাস
একিট বৃে র চাপ আর আেরক পােশ আেরক বৃে র চাপ। আমােদর এই সম ায় আমরা এমন একিট
বৃ চাপ নব যন ̸ AOB এর মান দ মােনর সমান হয় আর এই চাপিট AB এর যিদেক C আেছ
সিদেক থােক। এই কাজ করা িক কিঠন না। আমরা িক চাইেল মেন করেত পাির OA = OB.
এটা মেন করেল OAB হেব সমি বা ি ভুজ। তরাং O এর coordinate বর করা বশ সহজ
হেব। আসেল এরকম িট O এর coordinate পাওয়া যােব। যিট AB এর য পােশ C আেছ তােক
নব। এরপর A, O আর B িদেয় যই বৃ যায় তার সমীকরণ বর করব। একই ভােব আমরা A,
O আর C িদেয় যাওয়া বৃে র সমীকরণ বর করব। এরপর এেদরেক intersect করেলই আমরা O
পেয় যাব। যিদ এই O ি ভুেজর ভতের থােক তার মােন আমােদর সমাধান আেছ, আর না হেল
সমাধান নই।
১৭৪
নকশা ১১.১: Latitude এবং Longitude, wikipedia হেত
এেত কের আমরা longitude ক খুব সহেজই x, y এ পিরনত করেত পারব। মেন কর ϕ হল
longitude. এখন আমােদর িব েথেক সরাসির িনেচ XY েনর উপর ল টান। আমরা এই িব র
x, y িনেয় আ িহ, কারণ এর x, y ই হল আমােদর িব র x, y. গালেকর ক থেক এর র
cos θ. এবার x = cos θ sin ϕ আর y = cos θ cos ϕ.
তরাং এেতা সাধনার পর আমরা latitude longitude হেত আমােদর দ িব িটর x, y, z
বর কের ফলব।
এখন আেসা এর যত special case আেছ সব েলােক আমরা া ডল করব। আমােদরেক
বেলেছ য এক িব হেত অপর িব েত shortest path এ যেত হেব এবং এই shortest path
এর উপেরর সবেচেয় north most িব ি ট করেত হেব। যিদ এই উ র unique নাহয় তাহেল
undefined বলেত হেব।
যিদ দ িট িব একই হয় এর মােন আমােদর shortest path এর দঘ 0. তরাং আমােদর
উ র হেব আমােদর ইনপুট এর িব িটই।
যিদ দ িব িটর একিট north pole এ থােক তার মােন তােদর মােঝর যত shortest path
সব তা north pole িদেয় যােব। তরাং north pole হেব উ র। এছাড়াও যিদ ইনপুেটর কােনা
িব south pole এ হয় তাহেলও ঐ একই কথা, আমােদর যেকােনা shortest path ই north
pole িদেয় যােব।
এসব বােদ যিদ আমােদর ইনপুেটর িব গালেকর কে র সােপে opposite এ থােক (অথাৎ
তারা একিট ব াস গঠন কের) তাহেল তােদর িদেয় অসংখ বৃ তির হয় যার ক গালেকর ক ।
তরাং এে ে unique কােনা উ র নই।
এবার হল আমােদর মূল সম া। আমােদরেক গালেকর ক েক ক কের ইনপুেটর িট িব
িদেয় যায় এরকম একিট বৃ আঁকেত হেব। সিট গালেকর সবেচেয় উপেরর য িব িদেয় যায় তােক
ি ট করেত হেব। বা এেক অ ভােব দখেত পার। মেন কর দ িট িব আর গালেকর ক
িদেয় একিট ন আঁিক। এিট গালেকর সবেচেয় উপেরর য িব িদেয় যােব সিটই উ র, অব
চক করেত হেব য সই িব িট আেদৗ আমােদর ইনপুেটর িট িব র মােঝর shortest path এর
উপর আেছ িকনা।
মেন কর আমরা জািন আমােদর উ েরর িব X, ক O আর ইনপুেটর িট িব A আর B.
তাহেল ̸ AOB বর করব। সই সােথ দখব ̸ AOX + ̸ BOX এর মান ̸ AOB এর থেক বড়
না ছাট না সমান। ছাট তা কখনই হেব না। যিদ বড় হয় এর মােন X িব A আর B এর মােঝর
১৭৫
shortest path এ থাকেব না। সে ে উ র হেব A আর B এর মােঝ য িব িট সবেচেয় উ ের
থােক। অ থা X িব িটই আমােদর উ র।
তরাং হল X কীভােব বর করব। আমরা এখােন একটু vector আর calculus ব বহার
করব। আমরা OA আর OB vector জািন, কারণ A আর B এর coordinate জািন। এই ভ র
িট হল (xA , yA , zA ) আর (xB , yB , zB ). এেদরেক যিদ আমরা cross product কির তাহেল
আিম যই plane এর কথা বলিছলাম তার normal vector পাব। আর normal vector জানা
মােনই ঐ ন জানা। কারণ কােনা একিট নরমাল ভ র তা একিট মা েনরই normal হেত
পাের তাই না? ধরা যাক এই নরমাল ভ র হল N = (xN , yN , zN ) যার সব িল component
এর মান আমােদর জানা। এখন মেন কর আমােদর optimal িব হল (x, y, z). এই িব িট যমন
গালেকর উপর আেছ িঠক তমিন েনর উপেরও আেছ। এখন একটু িচ া কের দখ তা এই িব িট
আমােদর নরমাল ভ র এর সােথ িক স ক তির করেব? সহজ, এেদর মােঝর কাণ সমেকাণ বা
90 িড ী। িট ভ র 90 িড ী এর equation কীভােব িলখবা? এটাও সহজ, এেদর মধ কার
dot product শূ হেব। তরাং আমরা িলখেত পাির xxN + yyN + zzN = 0. আবার যেহতু
(x, y, z) এই িব িট গালেকর উপের আেছ। তরাং আমরা িলখেত পাির x2 + y 2 + z 2 = 1.
আমােদর কাজ হল এই িট equation ক িস কের এরকম সবেচেয় বড় z এর মান বর করা।
আমরা থম equation থেক x এর মান ি তীয় সমীকরেণ বিসেয় z এর একিট equation দাঁড়
করােত পাির এবং এরপর চ া করেত পাির বর করেত য z এর সেবা মান কাথায় হেব। অথবা
চাইেল lagrange multiplier মথড খাটােত পার। এই িট ে ই বশ বড় সর ক া ুেলশন করেত
হেব। একটু ধয ধরেত করেত হেব আর িক।
১৭৬
হল। তরাং আমরা এই convex hull এর উপর থেক আসেল িতনিট িব িনবাচন করেত পাির
যার ভতের মূলিব আেছ ( যেহতু কনেভ হােলর ভতের মূল িব িছল)। বািক লর ai আমরা
শূ কের িদেত পাির। এখন আমরা দিখ য এই বািক িতনিট িব র ai িক বর করা যায় িকনা যন
আমােদর সমীকরণ িস কের। এখন এখােন িট equation, একিট x এর আেরকিট y এর, আর
ভ ািরেয়বল িতনিট। এর মােন এর সমাধান আেছই। তেব ai ≥ 0 হেব িকনা তা একটু িচ ার িবষয়।
আিম িনেজও এর মাণ এই মুহূেত করেত পারিছ না। িক ঐ য, া ািমং কে টে সব িকছু য
মাণ করেত হয় তা কথা নই। তামার যিদ আ হ থােক তাহেল মাণ করেত পার, আর তা নাহেল
intuition এর উপর িভি কের কের ফলেত পার।
১১.১ অ শীলনী
১১.১.১ সম া
Simple
১৭৭
Easy
Timus 1703 Robotic Arm
Timus 3114 Spherical Mirrors
UVa 10287 Gifts in a Hexagonal Box
Medium
UVa 11580 Finding the Transmitter
UVa 10402 Triangle Covering
UVa 11123 Counting Trapezoid
১৭৮