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

Автор maroonrk, история, 4 года назад, По-английски

We will hold AtCoder Regular Contest 119.

The point values will be 300-500-500-700-800-800.

We are looking forward to your participation!

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

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

E was quite similar to 1513F - Swapping Problem.

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

    Is the solution similar? Cause in the CF problem two diff arrays are used.

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

      Yes, you just have to pay attention to the fact that you mustn't overlap an interval with itself, which isn't too hard to take care of.

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

      You can assume $$$b_i = a_{i+1}$$$.
      Then, you have to maximize $$$|a_i - a_j| + |b_i - b_j| - |a_i - b_i| - |a_j - b_j|$$$ instead of $$$|a_i - b_j| + |b_i - a_j| - |a_i - b_i| - |a_j - b_j|$$$.
      Hence, the two segments should be both in $$$X$$$ or both in $$$Y$$$ instead of one of them in $$$X$$$ and the other one in $$$Y$$$. The rest of the solution is identical.

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

A was a complete search on $$$b$$$.

C was really neat, a subarray can be chosen if the alternating sum of heights is 0.

What was the approach for B?

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

    If you visualize the 1s as empty cells and 0s as people/pieces on the array, the problem becomes: move each person to the correct spot in the final string, one person cannot walk past another. Answer is number of people that need to move. img

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

      That's pretty neat, thanks!

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

      Oh! So instead of working with "people" you work with "empty chairs" and that makes the solution straight-forward! Thats fantastic!

      I did some complicated counting and moving according to the rules and keeping track of how much people have been pushed and I needed to iterate forwards once and backwards once: Submission

      But this is so much simpler!

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

      How does this work?

      Consider the beginning of s and t in Sample 4, these are

      s=110011110111010...
      t=111111111111111...
      

      Here, the first '0' (in position 2) can and must be swapped with the 1 in position 4. After that first swap s looks like:

      s=111001110111010...
      

      And same pattern repeats until we have.

      s=111111111100000...
      

      But for that we needed more than 4 operations (it is 13 I think).

      Where am I wrong?

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

        You can move a $$$0$$$ to any position between the $$$0$$$ on its left and the $$$0$$$ on its right, using only $$$1$$$ move.

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

        Well, it isn't optimal to make that first swap between position 2 and 4 in the first place. For sample 4, if you go backwards instead it'll work.

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

        There always has to be a corresponding pair of 0s on positions from in $$$S$$$ and position to in $$$T$$$ such that in $$$S$$$ the elements (from, to] only contain ones. Then we can apply the operation to move the zero from from to to in $$$S$$$. Repeat until all zeroes are sorted.

        Why does such a pair of zeroes always exist?
  • »
    »
    4 года назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    How is this true? Any proof?

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

      It's useful in this problem to find an invariant. If we add a $$$1$$$ to two adjacent elements, notice that the alternating sum of the entire array does not change. The same if we subtract $$$1$$$. Thus, the alternating sum is an invariant. And we want all zeros, so the alternating sum of our array must be the same as all zeros, which is zero.

      In-contest though, I just did a few examples and it reminded me of multiples of $$$11$$$, like $$$352$$$, and one easy way to check for divisibility by $$$11$$$ is to take the alternating sum mod $$$11$$$ and check that it's $$$0$$$.

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

        Yes I agree! This was a very fantastic problem! The idea was to consider the sum $$$\sum_{i=1}^n (-1)^i a_i$$$ which is invariant under any such move(this is essentially the alternating sum) Originally I thought of $$$\left( \sum_{i=1}^n a_i \right) \pmod 2$$$ which unfortunately didn't work. You play around with it more and you realize the above invariant. By the way to those who are unclear how a solution after this would work, here are a couple of ideas:(I consider $$$1$$$-based indexing, just to be clear)

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

          Bonus 1 was almost what I did in-contest, although I didn't need to store $$$x$$$

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

            Umm I did say you don't have to store $$$pref$$$ or $$$x$$$

            Yes! For bonus $$$2$$$ your idea is exactly like mine, but I guess these ideas will be implementation heavy. I think a simpler solution would exist if you made use of the fact that

            $$$\sum_{i=1}^p a_i z^i = 0$$$

            where the $a_i$ are all integers(actually even rational is fine, but not needed here) and $$$z$$$ is a primitive root of order $$$p$$$(which is pretty much any root because $$$p$$$ is prime) iff all the $$$a_i$$$'s are equal. This thing works only if $$$p$$$ is prime. I am aware of a solution of the case $$$p = 3$$$ but I don't know a very clean way of generalising it to arbitrary primes.

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

              In my solution, I didn't store $$$pref$$$. I meant that it's trivial to remove $$$x$$$.

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

