Блог пользователя Connector

Автор Connector, 15 лет назад, По-русски
Рад вас приветствовать на юбилейном 26-ом раунде Codeforces Beta Round # 64.

Автором сегодняшнего контеста являюсь я. Я студент Тюменского Государственного Университета.

Хочу выразить благодарность Дурынину Никите (Austeritas) за пару идей к задачам, Дмитрию Бочкареву (Walrus) и Черненкову Алексею (Laise) за тестирование, Артему Рахову (RAD) за помощь в подготовке контеста, Марии Беловой за перевод условий и Михаилу Мирзаянову (MikeMirzayanov) за отличную систему.

Сегодня Вам предстоит путешествие в страну Моржландию, где потребуется помочь местным обывателям и властям.

Желаю всем удачи и пусть победит сильнейший!

Поздравляем Petr'а с победой, единственного участника, сдавшего все пять задач!

Разбор

  • Проголосовать: нравится
  • +150
  • Проголосовать: не нравится

15 лет назад, скрыть # |
 
Проголосовать: нравится +24 Проголосовать: не нравится

Удачи всем! 

Пусть победит сильнейший, а не тот, у кого в руме больше решений будет для взлома)

15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Скорее бы 210-ый раунд
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
Всем удачи и.... easy hacking!
15 лет назад, скрыть # |
 
Проголосовать: нравится +2 Проголосовать: не нравится
Блин, неудачное время. Ведь футбол же Россия-Армения!
15 лет назад, скрыть # |
 
Проголосовать: нравится +14 Проголосовать: не нравится
What if the winner is a woman?
I hope this will be a good contest!
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
good luck ! :D
15 лет назад, скрыть # |
 
Проголосовать: нравится +16 Проголосовать: не нравится
Удачного всем оморжения в Моржландии!
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
Good rating!
15 лет назад, скрыть # |
 
Проголосовать: нравится +13 Проголосовать: не нравится
i wonder how log will it be beta rounds?
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
Hi, I'm new to the format... Will prolly crash and burn but i hope to better myself gradually. :) Cheers! :)
15 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится +18 Проголосовать: не нравится
Два Егора, а место одно :)
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Хороший скрин :) Но тот егор таки успел ещё 2 взлома сделать :)
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
отличный контест!

к сожалению, так и не смог получить в 4-м сэмпле C ответ "22 111", но задачи понравились, спасибо =)
15 лет назад, скрыть # |
 
Проголосовать: нравится +7 Проголосовать: не нравится
Точки — это корректно. Не стоило менять.
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
А то что при просмотре положения, при выборе дивизиона, синие все еще в первом, это типа еще не исправили? 
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Какие взломы были по задаче А? Может у меня такая сильная комната, может я тупой, но сильно много ошибок-то не было.
15 лет назад, скрыть # |
Rev. 3  
Проголосовать: нравится 0 Проголосовать: не нравится
Зачем были комнаты 100 и 99? Это баг?

15 лет назад, скрыть # |
 
Проголосовать: нравится -26 Проголосовать: не нравится
Блин вот КАК можно так криво писать? Я просто в шоке от себя. В первой задаче 10^6+6-для меня это 100006, во второй задаче оказывается дописывать одну строку к другой-это s1+=s2.length(). Криворукий тупой олбанко.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
А на чем ломали B? После неудачной попытки написать C я думал-думал над этим, но так и не понял.
15 лет назад, скрыть # |
 
Проголосовать: нравится +20 Проголосовать: не нравится
не, ну надо же! меня моя девушка больше чем на 100 мест обогнала =)

пойду стирать бельё и готовить ужин... :)
15 лет назад, скрыть # |
 
Проголосовать: нравится +24 Проголосовать: не нравится
Когда будет информация о вкладке "Марафоны", которая появилась сверху?
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
can anyone tell me what is idea behind C ?
  • 15 лет назад, скрыть # ^ |
    Rev. 2  
    Проголосовать: нравится +7 Проголосовать: не нравится
    I think, the main is that if a * b = rev(a) * rev(b) then a / rev(a) = b / rev(b).

    UPD: Ой, а вот где у меня и была ошибка :(
    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +15 Проголосовать: не нравится
      a / rev(a) = rev(b) / b.
    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +3 Проголосовать: не нравится
      It should be a / rev(a) = rev(b) / b
      For a / rev(a) , you can transform it to its lowest form c / d by dividing numerator and denominator by their gcd and store (c,d) -> a in a map.
      This way, for each x, you can find all the numbers y, that can form lucky pair (x,y)

      That was the main idea and after that there were different approaches. I iterated over all x , from 1 to max_x , and for each x , did a binary search on y to find the minimum y in [1,max_y] that has at least w pairs.
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        I tried to write exactly this solution, but...

        > This way, for each x, you can find all the numbers y, that can form lucky pair (x,y)
        How? And what did you store in the map?

        It seems it was EPIC FAIL
      • 15 лет назад, скрыть # ^ |
        Rev. 3  
        Проголосовать: нравится +4 Проголосовать: не нравится
        The binary search can be avoided.

        Let's first solve the following related problem:

        Given an ordered array of n elements, return two elements that multiplied are bigger than C. If there is more than one answer return the ones with the smallest product possible.

        The most basic idea is iterating over every pair in O(n^2)

        A more sophisticated algorithm would be to iterate over each element A and do binary search to find an element B which A*B >= C (equivalent to your idea) O(n*logn)

        The fastest approach is to keep two pointers, one starting in position 0 (A) and one starting in position N-1 (B)

        if value(A)*value(B) >= C, B--
        else A++

        O(n)

        It's straight forward the reduction for the original problem.
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится -8 Проголосовать: не нравится
        How much memory required , O(n*n) where n is number of primes < 10^5 ? 
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится +5 Проголосовать: не нравится
        > I iterated over all x , from 1 to max_x , and for each x , did a binary search on y to find the minimum y in [1,max_y] that has at least w pairs.
        … using a binary indexed tree.  That was a missing part in my case.

        An alternative way is, as daffes wrote, to do it linearly (starting from (x, y) = (1, maxy), increase x if there are not enough lucky tickets, decrease y otherwise).  I had completely overlooked this approach.
15 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится
спасибо претестам задачи В, отловившим мои мелкие баги ужасной реализации! :)
15 лет назад, скрыть # |
 
