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

Автор BledDest, история, 6 лет назад, По-русски

1016A - Death Note

Разбор
Код решения (Vovuh)

1016B - Segment Occurrences

Разбор
Код решения (PikMike)

1016C - Vasya And The Mushrooms

Разбор
Код решения (Ajosteen)

1016D - Vasya And The Matrix

Разбор
Код решения (Ajosteen)

1016E - Rest In The Shades

Разбор
Код решения (adedalic)

1016F - Road Projects

Разбор
Код первого решения (PikMike)
Код второго решения (BledDest)

1016G - Appropriate Team

Разбор
Код решения (adedalic)
  • Проголосовать: нравится
  • +41
  • Проголосовать: не нравится

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

Can someone prove/find a countercase for my solution for D? 41174052

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

I upsolved D in the same manner. Will try to explain the logic behind it [Since the editorial simply left it to the reader to find its proof]

Let r,c be the dimensions of the matrix, row[1..r] be the row wise xor value array, col[1..c] be the column-wise xor value array.

Temporarily, forget a[1][1]. Fill a[1][2] with col[2], a[1][3] with col[3] and so on.. So everything except col[1] is satisfied right now. (We are filling the first row, except the first element, with values from col array)

Similarly, fill a[2][1] with row[2], a[2][3] with row[3] and so on.. Everything except row[1] is satisfied right now (We are filling the first column, except the first element, with values from row array)

Now we have a[1][1] left. Based on the values we filled right now, the current xor value of the first row in our matrix is col[2]^col[3]^..col[c]. This value, can also be represented as C^col[1], where C = total xor of the col array (col[1]^col[2]^..col[c]).. We know that the xor value of elements in first row should be row[1]. Hence, if a[1][1] is equal to C^col[1]^row[1], our answer satisfies all the stipulated properties.

What if we had done it the other way round? Lets check that out. Based on the values we filled right now, the current xor value of the first column in our matrix is row[2]^row[3]^..row[r]. This value, can also be represented as R^row[1], where R = total xor of the row array (row[1]^row[2]^..row[r]).. We know that the xor value of elements in first column should be col[1]. Hence, if a[1][1] is equal to R^row[1]^col[1], our answer satisfies all the stipulated properties.

If we had chosen either of the above options, it would still be the same value. Its because R=C!

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

    How can we be sure this always identifies an impossible case? E.g what if using some other strategy you can make a matrix when this method returns "NO"?

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

      The initial check, about R not being equal to C (refer my first comment for notations), is enough for the impossible condition.

      R will have each element represented once, while C will have each elemented represented once. Xor-ing these two values should give zero.

      Hence, checking for this condition and then proceeding with this algorithm of filling the first row and first column alone, and leaving the other elements as zero is a good enough solution.

      Forgive me if I misunderstood your question.

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

        What if there is some case where you can fill some of the 0's such that an input you deemed "impossible" is possible. My question is how can you prove this case does not exist, because of course it works when there is a valid matrix, but how can we be sure it always identifies impossible case.

        I waited for this to be explained in editorial, and I'm a bit disappointed they didn't even mention it.

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

    You haven't given the proof rather you have explained the obvious thing. If you know the thing what @burdy said then please share otherwise the above thing of yours is just like some irrevelant stuff which I think everybody knows already :xD.

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

In problem D... Why if xor of a1 a2 ...an != to xor of b1 b2 ...bm the answer is no??

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

    Because is xor of all elements in matrix, and is xor of all elements in matrix. So they must be equal.

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

