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

Автор chaosagent, история, 7 лет назад, По-английски

The first USACO contest of the 2016-2017 season is going to run from 12/16 (Friday) to 12/19 (Monday). Let's discuss the contest and the problems here after the contest :)

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

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

I guess Mexicans aren't allowed to participate.

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

Problems in English only? or ? :)

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

can anyone explain for me why the input of problem 3 — silver is 3 :(( .The 4th cow can't be reached so i think the answer is 2 @@@

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

How to solve the first Platinum Division problem? (Lots of triangles)

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

    My solution: Angular sort, radial sweep, range query.
    Complexity: O(n3log(n)).

    Is there O(n3) solution or better exists?

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

      And my solution TLEd -_- (I used angular sort + count number of inversions). However, I heard from minimario that an O(n3) solution exists.

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

      O(3004  /  6) solution is kinda obvious. you can optimize it to O(3004  /  (6  *  64)) by using a bitset. which is better than O(3003) .

      code: https://hastebin.com/cuduvepuqu.cpp

      UPD: sorry, bciobanu answered that before me

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

      Yes.

      1. if we pick triangle with point A, B, C. we remove points that is outside of line A-B, B-C, C-A (precompute this in N^3) Unfortunately this removes some points two times. So, we precalculate rangePoint[X][P][Q] = num of points y s.t ccw(X, P, y) > 0 and ccw(X, y, Q) > 0, and add them. With N^3 precomputation we get O(1) per query.
      2. precomputate DP1[X][Y] = number of points p s.t ccw(X, Y, p) > 0 and X.x <= p.x <= Y.x. (also with ccw(X,Y,p) < 0) Now we can get O(1) per query. Careful with elements with same X coordinate.....

      In contest, I didn't realized such exists, and coded n^3lgn solutions. (angular sort + bit) I got TLE, so I precomputed angular sort for n^2lgn, and get AC. (I know this is dirty :D)

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

    You can pick a point say the point leftmost of all points (point P) and fill a pre_process array dp[i][j] that means in the triangle with vertices P,i,j how many dots are there we can fill this array naively O(n^3) and then for any triple (a,b,c) we can easily find out the number of dots inside it O(1) for example the number of dots inside(a,b,c) can be equal to : dp[a][c] — dp[a][b] — dp[b][c] — 1 OR dp[a][b] + dp[b][c] — dp[a][b] (if b is between a,c if we look at it from P) so the overall complexity will be O(n^3)

    (filling up the array and finding out which point is in between to other points by looking at it from P can be easily implemented by cross product)

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

    Let's use trapezoidal decomposition. Loop through all segments and compute the number of points inside the trapezoid formed with the x-axis. Now, for any query triangle, lets pick the longest segment forming it and look at the third point not forming this segment. Depending on which side of the segment this third point is, we either add 2 trapezoids and subtract 1, or subtract 2 trapezoids and add 1. Either way, it's O(n3).

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

How do you solve gold 2 and gold 3?

  • »
    »
    7 лет назад, # ^ |
    Rev. 4   Проголосовать: нравится -14 Проголосовать: не нравится

    You can solve third problem by bfs. Here is the code.

  • »
    »
    7 лет назад, # ^ |
    Rev. 4   Проголосовать: нравится -30 Проголосовать: не нравится

    gold 2 ==> DP[1000][1000][2]

    wtf of down?! :/

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

    About problem 2 gold :

    I decide to go to through the all options and get the best answer.

    Situation (x, y, k) :

    . k = 1 — Holsteins cow, 2 — Guernseys cow.

    . the last Holsteins cow was Holstein cow by number x,

    . the last Guernseys cow was Guernsey cow by number y,

    and we now near cow type k.

    The ansewr for situation (x, y, k) it's minimum energy which we need fo going from (x, y, k) to (h, g, 1)

    Let calculate answer for situation (x, y, k) and we want go to the (h, g, 1)

    So where we can go from there ?

    1) if x == h and y == g

    . a) k == 1 then nowhere ( ans = 0 )

    . b) k == 2 then go to the h-th Holsteins cow.

    2) if k == 1

    . a) we can go to ( x + 1, y, 1)

    . b) if y < g we also can go to ( x, y + 1, 2 )

    3) if k == 2

    . a) we can go to ( x + 1, y, 1 )

    . b) if y < g we also can go to ( x, y + 1, 2 )

    One point : if we walked out from [1; n][1; m] then the answer will be BIG NUMBER.

    So we will calculate the answer for (1, 0, 1), and it will be the answer for the problem.

    First I just write recursion "go through the all options" ( and got 2/10 AC)

    Then I saw that some positions (x, y, k) we calculated several times, and decided to use map for optimization ( we calculated answer for each position one time and save the answer, and each another time we will use saved answer ). ( it got 5/10 AC ).

    And I decided to change map to the array because the problem has no big limitations [1000][1000][2]

    ( it got 8/10 AC ).

    This problem helped me to understand how to convert some DFS solutions in to the BFS solutions, and I convert my DFS solution in to the BFS solution and got 10/10 AC.

    I think this problem was very interesting and useful for me.

    If you are interesting here is my DFS and BFS solutions.

    Thank you for attention. And sorry for my bad English.

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

