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

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

The second USACO contest of the 2016-2017 season has started and will end on Jan 16 at 23:59 UTC-12 time.
Let's discuss the problems here after the contest :)

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

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

Bringing it back to recent actions

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

Is it possible that I submit my solution even thought I have already competed for 4 hours? Of course this submission will be out of competition.

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

How to solve "Building a Tall Barn" and "Subsequence Reversal" from Platinum?

»
10 лет назад, скрыть # |
← Rev. 7  
Проголосовать: нравится +6 Проголосовать: не нравится

How did you solve 2 (platinum). I did this with n ternary searches inside the binary but it TLE, because it was . After some thinking I removed the ternary and replaced it with a derivative so the final solution became . It passed but I wasted like 2.5 hours on this. So my question is. Is there an easier solution (or actually what is the easy solution)?

code: http://ideone.com/ojPGlI

PS: sorry for the early post

»
10 лет назад, скрыть # |
← Rev. 6  
Проголосовать: нравится +34 Проголосовать: не нравится

My solutions, short:

platinum 1
platinum 2
platinum 3

UPD: I see a lot of downvotes. CF comments as usual.

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

    They are probably because your spoilers were empty until a couple of minutes ago. I like your solutions, but don't understand what you're saying about the first problem. Why would you need anything that has anything to do with HLD?

    My solution was with the "merging sets" trick, but a set can't answer a query "how many numbers are there smaller than x" so I essentially made n segment trees and for each vertex merged the segment trees of its children.

    EDIT: removed second solution, I got something wrong;

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

      Lol why would I post solution when the contest was running? :D And I did say "short". Very, very short. But I got a lot of downvotes after they weren't empty.

      I call it HLD trick because you're basically building BITs over HLD, although not building or using the HLD paths directly. You can do the same with segtrees and with BITs, but you need to build them first, in that precomputation pass, and then, you can merge only the elements from the trees for the smaller sons into the largest one.

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

        Okay, I get it now, thank you. :)

        We basically did the same thing, but I didn't precompute these paths. Instead every vertex chose its biggest child's tree as its own, and merged all the other seg-trees into it.

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

    After flattening the tree, problem 1 can be solved with a merge sort tree. We keep a vector in each node of a segment tree that contains the relevant range sorted. For querying, we can binary search in current node to find the count of numbers greater than some x. Space and time .

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

    I realized that if k was small, the greedy algorithm above did not work. So if k <= 10^7, I set all b[i] = 1, otherwise I did the above algorithm, and it got AC.

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

    Problem 1 can be solved much simpler in O(NlogN).

    • Do a DFS and store the preorder of each node, then every subtree will be contained in a contiguous range.
    • Now the answer for a node i will be the number of elements greater than Pi in the range [lefti, righti], where lefti and righti are the in and out times of the preorder traversal for node i.
    • Process the nodes in reverse order of Pi and maintain a list of nodes already processed. After processing a node, we add 1 to position lefti. Queries can be done fast with a BIT.
    Here's source code
»
10 лет назад, скрыть # |
← Rev. 3  
Проголосовать: нравится +25 Проголосовать: не нравится

For tallbarn, you're given a sequence a and asked to minimize the sum subject to . Suppose . We have a lower bound from a consequence of Cauchy-Schwarz inequality, mostly known as Titu's lemma (I wrote an article here)

$o$ with equality when for some constant t. But implies . So we can set and achieve the minimum value . But bi values have to be positive integers, so the sequence b has to be adjusted. First off we should make all bi < 1 equal to 1.

At this step I greedily adjusted the sequence in two ways and took the minimum.

Firstly I replaced bi with ⌊ bi⌋ for all i. Then the new total sum is less than k and the target value has increased. We can add the extra values in a way that the sum will be minimized. If we add 1 to bj for some j then the sum decreases by

.

so pairs (ai, bi) get priority based on this value. We can add all pairs in a priority queue, keep increasing top elements and push them again till again.

Secondly, I replaced bi with ⌈ bi⌉ for all i and did something similar to above. This time the sum will be greater than k and we can delete extra values keeping another priority queue.

Finally take the minimum from these two adjustments.

Code: http://ideone.com/gItN6P

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

I use Simulated Annealing method on third task and get OK :)

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

In P2, you can solve with binary search.

Define f(x, i) to be the time you can cut off if room i currently has x cows, and you place one more. Then . You can binary search D such that all rooms have f(x,i)<=D, which you can solve with some quadratic formulas. Complexity is O(n log K)

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

If I'm not mistaken I've achieved in Platinum 1.

First, I compressed values in interval {1, ...N}. Then, put all nodes with their discovery time and finish time in one array, along with values of nodes, and sorted them by position. Finally, by iterating through that array and updating BIT, made solution for every node.

Code.

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

Does this work for platinum 1st problem?
Firstly build eulerian tour over tree. Now sort cows by p. Answer for cow v is (sum on segment [l[v], r[v]]) / 2, and after that add position l[v] and r[v] 1.

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

Is there any way to submit now? I optimised P2 a bit but time was up!!

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

Where can I find problems? http://usaco.org/index.php?page=contests have only problems till first contest

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