Could someone explain to me the logic behind exercise — C? I can't seem to understand it,even after reading the editorial.

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

    Let first you have to move in a zigzag pattern then go right to end and then left where you stop zigzag pattern.(it's cover all case) Key point is if you start moving in straight line you can't allow to move in zigzag pattern again only one 'U' turn at end.(think why?)

    So you can stop zigzag pattern at 1,2,3,...,N-1.For each value where you stop zigzag pattern (1<=i<=N-1) . You can find total weight of the collected mushrooms in O(1) by help of sum123, sum321 and sum111.

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

Problem D can be solved with Gaussian Elimination. This way the solution is more straightforward.

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

    can you elaborate?

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

      Since a[i], b[i] <= 10E9, for each number in the table, there are at most 30 bits, and each bit is independent from others. I mean, the k-th bit of c[i][j] has nothing to do with (k + 1)-th bit, etc.

      Consider k-th bits of all c[i][j]. Let denote that b[k][i][j] = 1/0.

      Now you can see that we have a system of n + m linear equations such that:

      (b[k][1][1] + b[k][1][2] + ... b[k][1][m]) % 2 = k-th bit of a1

      ...

      (b[k][n][1] + b[k][n][2] + ... b[k][n][m]) % 2 = k-th bit of a[n]

      (b[k][1][1] + b[k][2][1] + ... b[k][n][1]) % 2 = k-th bit of b[1]

      ...

      (b[k][1][m] + b[k][2][m] + ... b[k][n][m]) % 2 = k-th bit of b[m]

      This way, it makes sense that a solution of this system of equations is also a solution for all k-th bits of c[i][j]. In order to find a solution, use Gaussian Elimination. Since there are 30 bits, do this 30 times :)

      Here is my AC code 41183870

      In my code, in order to implement easily, I assume that every equation has n + m variables. However, if the variable is unnecessary for the equation (for instance, b[k][2][1] is unnecessary for (*)), let the coefficient 0, otherwise 1.

      In addition, since the eliminating process is the same for all bits, I list all bits at once and do the eliminating process once only.

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

In problem C what if we were not allowed to fill 0 as an entry i.e. if 1<=c<=2*10^9 ??

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

Can someone please explain how to implement problem C ?

Thanks.

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

There's a bug in test data in Problem F:

There is an Accepted Submission: 41232049

The test data:

4 1
1 2 1
2 3 1
1 4 100
1

correct answer should be : 100(link the vertex 1 and 3)

but its answer is: 3

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

    That's called an incomplete testset, not bugged. Just a missed possibility for the hack.

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

      Sorry for my poor English,⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

      So will the test data be updated?or still incomplete ?

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

        It has been added. Previous submissions are not retested, obviously, but this test will present for the further ones.

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

Can someone explain me how sum111 is handling the growth of the mushrooms in Problem C.

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

    sum111[i] is the total speed of mushroom growth in the cells on segment [i .. n].

    So, for example, if we start collecting mushrooms on segment [i .. n] in time moment 2i — 2, then we add to the answer the value of sum123[i] + sum111[i] * (2i — 2).

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

Someone, please correct me if I am wrong but can the top left element be also set as b1 ^ a2 ^ a3 ^ ... ^ an in problem D .

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

    Since a1 ^ a2 ^...^ an = b1 ^ b2 ^...^ bm, so, of course, a1 ^ b2 ^...^ bm = b1 ^ a2 ^...^ an.

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

There are two announcements and two tutorials link in problems page.

awoo

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

It's interesting that the second solution for F works even without the restriction that the input graph is a tree. Have you used the same technique before for other problems?

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

    That's really interesting, I didn't even see that.

    In fact, it will be better if I address this question to vovuh because he actually proposed this idea in problem F (and I just implemented the solution and handled the fact that the edges we add are bidirectional).

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

    Wow! Such an interesting fact. Well, I haven't used this idea earlier (I suppose). I came up with it while I thought about a shortest paths graph condition (for the edge (x, y) it is true that this edge is in the shortest paths graph iff d1x + w(x, y) + dny = d1n or d1y + w(x, y) + dnx = d1n, it is well known equation). And I decided that it also can be true for the general case, but I haven't thought about it.

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

Why is Binary Search giving me TLE in Proble 1016E — Rest In The Shades ?

http://mirror.codeforces.com/contest/1016/submission/41256720

I think there's no better solution than O(log n) per query.

Please help !!!!

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

    try using scanf and printf the timlimit is to hard for this one i believe... i only got AC with scanf and printf too

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

    It was mentioned in the other thread that reading integers as doubles with cin slows down solution greatly.

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

