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

Автор craus, 10 лет назад, По-русски

Всем привет!

В субботу 21 июня в 11 часов будет тренировка по задачам VII Самарской областной межвузовской олимпиады по программированию. Идёмте её играть!

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

»
10 лет назад, # |
Rev. 2   Проголосовать: нравится +4 Проголосовать: не нравится

1 hour before the contest Contest is over, you can start virtual participation

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Где можно найти разбор?

И как решать А? У меня псевдоградиентный поиск с начальным приближением 1, 2, ... n.

Условие n>=3*a*b дает какое-то красивое детерминированное решение?

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can someone tell me how to solve G and E? Thanks.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    G: Let's find a closest point to the given three(that the max distance is the smallest) This can be done by 2 ternary searches : one by X-coordinate and the second by Y-coordinate

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится +4 Проголосовать: не нравится

      Actually it's a center of the circumscribed circle (if the triangle is not obtuse), or the center of the longest side (if the triangle is obtuse).

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    G: If an answer exists, it can be a point for which 2 of 3 inequalities are actually equalities, so it's the 3rd vertex of an iscosceles triangle with base (or or , you can try all 3). Consider : let , then — we decide that P is supposed to be at (height of ) from the center of the base and that it lies on that height. Finding a perpendicular vector in 2D is easy, so we can calculate the coordinates of . Then, it suffices to check if it's close enough to the 3rd vertex of our triangle.

    E: The time (from 0) until the 1st superpositions without star j is , because star i is directly above us exactly at all integer multiples of li. We just need to find these LCMs, for each one (call it L) check if it isn't too large, and find the smallest k such that kL ≥ M and (if lj|L, then it's impossible, otherwise if k doesn't work, then k + 1 certainly does), and check if the answer isn't too large again. Since LCM is associative, we can calculate the LCM of all elements in an array except the j-th as LCM(LCM of all li: i < j, LCM of all li: i > j), and these 2 can be pre-calculated as prefix and suffix sums... well, LCMs.

    • »
      »
      »
      10 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Well, your solution of E is easier, than mine. In my solution I used segment tree to calculate LCMs...

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Как решать C и D?

  • »
    »
    10 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +8 Проголосовать: не нравится

    D — заметим, что внутри леса нам вообще не важно число V, мы всегда можем делать внутри него сколько угодно ходов. Это нам оставляет 3 возможных перехода : точка (то есть клетка без леса) — точка, точка — лес, лес — точка. Понятно, что когда мы делаем первый или третий переход — мы платим за это 1 движение, а когда заходим в лес из точки, мы можем сказать что до клетки с лесом расстояние 0 (типа забываем про все что делали до этого, и просто ходим из этой клетки как из начала). Ну вот, сделаем что — то вроде алгоритма дейкстры, если расстояние до вершины, которую мы достали из очереди уже >= v, то забиваем на эту вершину, иначе делаем переходы выше, если улучшили ответ опять кидаем в очередь. O(NMlogNM)

    C — сделаем бинпоиск по ответу, теперь пустим поиск в глубину, состояние будет (вершина, 0 или 1). 0 будет, если мы еще не проходили по ребру, строго большему чем наш ответ, и 1 иначе. Если у нас сейчас в состоянии 0, то переходим по любым ребрам, не забыв проверить, что новое ребро не больше чем ответ (иначе говорим что в новом состоянии будет 1), а если у нас и так 1, то переходим только по ребрам, не большим чем наш ответ. O(NlogAns)

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      То, что ты написал по задаче D, скорее всего является каким-то вариантом алгоритма Левита и может работать за примерно n*m*v (расстояние до какой-то клетки не один же раз может улучшаться, правда?), но совершенно непонятно, как такие тесты делать. Поэтому их там не было и все заходило :) На самом деле там есть решение за n*m. Указание: попробуйте расширить все леса на v/2 во все стороны и проверить, существует ли связный путь. Там придется немного пошаманить из-за проблем с четностью v, но все решаемо.

      В задаче C внутри бинпоиска можно считать длину всех ребер длиннее аргумента бинпоиска равной 1, а остальных 0, тогда придется проверить, что существует путь длины <= 1 на 0-1-графе, это вроде попроще для понимания.

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Что-то вроде Дейкстры — на самом деле Левит, spfa или еще что-то в этом роде. Зависит от того, как приоритет выставлять) set, stack, queue, вариации deque...

      У нас есть ребра отрицательного веса, поэтому Дейкстра не работает. Если бы это был алгоритм Дейкстры, то число итераций можно было бы ограничить сверху числом вершин — но это неправильно (и дает WA17). Более того, в Дейкстре обработанную вершину вообще нельзя снова добавлять в очередь (можете попробовать, на каком тесте упадет такое решение :D)

