Problem: FIL File Paths swedish BOI 2015, dag 2. Tillgängligt minne: 256 MB. 1.05.2015 Byteasar tycker om att leva farligt. Han springer med saxar, skickar in lösningar på tävlingsproblem utan att testa exampelindata, och vill att alla sina filer ska ha filvägar som är precis så långa som operativ systemet tillåter (på Linux, till exempel, är det 4095 tecken). När Byteasar arbetar på någon annans dator kan det hända att vissa filer inte uppfyller hans krav. I det fallet försöker han att introducera symboliska länkar (symlänkar) och skapa filvägar med hjälp av dem. Du har fått i uppgift att bestämma, för varje fil i filsystemet, om det är möjligt att introducera en enda symbolisk länk (med en förbestämd längd), så att filen kan refereras till med en filväg av längd precis k tecken. Om en fil med namn file är sparad i en kedja av mappar dir1, dir2,..., dirj så är dess absoluta filväg /dir1/dir2/.../dirj/file. Rotmappen kan refereras till med uttrycket / och en fil som är sparad direkt i den mappen har den absoluta filvägen /file. En symbolisk länk är en namngiven genväg till en mapp, som kan placeras i vilken mapp i filsystemet som helst (i det här problemet är en symlänk till en fil inte tillåten). Med hjälp av en symlänk så kan vi uppnå alternativa filvägar. Till exempel, om vi introducerade en symlänk till / med namnet hello i /, så skulle /dir/file, /hello/dir/file och /hello/hello/dir/file referera till samma fil och ha filvägar med olika längd. Som ett ytterligare exempel, med en symlänk till / med namnet hi i dir kan vi få filvägarna: /dir/file, /dir/hi/dir/file, /dir/hi/dir/hi/dir/file. Notera att det är tillåtet för en symlänk att peka uppåt, nedåt eller i sidled i filsystemets hierarki, det är tillochmed tillåtet att peka till mappen där symlänken är placerad. I det här problemet är filvägskomponenterna./,../ och // inte tillåtna i filvägar. Indata Första raden i indata innehåller tre positiva heltal: n (antalet mappar som inte är rotmappen), m (antalet filer), och k (den eftersökta längden för en filväg). Rotmappen numreras med 0 och de andra mapparna numreras från 1 till n. Filerna numreras från 1 till m. Andra raden innehåller längden s på den symlänk som får användas (vi bryr oss inte om namnet i sig och utgår ifrån att det inte är detsamma som något annat i filsystemet). Därefter följer n rader som beskriver mapparna i filsystemet. Rad i av dessa beskriver mapp i och består av två heltal p i och l i. De anger att mapp i har ett namn av längd l i och dess föräldramapp (d.v.s den mapp som mapp i är placerad direkt i) har nummer p i. Det är garanterat att p i < i. Slutligen följer m rader med beskrivning av filerna i filsystemet. Rad j av dessa beskriver fil j och består av heltal p j och l j. De anger att fil j har ett namn av längd l j och att filen ligger i mapp p j. Alla filer och mappar har namn med positiv längd och deras absoluta filvägar kommer att vara som mest k tecken lång. Utdata Ditt program ska skriva ut m rader, en för varje fil. Rad j ska innehålla antingen eller NO, som besvarar frågan: Är det möjligt att, genom att introducera en symlänk av längd s, skapa en filväg av längd precis k som refererar till fil j? v. 3.1 File Paths 1/2
Exempel 2 4 22 2 0 1 1 5 2 13 2 10 1 4 0 7 NO Förklaring av exempel: Låt oss kalla vår symlänk LL, mapparna a och bbbbb, och filerna ccccccccccccc, dddddddddd, eeee och fffffff. Rotmappen innehåller mappen a och filen fffffff; mappen a innehåller mappen bbbbb och filen eeee; och slutligen mappen bbbbb innehåller filerna ccccccccccccc och dddddddddd. / -- a -- bbbbb -- ccccccccccccc +-- dddddddddd +-- eeee +-- fffffff I det första fallet är den absoluta filvägen /a/bbbbb/ccccccccccccc redan av längd k, så vi behöver inte använda vår symlänk. I det andra fallet kan vi introducera symlänken /a/ll -> /a och referera till /a/ll/bbbbb/dddddddddd. I det tredje fallet kan vi introducera symlänken /a/ll -> / och referera till /a/ll/a/ll/a/ll/a/eeee. I det fjärde fallet kan vi inte uppnå vårt mål oavsett vilken symlänk vi väljer. Poängsättning För alla deluppgifter gäller 1 k, s 1 000 000. Deluppgift Begränsningar Poäng 1 n, m 500 33 2 n, m 3 000, symlänken behöver som mest användas en gång per fil 33 3 n, m 3 000 34 v. 3.1 File Paths 2/2
Problem: HAC Hacker swedish BOI 2015, dag 2. Tillgängligt minne: 256 MB. 1.05.2015 Hackern Byteasar har kvalificerat sig till årets IHO, Internationella Hackingolympiaden. En uppgift handlar om att tävla mot en systemoperatör. Det finns n datorer numrerade från 1 till n, länkade i en ring, d.v.s. dator i och dator i + 1 är länkade (för i = 1,..., n 1), och dator n och 1 är länkade. Tävlingen är ett spel mellan hackern och systemoperatören: Byteasar gör första draget. Därefter turas operatören och Byteasar om. I sitt första drag väljer Byteasar en dator och hackar den (genom att till exempel utnyttja en svaghet i operativsystemet). I sitt första drag väljer operatören en dator som inte är hackad och skyddar den (till exempel genom att installera den senaste säkerhetsuppdateringen). I alla sina andra drag väljer Byteasar antingen att (a) göra ingenting eller (b) välja en dator som varken är hackad eller skyddad och är direkt länkad till en hackad dator, och hacka den. I alla sina andra drag väljer operatören att antingen (a) göra ingenting eller (b) välja en dator som inte är hackad och är direkt länkad till en skyddad dator, och skydda den. Spelet tar slut när det har gått två drag där båda spelarna väljer att göra ingenting. I början av spelet är ingen dator hackad eller skyddad. Varje dator i har ett värde v i som beskriver hur värdefull data som finns på datorn. För varje hackad dator i får Byteasar v i poäng. Byteasar är en ganska duktig hacker, men han kan ingenting om algoritmer. Därför ber han dig skriva ett program som avgör hans maximala poäng, givet att operatören spelar optimalt. Indata Första raden i indata innehåller ett positivt heltal n (n 2), som anger antalet datorer. Andra raden innehåller en sekvens av n positiva heltal v 1, v 2..., v n (1 v i 2 000); talet v i beskriver hur värdefull data som finns i dator i. Utdata Ditt program ska skriva ut en rad med ett heltal: Byteasars maximala poäng mot en operatör som spelar optimalt. Exempel 4 7 6 8 4 5 1 1 1 1 1 13 3 v. 3.2 Hacker 1/2
Förklaring av exempel: I det första exemplet ska Byteasar hacka dator 2 med sitt första drag (och få 6 poäng). Operatörens drag blir då att skydda dator 3. I nästa drag hackar Byteasar dator 1 (och får 7 poäng). Slutligen skyddar operaören dator 4. Poängsättning Deluppgift Begränsningar Poäng 1 n 300 20 2 n 5000 20 3 n 500 000, att hacka dator 1 med sitt första drag är optimalt för Byteasar 20 4 n 500 000 40 v. 3.2 Hacker 2/2
Problem: TUG Dragkamp swedish BOI 2015, dag 2. Tillgängligt minne: 256 MB. 1.05.2015 Dragkamp är en populär sport i Byteland. Reglerna är enkla: två lag drar i ett rep i motsatta riktningar. Bytelands årliga välgörenhetsdragkamp äger rum och många har anmält sig. Som chef för rättvisa och bekämpande av osportslighet är det din uppgift att dela upp deltagarna i två lag så att kampen kan hålla på länge. Då 2n deltagare har anmält sig ska varje lag bestå av n deltagare. Repet har n positioner på vänster sida och n positioner på höger sida. Dragkampseliten i Byteland är kräsen: varje deltagare har precis en position på vänster sida och en position på höger sida som han eller hon tycker om. Dessutom känner du till varje deltagares styrka. Organisatören frågar dig följande: Givet ett heltal k, är det möjligt att skapa två lag, så att varje lag har n deltagare, varje deltagare får en position som han eller hon tycker om (självklart kan inte två eller fler deltagare stå på samma plats), och summan av styrka för respektive lag skiljer sig med som mest k? Indata Första raden innehåller ett positivt heltal n, som anger antalet positioner på varje sida av repet, och ett heltal k 20n, som anger den maximala skillnaden i styrka mellan lagen. Låt oss för enkelhetens skull numrera deltagarna från 1 till 2n. Därefter följer 2n rader där varje rad beskriver en deltagare: rad i innehåller 3 positiva heltal l i, r i och s i (1 l i, r i n, 1 s i 20), som anger att deltagare i har styrka s i och vill stå på antingen position l i på vänster sida av repet eller position r i på höger sida av repet. Utdata Ditt program ska skriva ut en rad med antingen eller NO, beroende på om det är möjligt att skapa två lag som uppfyller de givna kraven eller inte. Exempel 4 1 1 1 1 2 1 2 2 2 8 1 2 2 3 3 5 3 3 2 4 4 1 4 4 2 v. 3 Dragkamp 1/2
2 5 1 1 1 1 2 4 2 2 1 2 1 4 NO Förklaring av exempel: I det första exemplet kan vi låta deltagare 1, 3, 6 och 7 vara på vänster sida (vilket ger ett lag med styrka 1 + 8 + 2 + 1 = 12) och deltagare 2, 4, 5 och 8 på höger sida (vilket ger ett lag med styrka 2 + 2 + 5 + 2 = 11). Skillnaden mellan lagens styrkor är 1. I det andra exemplet måste båda deltagarna med styrka 4 vara i samma lag, alltså är den minimala skillnaden i styrka mellan lagen 6. Poängsättning Deluppgift Begränsningar Poäng 1 n 10 18 2 n 2000 30 3 n 30 000, s i = 1 23 4 n 30 000 29 v. 3 Dragkamp 2/2