yarrr's blog

By yarrr, 11 years ago, In Russian

Можно ли обсуждать задачи? (а то тишина что-то)

Если да, расскажите пожалуйста как решаются задачи B, E, F.

  • Vote: I like it
  • +32
  • Vote: I do not like it

»
11 years ago, # |
Rev. 4   Vote: I like it 0 Vote: I do not like it
  • A: Select a node, keep toggling until all of the nodes becomes same color. :)
  • C: DP with state (pos in string, knight1, knight2)
  • D: Exactly as gen said, Ternary Search on time.
  • G: Pure Backtrack. One of our team mates observation was like: if you arrange 36 nodes in 6 x 6 fashion and add edges between adjacent rows, from S to all top row, bottom row to T, then we have only 6^6 ways for going from S to T. which is quite low. We are not sure if this is the worst graph (here to simplify we took 38 nodes) [but there 2^6 also, for 18*2 it makes 2^36 may be]
  • H: loop over all gcd, run a loop over number to see if there is any segment where gcd is that number. its easy.
  • I: I am not sure how many team mate did it, my idea is, you can in O(nlogn) list all divisors for all numbers from 1 to 2e6. Now we know: a + ... + b = (b — a + 1)(a + b) / 2. So see if for each of the divisors of given n, you can find out such a and b.
  • J: DP in two stage. One inter-group another intra-group. Both almost same bitmask DP

Unsolved:

  • B: no idea
  • E: I coded DP but later found I overlooked a special permutation, giving WA
  • F: For each number you need to keep track of the number (previous and next) which is not co-prime to it. Say we get a-b pair (a, b are index) if a-b distance is > k ignore. Otherwise, from (k — (b-a)) ~ a add 1 to segment tree and so on. If you just check for 0's in Segtree you will find answer. Not sure if it is correct.
  • »
    »
    11 years ago, # ^ |
    Rev. 5   Vote: I like it 0 Vote: I do not like it

    I don't understand how you solve H. Could you be more specific?

    I solved it using divide and conquer with bitset and a little heuristic.

    But how to solve it in 4 mintes???

    In I:

    k=number of consecutive numbers

    a=starting number

    x=the number we want to get

    x = a*k + k*(k-1)/2

    Then i just thought

    for a to 10e6:

    for k to (while possible):

    would pass XD

    and it passed XD

    • »
      »
      »
      11 years ago, # ^ |
      Rev. 2   Vote: I like it +3 Vote: I do not like it

      assume gcd = g,

      last = 0
      for i = 0 to n - 1:
        if num[i] % g == 0:
          if last == 0:
            last = num[i] / g
          else
            last = gcd(last, num[i] / g)
          
          if last == 1:
            "g can be gcd"
        else
          last = 0
      
  • »
    »
    11 years ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    For G you can write a dp to calculate the worst case graph for number of shortest paths. The problem is to create a sequence of positive integers which sum to 34 where the product is maximized.

    Here is the code in python:

    N = 34
    dp = (N+1) * [(0,)]
    dp[0] = (1,)
    for j in range(1,N+1):
       for i in range(j):
          dp[j] = max(dp[j], (dp[i][0]*(j-i),)+dp[i][1:]+(j-i,))
    print dp[N]
    

    The answer: (236196, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3)

    or

    236196 = 4 * (3 ^ 10)

    • »
      »
      »
      11 years ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      yap, but at the same time, i think to choose/not to choose gold is a factor, but in this complete type graph that factor is 1, since you can always come back. So making a worst graph is a bit difficult, right?

      • »
        »
        »
        »
        11 years ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        This is the worst case graph for maximizing the number of shortest paths. This would be the worst case runtime for a brute force all shortest paths solution that used Dijkstra's Algorithm to pay back the necessary nodes.

        There are many graphs you can make that require payback but they reduce the number of shortest paths in the process. So yes, depending on the solution, constructing a worst case graph is hard. :)

        A solution that brute forces all shortest paths but then brute forces all gold usage on all shortest paths should TLE. I don't think the data is strong enough to break that solution. :(

»
11 years ago, # |
  Vote: I like it +5 Vote: I do not like it

A relatively complex, but non-hacky solution.

1) divide the nodes into levels according to BFS order from node #1; you can merge all levels starting from the one containing node #2 for convenience.

2) process levels in ascending order and apply the following dp:

dp(i, P) — maximum money we can get on the (shortest) path to i such that the current level of nodes has partitioning P.

Partitioning of nodes of a particular level means node arrangement into sets, where all nodes of a set are connected internally and disconnected from nodes in others sets. Two nodes are connected if there exists a path between them in a graph induced by nodes on current and all previous levels minus the nodes we have stolen gold from. Also, mark one or zero sets as special if the nodes in this set are also connected to node #1.

knowing dp(i, P), try all edges from i to j on the next level of nodes, and try both stealing and not stealing the money from i, and update dp(j, P) accordingly.

3) base case: dp(1, {{1}}) = 0

4)result: max of dp(2, P) over all P's, where node #2 is in the special set.

»
11 years ago, # |
  Vote: I like it 0 Vote: I do not like it

Hi! I already have an opencup account. I have tried "Sector admin tools -> Ejudge console"(under google translate XD), but didn't find recently contest. Could you tell me where to submit this contest's problem after the contest?