»
10 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

На правах рекламы: кто не участвовал, или участвовал, но не успел взяться за все, зацените задачу J — она забавная ^_^

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Расскажите что в тридцатом тесте задачи B. Есть мнение что он последний.

  • »
    »
    10 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

    Это случайный тест с n=5, и он не последний. Ну, не совсем случайный, он сгенерирован так, чтобы ответ балансировал на грани.

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Ясно, спасибо. Значит всё-таки с идеей что-то не так.

      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Указание: посмотри на время первого Accepted по ней, а потом на количество кода у тебя.

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

hi .. can any one help me to solve (K) i think about it a lot :(

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    Notice that all you need is an increasing subsequence of ai (and similarly of bi), constructed by taking the first element, then the first one greater than the first, etc. always the first greater one, since if aj ≤ ai for j > i, then if aj could do anything, then ai would do that earlier. You can store each subsequence in a map of (ai, i).

    This way, you can find the first joke that would make either person laugh (or that there's none), just by taking lower_bound(). Then it's just about checking which one goes first.

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      since if aj ≤ ai for j > i, then if aj could do anything, then ai would do that earlier. You can store each subsequence in a map of (ai, i).

      sorry it make me confused

      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Then try to think about it, think about the problem in general and compare, it's a better way to learn than everything being spelled out (also, I'm lazy :D).

      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        i really try very hard with it :( i stored only increasing value with their index and used lower_bound and upper_bound but still WA :(

        please help :(

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Как решать C, F, G? И в чем заключается 6-й тест к задаче К?

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone help me with K. Evaluator give me information that my code give wrong result on 6th test case. http://pastebin.com/6aCQ2v2W

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    6 test is a random test with n = m = 100, try to stress your solution locally

    • »
      »
      »
      10 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Ok, but have my code any logic to pass the test examples? have i good idea?

      • »
        »
        »
        »
        10 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        Just try to calculate maximum on prefixes and for each query use binary search to find the least position of a necessary spell.

        Sorry for my bad english, i hope you will understand me properly :)

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

How to solve problem F?

  • »
    »
    10 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

    Sort all the points, then check whether all the points are "zoomed" from the original one compared to the first point, just check the gradient and distance.

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can anyone explain problem D to me?

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Can someone help me to understand why is wrong my solution for problem K?

I read the last posts about problem K but I can't figure out my mistake.

thanks.

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Как решать J?

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

What is the intended solution for 100460J - Shards of the Past?

During contest I solved it using failure function on a string to check periodicity combined with a method to test whether cycle length divides some value. However, other people seem to have written much smaller and simpler solutions.

  • »
    »
    9 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +13 Проголосовать: не нравится

    Imagine you're going X rooms to the right. While going to the right you can remember what is the state for each room you went through. Now after going X rooms right, switch the states of the candles in the last room and go X rooms left. If cycle is longer than X then you will observe all X rooms in the state as you left them while going to the right. Otherwise you will find the difference and you will be able to calculate the cycle length.

    Now to make number of steps no more than 10·N you can start with small X and if you didn't find the cycle with such X make it two times bigger and try again.

    My submission: 6994198

    PS: Though I have no idea whether it is an intended (if there is any at all) solution or not, just shared an idea which seems to be simple to implement.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Ahhhh. Damn.

      I was performing a similar check to find cycle except for some reason I had this idea fixed in my head that when I'll flip candle in last room I will only verify in this room i.e. I wont check if any change happened in the last X rooms, instead I checked only in the last room. This meant I had a test which could tell me if cycle length divided X or not. So I couldn't perform lots of arbitrary checks. I could only perform checks when I was reasonably sure of cycle length. This led to the entire failure function of string approach.