I am getting +ve deltas in ABCs and CF D2s, I must be improving.
ARC/SRM div 1-You what?

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

How to solve B?

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

    a[i] means the distance between i-th 0 and (i+1)-th 0.

    And a operation is a[i]+=x and a[i+1]-=x (x is not necessary be positive), and s equal to t iff (a[i] of s) = (a[i] of t).

    This can be done by greedy.

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

      Can you elaborate on the greedy part?

      How do you prove that you can always find a zero that you can move without hitting another zero. Implementation-wise, is this problem harder if you also have to output the moves?

      For example S=00111100 and T=11000011, the innermost zeroes have to move first so you can't just do left to right.

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

        A[i] need to be modified if and only if :

        1. $$$\sum_{j\leq i} A[j]=\sum_{j\leq i} B[j]$$$

        2. $$$A[i]=B[i]$$$

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

How to solve C?

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

    The intuition I had was the following: any operation will either increase or decrease the sum of odd-indexed values and even-indexed values by exactly 1. This means that the sum of odd-indexed and even-indexed values being equal is a necessary condition for (L, R) to be valid. One can notice that this is also sufficient (to see why, imagine doing operations to set values to 0 from the left to the right). This means that if you multiply all odd-indexed values by -1, the answer is simply the number of non-empty subarrays with a sum of 0.

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

The gap between C and {D, E} is too large :(

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

During the contest, TL (link):

REP(i, 0, w + h) {
	REP(i, 0, h + w) {
		...
	}
}

After the contest, AC (link):

REP(i, 0, w + h) {
	...
}

Nice problems anyway :) Thanks for the contest!

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

Did a problem similar to C appear on codeforces before?

I can't remember where I remember the parity trick from.

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

Someone have AC on E with $$$O(nlog^2n)$$$?

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

Editorial still not available? Currently I only see problem A's solution.

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

Editorial for D.

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

In A why the possible values of b is 0 to 59?

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

Can someone share a hint for Problem D? I've tried playing with bipartite graph constructions, but am not able to progress beyond that.

  • »
    »
    4 года назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Spoiler
    • »
      »
      »
      4 года назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится
      Almost There
      • »
        »
        »
        »
        4 года назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится
        Done :)
»
4 года назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится

My approach to D is slightly different — I also make a bipartite graph but one partition has red cells and the other has rows/columns. If we pick the last row/column (w.l.o.g. column), then we know that all red cells in this column can only be used with their rows, and we don't need to pick any other cells for these rows; this frees up all other red cells in these rows to be used with their columns, and so on. Notice that this way, we traverse the whole connected component of this row/column and find an ordering for all rows/columns in it except one. For every component with $$$r$$$ rows and $$$c$$$ columns, we can thus use $$$(r-1, c)$$$ or $$$(r, c-1)$$$. To combine it over components, a simple DP tells us the maximum number of columns we can use for each number of rows, and then we pick the pair ($$$r$$$ used rows, $$$c$$$ used columns) that gives the maximum answer. The rest is implementation of construction.

»
4 года назад, # |
  Проголосовать: нравится +8 Проголосовать: не нравится