Any hints for problem C in platinum division?

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

    From what I have heard, the problem is a harder version of Problem A in this competition: http://cs.stanford.edu/group/acm/slpclive/problems/problems_2016.pdf

    I've also heard that one can use Eppstein's algorithm to solve it.

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

    My solution is O(nlg^2n). I will only explain some key ideas, since the full algorithm is hard to explain....

    • Let's run some sort of Dijkstra here. we start from (0, 0, 0, 0 ....), and increase one element from each of N entry. This is NKlgN and I remember it didn't rewarded much.
    • Observe that Kth pick differs for at most lgK elements from the 1st pick.
    • We want to reduce state to N entry -> K entry, but it's not clear till now.. So, dismiss all rows with one elements, and sort every rows by order of M[1] — M[0].
    • Still it's not clear, so let's fix the number of changed elements (say C), and solve each problem independently.
    • Now think about the two ways of state transition.

    In contest, I was short of time, and I just submitted optimized O(nlg^3n). This misses two TC as TLE. (956/1000) This is my code. http://ideone.com/s08eao

    Also, ainta told me that there is nlgn solution. I think it won't be really hard to optimize mine to nlgn...

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

    Link to my solution of C (it got AC). It's an easy to understand DPlike bruteforce which runs in .

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

      Can you explain the code?

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

        So let's begin with some facts.

        1) We can binary search on the maximum number we will get.

        2) If we sort the numbers in each row, we must get at least the minimum number in each row. So we subtract from each number the minimum in its row. We do this so that we can ensure that our transitions in the following DP will be O(K).

        3) How to do the check in the binary search? If we do a DP[add_sum] = number of ways to increase the minimum sum with add_sum, then we can notice that in each transition of the DP our count of numbers increases with at least 1. So we can maintain a global counter of all possible sums less than the current minimum that leads us to at most O(K) DP transitions (if our global counter reaches K we just return true). The complexity of the check is because of the map, but it can be improved using a hash table.

        4) after we find the maximal number the sum can be found in a similar manner.

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

    My solution is O(n log n) and it's really simple to code:

    1. Let's sort pairs (value, row) for all elements in all rows (except for the smallest ones), where value is the differences between the element and the smallest element in its row.

    2. Let's say that a state is a vector of positions (in the sorted array) and run Dijkstra's algorithm (starting from an empty vector). We need only two transitions: creating a new position immediately after the last one and increasing the last position by one.

    3. There's one problem here: we can take two elements from the same row. It's bad. Let's fix it by moving the last element until all rows are unique (we touch only the last element, so it's the only one that could break). That's it.

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

You know, people can compete in this competition until 4h after the official finishing time. I have 30 min left and I'm seeing a lot of spoilers.

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

This is pathetic. Officially, anyone can start USACO contest at Dec 19, 23:59 UTC time and start for 4 hours. You guys are discussing problems just after the time for the official start of the contest is over instead of four hours after it__. Even I started the contest 2 minutes before it officially ended and although I did not use any outside help, I came here after the contest to be the first guy to talk about it. Now, I am disgusted to see that three hours before the contest ended for me, some other people had already started discussing stuff. This is pathetic.

P.S. Feels fun to get promoted to platinum!

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

    And the people discussing it early are probably the ones downvoting you.

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

Results are available here!

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

My solution for problem C was as follows:

First, notice that the approach with the priority queue has two problems: it is O(NK) and it generate duplicates. In order to solve both of these problems, notice that once we have an element in the queue (I.e., an array of indices for each of the N components), we have two options: Either we take the next best possible difference (let's call the corresponding position pos), or we completely stop adding differences from pos. You can see that, by doing that, the decision splits the solution space into two disjoint parts.

The minimum, as well as all the operations, can be simulated in O(log(n)) with persistent segment trees. Hencr, total complexity is O((N + K)log(N + K)) Here is the code:

http://pastebin.com/xHn88B3d

Note: I did not notice that the cases were disjoint in contest-time, that's why I also have hashes comparison. They are useless in the code.

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

For Platinum P3 "Robotic Cow Herd", shouldn't the worst case complexity of the (official solution) which is a brute force, be more ? Shouldn't the enumeration run in O(M1*M2...Mn) in the worst case ?