Проголосовать: нравится +17 Проголосовать: не нравится
@Problemsetters   - Can anyone frame questions that  Petr can't solve.?.
15 лет назад, скрыть # |
 
Проголосовать: нравится +7 Проголосовать: не нравится
Is it possible to change display names? I would like to have balakrishnan_v
15 лет назад, скрыть # |
 
Проголосовать: нравится +17 Проголосовать: не нравится
Спасибо за контест! Задачи очень понравились)
15 лет назад, скрыть # |
 
Проголосовать: нравится +4 Проголосовать: не нравится
Понравилась интересная и решаемая задача C, отнявшая почти все время контеста. В итоге рантайм в A при нуле, лишняя строка в B, из-за которой не обрабатывался пробел, и 3.6 секунды в C при лимите в 3. Но раунд был хорош.
15 лет назад, скрыть # |
Rev. 3  
Проголосовать: нравится 0 Проголосовать: не нравится
Я вообще в А не придумал очевидное решение, которое все написали, написал динамику за O(n^2), она все-таки прошла, но не прошла задача В,  потому что я поставил массив длиной 10^3, а не 10^4.

Но контест был все равно хорошим...
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Why it's posible input like "wordinput....." in problem B. Text Messaging...
Description, i think that limit the end of a WORD with only one ( . , ? , !) or none at all ?
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Ater one sentence it will be one end (i.e. it wiil be only one char of '.', '?', '!')
15 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится +5 Проголосовать: не нравится
Thanks for nice match!
I thought that the trap of A is NICE , and hack system of Codeforces is becoming the better event!

However, I thought that we couldn't understand the boundary condition about size of one message from samples of B.

So I have a simple question to @Problemsetters.
Why did you set such number as sample ?
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    The reason is probably to make hacking more interesting in the same way as Problem A.  The size of one message must be understood from the task description in the case of Problem B, not from examples.  I defer my own judgment whether that was a good decision or not, but the intent is clear.
15 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится
how to arrive at the formula for question 1 ?
and what was the logic behind 4rth question ?
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    If you look at first three answers - they are 1, 3, 9. It hints the pattern - 30, 31, 32.
    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +3 Проголосовать: не нравится
      Another way to interpret the formula:
      Given a block Bk, k ≥ 1 with size 2k × 2k, Bk + 1 is built based on four blocks, each of size 2k × 2k. To get the answer you cannot avoid placing something like Bk at the lower left 2k × 2k block. But for Bk + 1 the upper triangle must be filled, so you can see that the upper right 2k × 2k block must have no space left. What about upper left and lower right ones? Well, you can actually see that their upper triangles are also filled, giving you exactly the same initial setting for Bk, so you must have number of spaces for each block exactly the same as that in Bk. So if Bk has Ck spaces, then Bk + 1 has Ck + 1 = 3Ck spaces for k > 1. That gives you the 3k - 1 formula for k > 0. Be careful in handling the case k = 0.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
А почему у меня во время матча не открывалось окно взлома? После нажатия на номер посылки, прошедшей претесты, страница затемнялась, но никаких больше окон не появлялось...
Firefox 3.6.16 Ubuntu 10.10
Я в первый раз участвовал по провилам CF. Может это известный баг?
15 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится
can i get editorials(in english) for the problems somewhere ?
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Can anyone highlight why this is always true "Notice, that any point from the triangle based on first three points will be into the convex hull in the future".

Thanks.
15 лет назад, скрыть # |
Rev. 3  
Проголосовать: нравится 0 Проголосовать: не нравится

Расшифруйте смысл массива koef у Petr в "Задача D - Лабораторная работа" ?

(что-то связанное с нахождением внутренней точки треугольника)

double[] koef = new double[]{0.49214632134, 0.2348329743213, 0.9854827427182};
double sum = 0;
double mx = 0;
double my = 0;
for (int i = 0; i < 3; ++i) {
    sum += koef[i];
    mx += koef[i] * queryX[i];
    my += koef[i] * queryY[i];
}
mx /= sum;
my /= sum;

15 лет назад, скрыть # |
 
Проголосовать: нравится +2 Проголосовать: не нравится
that was good contest