SPOILER ALERT: в комментариях и теле этого поста, скорее всего, будут обсуждаться задачи соревнования, поэтому если вы участвуете в каком-либо онлайн-зеркале, либо хотите порешать задачи самостоятельно, будьте к этому готовы.
Совсем текущее состояние: У Саши 63 место, у Егора 38 место, у Денис 27 место и у Вовы 19 место. Итого, три серебра и одно золото, причём, у Дениса самое первое серебро, что, конечно, очень обидно, но всё равно очень классно. Есть куда расти в следующем году!
Текущее состояние на момент конца тура: Тур длился 5:30, последние 25 минут табличка не обновлялась. За это время Саша успела улучшить результат по последней задаче до 50, чем, скорее всего, гарантировала себе серебро! Основная интрига для нас заключается в том, много ли участников оказались выше Дениса в итоге, или нет: до падения таблицы результатов Денис был на 24 месте, а золотых медалей, если мы ничего не путаем, 26.
Сейчас будет показ результатов, на котором по идее должны рассказать о текущем состоянии. Впрочем, мы подозреваем, что полные результаты появятся не скоро.
05:21: Тур продлён на 30 минут (минимум). По неподтверждённой информации, у них возникли серьёзные проблемы с тестирующей системой. Таблица не обновляется.
05:05: Саша и Денис все ближе к границам, волнуемся. К тому же нет гарантии, что текущая таблица правильная.
05:02: Сообщают, что контест продлен, неизвестно, на сколько именно.
04:51: Саша успевает набрать 13 по simurgh и теперь более уверенно попадает в серебро.
04:49: В последние минут Егор пихает books, Денис что-то шлет по simurgh.
04:46: САША!!! Смогла 90 по prize! Граница серебра, но какой все же камбэк!
04:33: yutaka1999 300. voidmax добил books на 50, точно золото. Denisson опасно болтается на границе.
03:54: К нам вернулся интернет. voidmax тоже смог сдать simurgh на 51.
03:30: Тем временем, у xumingkuan 70 по simurgkh, это первый участник, кто справился с полным графом.
03:15: Egor.Lifar и Denisson продолжают слать books, demon1999 послала simurgh на 0.
03:10: наш прогноз на границы медалей: золото 350, серебро 250, бронза 170.
03:03: Denisson привез 50 по books! С хорошей вероятностью наше первое золото. Egor.Lifar преодолел ноль по этой же задаче.
02:52: voidmax все же смог набрать 12 по books.
02:49: Egor.Lifar пытается улучшить свои 51 по simurgh, voidmax пытается получить больше нуля по books (upd: Egor.Lifar тоже посылал books, и тоже на 0).
02:44: У arsijo теперь тоже 90+51+0 и пятое текущее место в общем зачете. С хорошей вероятностью это уже окончательное золото.
02:42: demon1999 за последний час несколько раз посылала prize, но все на 20. Переживаем.
02:37: То же самое сделал и kilt_01. Если все эти ребята соберут и очень популярные 50 по books, у всех с хорошей вероятностью уже будет не хуже серебра.
02:27: К клубу набравших присоединяется giraffeh и подбирается вплотную к границе золота.
02:21: То же самое делают и Arthur и Mediocrity.
02:19: Egor.Lifar тоже набирает 51 по simurgh. Пока участников с таким баллом меньше десяти, приятно, что двое из них из России. #interactivepride
02:14: Помимо трех русских участников в текущей зоне золота находится arsijo из Украины, благодаря отличному результату на первом туре. Довольно близки к границе MadNick из Казахстана, а также kefaa и gepardo из Беларуси.
02:03: Опасный Lukas Michel из Германии первым на этом туре решил две задачи (практически) полностью: books и prize.
01:57: demon1999 все-таки включилась в набирание баллов по prize, начала с простого бинпоиска за 20.
01:55: Egor.Lifar и voidmax перебрали все остовы и набрали 13 по simurgh.
01:42: У Denisson 51 по simurgh.
01:39: У американца, чудом приехавшего на IOI вместе с делегацией Китая, 90+, 51 и 50. Кажется, это ровно те баллы, для получения которых не надо придумать что-то нестандартное.
01:27: Участник из Германии получил первую сотню по books.
01:20: Chmel_Tolstiy замечает, что команда Таиланда занимает 91, 92, 94 и 95 места.
01:19: demon1999 решила набрать 12 баллов по books.
01:13: В топ-20 три участника из России, один из Украины и двое из Грузии.
01:03: А вот и voidmax ворвался с 97.42 по prize. Уже порядка двадцати участников имеют ≥ 90 баллов, скорей всего, эти баллы будут необходимым условием для серебряной медали.
00:57: Egor.Lifar тоже быстро справился набрать все необходимые баллы по prize. Володя и Саша пока с нулями, ждем от них сразу хороших баллов.
00:40: У Denisson 94.9 баллов по prize, это очень хороший старт. Кроме него 90+ по prize у какого-то участника из Таиланда.
00:27: Появились 50 баллов по books и 13 баллов по simurgh от sancho. Denisson также заработал свои 20 баллов по prize.
00:09: Таблица результатов обновилась и в ней стали появляться первые участники с 20 баллами по первой задаче.
00:00: Соревнование началось по расписанию.
Всем привет!
Через полчаса начнётся второй тур международной олимпиады школьников. Вчера ребята посетили шестую по высоте башню мира Milad Tower; фотки с экскурсии, как обычно, можно увидеть в нашем телеграм-канале.
Мы с Михаилом Endagorion, как и позавчера, будем делиться мыслями по поводу происходящего на туре. Напомним, что по итогам первого тура 21 место (в официальном зачёте) занимает Владимир voidmax Романов, 28 место принаждлежит Денису Denisson Шпаковскому, на 37 месте расположился Егор Egor.Lifar Лифарь, и, наконец, на 54 месте находится Александра demon1999 Дроздова. Также отметим выдающийся результат украинского школьника Антона arsijo Ципко, занимающего на текущий момент 7 место.
Пожелаем всем участникам удачи!
Полезные ссылки (список будет пополняться):
- Обсуждение первого дня.
- Официальная таблица результатов.
- Таблица реузльтатов от неутомимого snarknews с множеством разной дополнительной интересной информации.
- Список всех участников IOI в соответствии с прекрасной базой данных
- Сайт IOI
- Пост от SeyedParsa, посвящённый IOI.
- Онлайн-трансляция на Яндекс.Контесте.
When will they start? And when will mirror start?
They have started 8 minutes ago. Don't know much about the mirror, isn't it 1 hour after the competition start?
The mirror contest is now available at Yandex.
Early statements, please :D
Statements uploaded by jonathanirvings http://jonathanirvin.gs/files/ioi2017/day2/
Breathe deeply, be strong, wait for mirror, be strong...
Here you can see the problems and their translations.
Deleted
.
It was link to standings of onsite IOI... What did you expected, upvotes for weak "never gonna give you up"? :/
SmallBoy, sancho, MadNick, Nurlykhan go++ :)
The scoring scheme for Prize is terrible.
Yesterday I also realized that the distribution of this problem is not good (only 20, 90-100 assuming most people got subtask 1, which is relatively easy). During the yesterday's GA meeting, I raised a minor objection about this. However, the answer from the ISC is satisfying (believe me), so now I am agree with the scoring :)
My opinion is that the curve should be similar regardless of difficulty. Now contestants who happens to suddenly don't know how to do / have bugs are severely punished. Now it seems that the whole IOI (bronze) will be decided by this 70 points.
Just my own opinion though.
Can we ask what was the answer?
Do you have any ideas about that problem?
Thanks to msg555, the farming edition is up and running again!
(warning: it has sound)
lol I quickly found out all other teams, but wondered which team is the hydralisk
copied from his source code
На яндекс контесте выдает CE с комметарием
Error pushing file: grader.pas
Это мой косяк или технические проблемы?
Upd увидел объявление
пожалуйста, не игнорируйте объявления жюри, задача prize is under construction
Сервер лежит или доступа нет с Ирана?
jerry's struggle for that 100 in The Big Prize tho lol
edit:
![](/predownloaded/3d/b3/3db30254efdb4493ba991c3ddf4bf6b22afe6391.png)
Ого, а как там в Тегеране ситуация с хиджабом? Все так же его напяливают на участниц под страхом административки?
yutaka1999! Go for the winner!
MASSIVE CONGRATULATIONS yutaka1999!! Winning both IMO and IOI , impressive... Is he second person in history to achieve this, after Reid Barton as far as I remember?
I wondered if he would like to share how he accomplished such an impressive achievement.
"Hello sir, how to become red in one year? Looking forward to you answer, best wishes."
By the way, Swistakk, now you certainly don't want to take this bet.
I still do. When writing that I also took into account that you will get familiar with IOI format during participating in 100 IOIs :D.
Actually Reyna became red in one year
Congratulations, nice double win!
Let's go to major international tournaments together next year and compete for the titles :)
They just announced on the stream that the contest has been extended by 15 minutes because of technical issues, so there's 23 minutes to go!
Thanks for info!
Now they're saying "by at least 15 minutes, maybe longer".
To summarize what was told on the stream, the judging system still doesn't seem to work well, there's a big queue and it's not clear when the contest will end. So far it seems that it has been extended by 15 more minutes, for total duration of 5:30.
А граница бронзы это выше 100 баллов ?
Граница бронзы — минимальный результат что медали получают не больше половины участников.
Ясно,спасибо за информацию eduardische !
rpeng just announced on the stream that 15 minutes more have been added.
Did they give any reasons for the extension?
He briefly mentioned that there was a large queue and that feedback took more than five minutes.
Is time on submission indicate the "time of judge" rather than "time of submit?"
And I'm nearly getting heart attack for every time extend..
According to the current state of the contest hall, contest is extended by 30 minutes (in total).
Are the contestants able to submit solutions in the extended time? (I hear Achilles chasing a turtle...)
What did you do to Iran's team LiTi? No gold?
Update : It's still changing. One gold by now.
No changing in the scoreboard
We have to wait untill the closing ceremony to find out the results ?
http://ioi2017.snarknews.info/index.cgi?data=2017/day1pre&class=ioi2017&year=2017
Yeah, I know, but for the most of scoreboard it's a good approximation.
If I am not mistaken, ioi never prolonged contest, especially cuz of queue and testing system. Do they have serious reason to do this?
Panic :D
Seems to be over now, judging by the stream.
Thanks god
I almost thought they are going to make day 3
The scoreboard hasn't changed yet.
Do we have to wait until the closing ceremony to see the results?
OK, so that will be some fair amount of work :P. I am really surprised by some similarity of this problem to ... some other problem :P (details in spoiler)
Let's start with solution that does <=m queries. It's obvious that if an edge is a bridge that it is a royal road. We will focus on taking an arbitrary spanning tree T and determining for every of its edges whether it's royal. In order to do this we will demand even more. For every vertex v we will fix one of edges that determines its low value (one we compute when determinining bridges etc.). Let's call set of such edges as L. We will determine which roads from L are royal as well, but just as an auxiliary result.
Let's look at two trees T1 and T2 so that T2 is obtained from T1 by removing edge e1 and adding edge e2. If C(T2) = C(T1) + 1 (where C is shorthand for count_common_roads function) then we know that e2 is royal and e1 isn't. Similarly if C(T2) = C(T1) - 1. Call it exchange lemma.
Now let's look at some cycle in our graph. Let it consist of edges e1, ..., ek. We can create a tree Ti that has all edges from this cycle except ei and all such trees has same set of roads except this cycle. From exchange lemma if it is the case that some of edges from this cycle are royal, but some aren't then we will easily determine for every edge whether it is royal or not. It can't be the case that all edges from cycle are royal, so otherwise no edges are royal, so we know everything as well.
Let's return to our goal, determining which of edges from T and L are royal. For start let's ask about C(T). For every edge e from T that is not bridge let's ask about C(Te) that is created from T by removing e and adding edge that determines low(v), where v is its deeper (in spanning tree) vertex. Moreover for every edge e in L ask for C(Te) that is T with added e and removed edge from spanning tree that is highest of T's edges lying on a cycle formed in T with added e.
So we know R(e1) - R(e2) for some pairs of edges e1 and e2, where R(e) = 1 iff e is royal or 0 otherwise. We can create a graph G whose vertices are edges of original graph from either T or L and two vertices (corresponding to original edges) are connected with directed edge if we know difference of R when applied on them. If we take a connected component in such graph and at least one of differences is nonzero we easily determine R values on all of such vertices/edges. We can note that if our original graph is biconnected (and has >2 vertices) then graph G is connected and since it contained cycle we know that if all differences are zero then no edges from T or L are royal. That fact applied to all biconnected components of our original graph leads to algorithm of determining royality of all edges from T and L. But we can forget about L, we will use just T from this point on.
Now for every edge e not from T or L we can create a tree Te that has edge e and n - 2 of edges from T that together with e form a tree. We can ask about C(Te) and from exchange lemma we will determine R(e). This leads to a solution scoring 51 points (maybe there is simpler way of getting that many, but this solution can be further extended to get 100 pts)
Now we can move on to solution using
queries instead of O(m). On beginning let's observe that if we have set of edges F that forms a forest we can know how many of its edges are royal by adding edges from T as long as they do not form a cycle and asking about number of royal edges in resulting tree. Since we know which of edges from T are royal we just subtract number of added royal edges from T from the result of C query. However we will use this just for F sets that are stars.
Let's fix a vertex v, we will determine all edges incident to v that are royal and are not from T. If there are k of them we will use at most
queries. We do this in almost the same way as in prize problem, similarity between these two problems is really big. Let Ev be set of edges not from T that are incident to v. We can learn what is C(Ev) (abuse of notation since Ev is not a tree, hope that it is clear). If it is zero then we conclude there are no interesting edges here. If it is k > 0 we then ask about C(H) where H is a first half of Ev. If C(H) > 0 then we recursively find all royal edges in H and if C(H) - k > 0 then we recursively find all royal edges in second half of Ev. It's kinda like a binary search that tries to find multiple objects instead of just one. That results in
queries that are needed to find all royal edges incident to v what gives
queries in total. We are almost done, but this slightly exceeds query limit, because it is something like
, because for edge uv we use
queries when searching through u's edges and
queries when searching through v's edges. To fix this, when we browse v's edges we not only discard ones that are from T but also ones that go to vertices with lower index. That concludes solution which uses at most
queries and gives 100 pts.
Could some provide some hints about Prize problem?
1) There's a lot of least valuable boxes and just a few of more valuable ones
2) Try determining at least one
3) If we have two of them, how can we tell whether there is more valuable one between them? How to use this fact to look for more valuable boxes?
Do you have a deterministic way of finding the least valuable box? After ~50 random shots there's almost no way you don't hit at least one, but it is still possible.
I've tried first min(n, 500) boxes at the beginning: 4502 > 200 000, so we will find at least one least valuable box.
In order to make my number of queries lower I noted that if sum of two values returned by checker is at least 22 then it is least valuable, because (222)2 > 200000. That allows me to ask about only 23 boxes.
Yes, I have. Note that checker is adaptive, so in fact it is possible that if checker is evil you will not find any even after 50 shots.
In the first 500 there must be a least valuable box. If there were 500 other boxes, then from the least but one valuable box there would be like 470, and 470^2 > 2*10^5.
Whoops I made this error. At my initial code I checked only 450 boxes to find the minimal, as 450^2 > 2*10^5, but I forgot that this is not necessarily the only layer.
1, 2, 5, 26, 440, 199526 requires 473.
26^2 > 440
1 4 21 446 198917 requiers 472 and there can't be more (i believe simple cases will provide you with the proof)
Remember that the grader is adaptive so it can give you 50 valuable boxes just to piss you off ;)
Simple solution for 90 points.
It's easy to see that at most 500 items are non-lollipops. So query the first min(n, 500) items to find at least one lollipop (this is the one with largest answer sum).
Then to locate all the non-lollipop boxes we could binary search prefixes; it takes at most 500*log_2(200K) ~ 8.5K. (you could save a bit, not sure how many by memoizing queries)
Afterwards just search each of the non-lollipop one by one for the diamond (there's at most 500 of them); the diamond is the one with both 0 result.
This solution with memorizing was enough for me to get 100 points.
to reduce queries from
to
, divide the array into
blocks and then binary search just within each block.
Let's define the boxes which are not the cheapest as good boxes. At first, use 472 queries to get the total number of good boxes, x. 472 are enough since x ≤ 472. And then use a function f(left, right, number of good boxes with indices < left, number of good boxes with indices > right) to locate and search for the good boxes by "binary search with multiple targets" (maybe it has a specific name?).
Assume the total number of good boxes, x, is 0. Then directly use the function mentioned above without the initial 472 queries. If a query gives a sum larger than x, update x by that value. After every query and every recursive call done in f, if x is updated, do everything again inside that call including the recursive calls. Make sure that the answers from the queries before are stored to prevent multiple queries for the same box.
Congrats to 高谷悠太(たかや ゆうた) who came first in both IOI2017 and IMO2017!
yutaka seems better for me :p
but I wonder what is inside the brackets ?
lol it's japanese
oh didn't know -.-
[deleted]
Would like to hear what contestants like matthew99 and Reyna thought of the contest. I think everyone is surprised about their result.
sad as fuck. how else can i feel
Give them a break, man.
Hi, i was kinda frustrated, now i'm much better (i gotta thank everyone for their consolations, my family, friends, people of cf and a lot more, thank you everyone)
About the problems, i liked them, but they were too hard for me to solve, there were a lot of strong participants that managed to solve them, congrats (especially yutaka1999 for that impressive win, both on IMO and IOI)
I enjoyed this wonderful event, despite how i performed, hope everyone else enjoys it aswell
The second time extension was like 50 seconds before the extended end time... Please don't do that again...
Our contestants told that the first time extension was around 15 seconds before the end of the 5 hours. Did you hear that announcement earlier?
Definitely earlier, at least 15 minutes before 5 hours.
Actually what is the reason of the second extension?
https://en.wikipedia.org/wiki/1972_Olympic_Men%27s_Basketball_Final
Wow amazing grind Pedrohso ,from nothing to gold!
Pedrohso is an incredibly talented guy. I feel very proud by having taught him a few classes a while ago, and I'm happy he could overcome his past coding limitations and was able to fully showcase his problem solving skills. We Brazilians are all very excited about this result, which hopefully will get official soon! :D
Italia again... called it.
???: Hi , so to me seems like a notorious coincidence.
What are the chances of 144.99 reaching bronze cutoff?
Decent. Usually cutoffs are 1:2:3:6, there are more than 300 participants, and 150th has something like 135 as far as I remember
I believe it should be bronze. Half of the participants get medals and 144.99 seems to be in the first half.
P.S.
Though, it seems like the current standings are not the final standings for some odd reason.
At this point, I haven't even got the confirmation that day 1 results are final, and I have suspicions that they might not be, which is why I did not publish even preliminary results to the statistics.
Bronze right now is at 135.76 points; do you think appeals would change it significantly?
Wow astonished at the result renewed. I would never believe 1, 4, 5-th place would be occupied by Japanese guys.
5:29:57....
Uhh, maroonrk, how do you submit twice in the last minute of the contest (when the judge is too slow to get feedback) and manage to have exactly one of the solutions work?
Well, he is a tourist of last minute. He also raised score in last few seconds at some day of JOI Spring Camp :)
You don't have to wait for the judge to finish to resubmit. Also, in the last 15 minutes, submissions have no minimum interval. So submitting twice in the last minute is very normal...
I was lucky enough to sit next to him this year. He told me after the contest that he submitted in the last few seconds for Q5. He was very happy to find out 3 hours later during analysis time that he received 100 points :)
Sure, submitting twice is normal. I want to know if he was making random changes and submitting or if he miraculously found a bug in the last few seconds, debugged instantly and squeezed in a correct submission three seconds before the contest ended?
Ah, yes — he told me he found very small bug which he fixed within the last minute. Very impressive.
He said that in last minute he found some optimization and got 100. He didn't know that result until the analysis, since the scoreboard was broken.
we are so proud of being the host of IOI 2017 and we love to see other competition like this in our country with participants of all over the world. please trust Iranian people and participate in competitions like Bayan contests and ... in Iran.
Please send me my T-shirt for Bayan contest, lol
for Books , does anyone have a testcase where the logic for S = 0 fails with S > 0?
Lol. Care to elaborate what you mean, just a suggestion :)? There are a lot of ways you can think about this problem and there are a lot things you can simply don't care about if S=0. Don't expect us to know what you mean by "logic for S=0"
first of all i add count of (j <= i && p[j] > i) + (j > i && p[j] <= i) to the answer for all 0 <= i < n-1 (just the number of crossing from i to i + 1 and i + 1 to i)
Then if the permutation isn't connected like this
. . _______ . s . . __________ . . .
I also add those "Gaps" in the middle to the answer , however this seems to fail for s > 0.
To clarify, how will you handle the case where the permutation covers s but s is not a part of it, i.e. s is a fixed point?
For example,
thanks , got my mistake.
How to make it from 70 points to 100 points?
EDIT:
When S=0 I know a O(n) solution what merges cycles. Otherwise, I can't imagine how to count the amount of walking from starting point to largest cycle covering it. I have a dijkstra solution what works in O(n^2) because I need to check if i can travel from one cycle to another...
EDIT: Maybe we need to do the dijkstra from the other side? :D
EDIT: I keep getting WA on testcase 5 :D Somehow testcase 4 works fine :s
My first solution outputs 4 instead of 6 for this case.
answer: 16
answer: 32
answer: 20
Can someone show an example code for the "Prize" task? I didn't understand how to interact with the system
Congrats I_Love_Tina on g̶e̶t̶t̶i̶n̶g̶ ̶a̶ ̶s̶i̶l̶v̶e̶r̶ ̶m̶e̶d̶a̶l̶ defeating Rudy1444.
:C
It was obvious, actually.
UPD Full Result
How to lost your medal: Solve problem Prize under the impression that the checker is not adaptive, random 5 times instead of 500 times, spent 3 hours trying to optimize the binary search part without realizing that the checker is adaptive. Profit.
I did the same fucking thing and didn't get time to do ~30 points subtasks for silver. :(
Here is another example. I had Prize coded hour and a half in the contest, and it was correct with one tiny error: my bs was while l < r instead of l <= r, and I spent 3,5 next hours debugging it. I found my error literally minute until the end of the contest, fixed it, submitted, and then I realised I have commented a part of my code, for some kind of debugging. I deleted the comment, alt tabbed to the cms, but it was too late. In the analysis, that solution was accepted, without any changes. :(
Oh God, these stories are scarier than any creepypasta.
When looking on the submission for Simurgh by 9-th placed Lukas Michel, we can observe, that he first solved subtasks 1-3 and in the very last submission only subtask 4. (Probably some other such submissions can be found)
Sure enough, in the rules we can read
The score for each task will be sum of scores for its subtasks.
What is the reasoning behind such scoring? Sure, it benefits the participants. But, essentially, participants might produce multiple partial solutions, instead of one that solves all subtasks. What are your thoughts, community?
It saves you the time and trouble of figuring out what subtask it is in your code. That's not what is being tested in IOI.
Also, this is the same rule as last year...
This has always been the case. For most problems and sets of subtasks, you can write a solution of the form
...and this is indeed what participants did, and indeed more or less what the jury expected them to do.
It's totally okay for participants to write partial solutions — indeed that is exactly what the entire concept of subtasks is for. Often it makes no sense to try to write a single solution that solves multiple subtasks: a reasonable IOI participant who cannot solve some problem completely might be able to solve subtask 1 with a bruteforce, and subtasks 2 and 3 might happen to be different special cases that can each be solved with a different special case solution. Requiring this participant to combine all three in a single file is just a waste of their time.
Thus the introduction of the "sum of scores of subtasks" rule doesn't really change anything about the spirit of the competition, but it does fix some awkward things that might happen without it, especially when feedback is broken (and I remember more recent IOIs where feedback was broken at some point than IOIs where it never was). Here's an anecdote that hits close to home: our own OVR in 2012 submitted a solution to some problem that solved subtasks A, B, C. Then feedback was broken (and never got fixed before the end of the contest), and OVR submitted another solution, which happened to solve A, B, D, but broke on C for some reason. Because of the broken feedback, he never learned about this until after the end of the context. (score(ABCD) — max(score(ABC), score(ABD))) would've been enough points to move him from bronze to silver, and the team wrote an appeal arguing that, if feedback was working as intended, he'd have noticed this and just submitted a "merged" solution that invokes his old one when ran on tests from subtask C. The appeal was almost granted, until someone from the jury noticed that the second submission was made less than a minute before the end of the competition, which meant it was quite unlikely he'd have managed to do the merging in time, so the appear was eventually denied. Had the new rule been in place back in 2012, Latvia would've had one more silver medal :)
IOI 2017 Preliminary Results. These are not the final results until GA approves them and as such may change.
After discussion within the IC, the rank of the offsite contestant is defined as the highest rank amongst all onsite contestants with the same or smaller score.
Does anyone know why my solution fails in tests 65, 68-72, 74 on books?