My solution to D
»
4 года назад, # |
  Проголосовать: нравится +11 Проголосовать: не нравится

How to solve F?

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

    Dp of Dp

    dp[i][j][k] : consider the first i stations, the ways of "The distance to the last A is j,and the distance to the last B is k".

    And answer is $$$\sum_{\min(j,k)<K} dp_{n,j,k}$$$.

    You can do this dp in $$$O(N^3)$$$ .

    But you can find that if $$$j>k+2$$$, you can go to the next B and back to the previous A in 2 steps , so you can think j = k+2.

    This also works for $$$k>j+2$$$.

    So it is $$$O(N^2)$$$.

    my solution: https://atcoder.jp/contests/arc119/submissions/22690514

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

Editorial to Problem D:

The problem is quite similar to the following template.

Bombs in the Grid

Problem Statement: Given a grid $$$G[n][m]$$$, $$$1<=n, m<=10^3$$$, some cells have a bomb that can destroy either the row containing the cell or the column. Find an order in which to use the bomb to maximize the number of destroyed cells.

Tutorial: This genre of problems can be solved by building a bipartite graph with $$$n+m$$$ nodes. Node $$$i$$$ and $$$j+n$$$ are connected by an edge if a bomb exists in the cell $$$G[i][j]$$$. Suppose, we choose to destroy $$$r$$$ rows and $$$c$$$ columns. Then, the number of cells not destroyed is given as $$$(n-r)(m-c)$$$. So, we have to minimize this objective function. Find the number of connected components in the constructed bipartite graph. Let there be $$$p$$$ components of size $$$1$$$ comprising of row nodes only and $$$q$$$ components of size $$$1$$$ comprising of column nodes only. Let there be $$$k$$$ components with a size greater than $$$1$$$. We know that we will not be able to use $$$p$$$ rows and $$$q$$$ columns (as they don’t have any cell with the bomb). How to deal with the components of size greater than $$$1$$$? Consider one such component. Pick any node arbitrarily, (it may be a row node or a column node, without loss of generality, let’s assume we pick a column node), then we know that all bomb cells in this column can only be used with their rows, and we don't need to pick any other cells for these rows; this frees up all other bomb cells in these rows to be used with their columns, and so on. Notice that this way, we traverse the whole connected component of this row/column and find an ordering for all rows/columns in it except one. Now, for each of the $$$k$$$ components, we need to decide whether to root that component with a row node or a column node. Suppose we choose $$$x$$$ components that are to be rooted with row node, and for other components, column node is chosen to be the root. Then, the number of cells not destroyed will be $$$F(x)=(p+x)(q+k-x)$$$ where $$$p, q$$$ are fixed and $$$x$$$ can be varied. From mathematical analysis, if $$$p>q$$$, choose $$$x=k$$$ else $$$x=0$$$ for optimal value.

Implementation: Construct a graph with $$$n+m$$$ nodes, representing rows and columns, with node $$$i$$$ and $$$j+n$$$ having an edge if a bomb exists in cell $$$G[i][j]$$$. Let $$$p$$$ be the number of row nodes having no edge and $$$q$$$ be the number of column nodes having no edge. Let the number of connected components of size greater than 1 be $$$k$$$. If we only want to know the maximum number of cells destroyed, it is given as $$$nm-pq-k*max(p, q)$$$. If $$$p>q$$$, run multi-dfs considering row nodes only as root, else consider the column nodes as root. In the dfs call, suppose you are at vertex $$$u$$$, after calling dfs from its child $$$v$$$, add pair $$$<v, u>$$$ to the result. This will provide the ordering of using bombs. While processing the pairs in answer, let the current pair be $$$<v, u>$$$, if $$$v<n$$$, this means bomb in the cell $$$G[v][u-n]$$$ is used to destroy row $$$v$$$, otherwise bomb in the cell $$$G[u][v-n]$$$ is used to destroy column $$$v-n$$$.

Submission: https://atcoder.jp/contests/arc119/submissions/22699042