The graph for problem F can be further restricted: its a path between 1 and n where every vertex on the path has at most one additional child wich is a leaf. (in every other case there would be 3 vertices connected by two edges which are not on the 1 to n path. Adding a third edge to this triangle would not change the shortest path as the added edge cant even lie on any simple path between 1 and n)

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

There's a typo in the tutorial for problem C. Instead of the ai s, we have ak s. I'm mentioning this because I initially got confused while reading the expressions in the tutorial.

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

Someone can explain to me why we do exactly this pr[i + 1] = pr[i] + ok[i]; and this --l, r -= m - 1; in problem B? This is not clear to me

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

Can someone explain the statement for(int i = 0, j = 0; j < n; ++j, i ^= 1) in problem1016C

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

In Problem C's editorial,

"Let's iterate on the number of columns Vasya will pass in a zigzag pattern and maintain the weight of mushrooms he will collect while doing so."

How exactly we know which zigzag path we have to take and upto where ?

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

    Firstly, we can observe that there are exactly (n + 1) ways to go through the grid

    Ill express the coordinate using the format (row_num, col_num)
    The first scenario is to from (1,1) to (1,n) then to(2,n) then to (2, 1) (Sample Input 1)
    The second scenario is a zig-zag pattern (Sample Input 2)
    The rest is by combining the two.

    Any other scenario will block the previous cell and disconnects the grid

    Example:
    n = 3
    (1,1) -> (1,2) -> (2,2) -> (2,3) -> (1,3)

    Obviously, all path to (2,1) is blocked

    With the above conclusion, we can use Dynamic Programming to precompute the prefix sum and calculate the answer

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

      Many thanks! That helped clear the cloud of ignorance in my thinking pattern. "Any other scenario will block the previous cell and disconnects the grid" — this line hit me so hard, i realized where i was stuck.

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

Maybe there's an easier solution for D. The matrix could be

b[1] b[2] …… b[m-1] (a[1] xor b[1] xor b[2]……b[m-1])

0 0 …… 0 a[2]

0 0 …… 0 a[3]

....

0 0 …… 0 a[n]

Because (a[1] xor b[1] ...b[m-1]) xor a[2]...a[n] = b[m], so it is a possible solution

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

1016A - Death Note

[Problem:B] - Segment Occurrences

Can someone please explain to me why 'l' is decremented in the last for loop?

And also it would be much appreciated if you explain for any value x, what does pr[x] stand for? From the above code, I guess pr[x] represents the number of times string 't' appears in s[1, x+|m|-1].

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

    First, see prefix sum : https://www.hackerrank.com/topics/prefix-sum

    And decrementing of l because the input is given 1 based while we work zero based in our arrays.

    Second, hope looking at it from the other side clears it up. So here's my approach. You'll find prefix sum of occurrences of string t in s but instead of marking the start positions of the string, you'll mark the end positions.

    For example, in the first test case looking for for in codeforces the prefix array will look like this

    c o d e f o r c e s

    0 0 0 0 0 0 1 1 1 1

    now pre[i] means number of occurrences of string t in string s in [0, i]. This is consistent with given r but we need to push l (m-1) positions. now you have pre[r] and pre[l+m-1]. To get what's in between them you substract pre[r] — pre[(l+m-1) — 1].

    Hopefully this clears it up also see my code 41592407 for further understanding

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

      I've gone through your solution thoroughly and understood how you actually stored number of occurrences of string t in prefix sum array using the end index, that way it makes the range clearer! Thanks a lot for your help Bekh :)

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

There's no need to do prime factorization in problem G, it can be solved in true polynomial time. Just factor $$$Y$$$ relative to numbers $$$a_1, \ldots, a_n, X$$$. By relative factorization I mean, represent $$$Y = f_1^{b_1} \cdots f_k^{b_k}$$$, where $$$f_i$$$ are pairwise coprime and for each $$$r \in a \cup X$$$, $$$GCD(r, f_i)$$$ is either $$$1$$$ or $$$f_i$$$. This factorization can be easily found by starting with $$$[Y]$$$ and refining it with each element of $$$a \cup X$$$. Finally you can safely use this factorization instead of the true prime factorization of $$$Y$$$ in the same way as in the editorial.

Sample code: 82648734