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

Автор nocriz, 4 года назад, перевод, По-русски
1262A - Математическая задача

Автор: RDDCCD

Разбор
1262B - Коробка

Автор: RDDCCD

Разбор
1261A - Грязно

Автор: RDDCCD

Разбор
1261B1 - Оптимальные подпоследовательности (упрощённая версия)

Автор: MikeMirzayanov

Разбор
1261B2 - Оптимальные подпоследовательности (усложненная версия)

Автор: MikeMirzayanov

Разбор
1261C - Поджог в лесу Берляндии

Авторы: BledDest, adedalic

Разбор
1261D1 - Неправильный ответ на тесте 233 (упрощенная версия)

Автор: RDDCCD

Разбор
1261D2 - Неправильный ответ на тесте 233 (усложненная версия)

Автор: RDDCCD

Разбор
1261E - Не равны

Авторы: nocriz, RDDCCD

Разбор
1261F - Xor-множество

Автор: nocriz

Разбор
  • Проголосовать: нравится
  • +113
  • Проголосовать: не нравится

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

Auto comment: topic has been updated by nocriz (previous revision, new revision, compare).

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

The tutorial for 1261B — Optimal Subsequences is not ready, but I feel that it is better I post the tutorial soon! That problem is not by me and I hope the tutorial will be available soon.

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

    I can just post the brief solution:

    • The optimal subsequence for a given $$$K$$$ contains the largest $$$K$$$ values.
    • If the indices with the smallest of these values can be chosen in multiple ways, we want to choose smaller indices.
    • That means we want to sort the sequence of all $$$(A_i, -i)$$$. We get the answer to a query by taking the last $$$K$$$ pairs, sorting the indices in them and taking the $$$id$$$-th of these indices.
    • Easy offline solution: sort queries by $$$K$$$, add pairs one by one, build a sorted array of indices in them either using a treap or some sqrt structure.
»
4 года назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Qualifying round for Technocup (competitions for CIS schoolchildren), but tutorial in English only. hmm

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

obviously, its' easy and similar words are not appropriate for editorials. I understand that once you know the solution it obvious. There are thousands of people who were didn't found it obvious.

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

    Which part exactly do you need us to explain? I'll be glad to answer your question.

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

      A-Messy It's easy to construct a valid bracket sequence, I am puzzled if we can construct any valid sequence? If so probably we put all left brackets to left and right to right side, but I think we need to construct K outer brackets. maybe code solution example would help

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

        65626236 I would recommend you to see tourist's solution.

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

        I think "valid" is supposed to mean "with exactly K outer brackets". The example given in the tutorial is ()()()()((((())))) for say K=5; so you just put K-1 empty brackets first, then all the left brackets, and finally all the right brackets. This will always give you a valid bracket sequence with K outer brackets.

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

My $$$(n + q) \ log \ n$$$ solution for 1261B2 - Optimal Subsequences (Hard Version)

Greedy
Binary Indexed Tree(BIT)

Code : 65736937

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

Why the following statement in Problem F is true? Shouldn't it be $$$4 \times n^2$$$?

We can prove that the number of both "real" and "auxiliary" segments of any size is not greater than 4 x n.

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

    Consider a access to [l,r] on the segment tree, we would call the segments we accessed and found that the segment is completely in [l,r] real segments, and all segments we visited are auxiliary segments. Since we tried visiting n intervals (All intervals in A or B), and for each visit the segments (nodes) we touched of each depth is not greater than 4, the number of both "real" and "auxiliary" segments of any size is not greater than 4 x n is proved.

    This is the same with the proof of the complexity of the segment tree, I found this on internet only 4 nodes are processed in a level.

    Sorry, but I have no idea why it could possibly be $$$4n^2$$$.

    Check out my solution for more information:65749995

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

For anyone looking for the solution of 1261B2 - Optimal Subsequences (Hard Version) in Java, you can refer to my solution. I used the same approach as mentioned in the tutorial and used Segment Tree to find the kth smallest element in the set. 65750497

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

    Btw no need to binary search on seg tree queries, you can use this trick, (ctrl-f for find_kth)

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

      Thanks a lot, exactly what I was looking for. It decreased the time complexity from log(n)^2 to log(n). Thanks a lot.

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

Thank you so much for the contest and editorials!

I'm just wondering if anyone has a solution which runs under $$$O(n^2)$$$ for Div1A/Div2C (Messy)? Or alternatively, is there a way to show that it is not possible to do this with better time complexity?

Thanks!

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

    I was wondering the same.

    After spending 5 mins thinking about a solution, I noticed n^2 can also pass but it looked like it can be solved in better complexity too.

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

    There are several ways to implement a solution that runs under $$$O(n^2)$$$.

    Both operations explained in the editorial can be implemented in $$$O(log(n))$$$ using treap: code

    Also, you can notice that in this problem, reversing a range is only going to change the value of two positions (start and end of the range). So you can implement the reverse operation with a simple segment tree (by updating both ends of the range only). Finding the first position to the right equal to a value can be done in more than one way using the same segment tree. For example:

    • Binary search over prefixes starting in each position in $$$O(log^2(n))$$$: code.
    • Descending over the nodes of the segment tree, achieving $$$O(log(n))$$$: code.

    I didn't explain every detail in case someone wants to think about them. I'm not sure whether a $$$O(n)$$$ solution exists. Feel free to ask anything :)

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

    Actually it can be done in $$$O(n)$$$. Here is my code: 65767515

    The main idea is to create pointers first_opened and first_closed for first ( and ) in s and just update them. The solution is similar to the solution in the editorial. But every time when $$$s[i] \neq t[i]$$$, look at the substring s[i..max(first_opened, first_closed)]. It is either (..() or )..)(. Reverse can be done in $$$O(1)$$$ and after that you have to fix pointers, it is $$$O(n)$$$ total (details in the code).

    Also, I'm pretty sure that there is no $$$o(n)$$$ solution :)

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

I saw solutions for B1, B2 using Segment Tree and BIT. How can we find kth smallest element in set using those 2 data structures? I solved it using ordered_set (PBDS in GNU).

Also, is insertion operation also supported with this trick (with the use of BIT/SegTree)?

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

You can do the hard version of optimal subsequences with online queries using sortings and a mergesort tree. Here is my solution: https://codeforces.com/contest/1262/submission/65675557

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

    Also you can compute persistent segment tree for each prefix that will store for each value count of it. And you will just go down in this tree in O(log n) to find min prefix with sum >= k.

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

The issue is solved.

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

Can somebody please explain why we should multiply the answer by k^(n-t) in div1D/div2F i think the n-t other answers have fewer possibilities

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

Sorry, but I have tried hard but still can't understand the given solution of 1261E ,I wonder what's the meaning of operations for {4,1} and the later stuff? Looking for your reply (:

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

    I'm sorry if the editorial is hard to understand. {4,1} means that we currently iterated through two elements in A, namely 4 and 1. If the next element in A is 1, then there are three numbers we handled, {4,1,1}. Be careful not to mix it up with the "compressed set".

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

I solved problem E using the concept entropy, you can see it here.

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

    Can you give a brief explanation of your solution? How have you used entropy here?

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

      First, I don't have a proof for my solution, but I can explain the process to let you understand what I'm thinking. First, change the original problem to this: Make $$$n$$$ subsets of $$${1,...,n+1}$$$,call them $$$T_1,...,T_n$$$. And, these should hold: $$$|T_s|=a_s$$$, for any $$$i\neq j\in [1,n+1]$$$, $$${k|i\in T_k}\neq{k|j\in T_k}$$$. This means, we should use $$$n$$$ sets to tell $$$n+1$$$ elements apart. And now, there comes the entropy. If you have some sets $$$T_1,...,T_s$$$, then you use these $$$s$$$ sets to make the $$$n+1$$$ elements some classes $$$C_1,...,C_q$$$, and the entropy of this state is:

      $$$S(T_1,...,T_s):=-\sum_{t=1}^q[|C_q|/(n+1)]\log[|C_q|/(n+1)]$$$

      and the goal is to make $S(T_1,...,T_n)=(n+1)\log[n+1]$. Until now, there is nothing unproved. To achieve the goal, I choose greedy. Say, I already have $$$T_1,...,T_s$$$, how do I choose $$$T_{s+1}$$$, the way I use is to maximize $$$S(T_1,...,T_s,T_{s+1})$$$ without change the choice of $$$T_1,...,T_s$$$.

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

        I found that I was stupid. The proof for this is really easy, and, the proof will lead to a much easier way to solve the problem. I didn't read the tutorial, but I guess the solution tutorial is the "much easier way". Because for each $$$s$$$, there is at least one way to choose the $$$T_s$$$, so the number of classes will add one.

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

Problem : Arson in Berland Forest

How to do "add value on a rectangle" (using prefix sums)" ?

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

.

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

What if we want to minimize number of operations in 1261A?

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

How to solve 1261 C if we should also minimize the initial number of burnt trees for a particular maximum value?

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

1261C (Arson in Berland Forest) is doable in $$$O(nm)$$$ time by finding the largest square with lower-right corner at each cell, and then applying the skyline algorithm twice (once vertically, once horizontally on the result of the vertical). Normally the skyline problem is solvable only in $$$O(n\log n)$$$ time, however in this case we don't have any "nested" segments (i.e. a pair of segments s.t. one is higher the other and also contained within it), so I was able to solve it using a deque rather than a priority queue (as would normally be used to solve skyline). This allows us to generate a table M s.t. M[i][j] is the size of the largest square which contains the cell (i, j). Now just find the smallest positive element of M and that's the answer. (From here, finding a valid set of initial points is trivial)

My code here: 74775877

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

    emorgan Can you explain how have you used skyline to create M[i,j]? Hard to understand from your code.

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

      First, I build a table sz where sz[i][j] is the size of the largest square with lower-right corner at cell (i, j). This is a classical problem solved by dynamic programming.

      Then, I consider each row one at a time. For each index j, I would like to update the values of sz to the left of j, in a way that makes it such that the value in each cell corresponds to the size of the largest square containing that point, with lower-right corner somewhere in that row. To do this, I simply consider all such squares (i.e. all values in that row), and perform range max updates on that specific row on the interval covered by each square. The skyline algorithm actually allows us to do this in $$$O(n)$$$ time. The way it works is quite complicated, and I don't think I know how to explain it at a basic level.

      Then, we just do the same thing on columns instead of rows, and sz now holds the values of the desired array M which i mentioned in my previous comment.

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

        Thanks emorgan! Your this line makes sense to me — "update the values of sz to the left of j, in a way that makes it such that the value in each cell corresponds to the size of the largest square containing that point, with lower-right corner somewhere in that row". Some print statements in your code helped me to understand the while loops in skyline algo. As per my understanding, use of the first, second while loop is as per image1, image2 respectively.
        image 1 — https://www.dropbox.com/s/ixjh6pbje3tbv0j/pic1.jpg?dl=0

        image2 — https://www.dropbox.com/s/571zalnyq5mzs8m/pic2.jpg?dl=0

        But why are we doing skyline columnwise as well? After rowwise operation we already have max square which contains (i,j).

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

          After the row-wise operation, sz[i][j] stores the size of the largest square which contains (i, j), and also has lower-right corner in that same row. However, we need to consider squares from lower rows as well. So we perform a second column-wise pass to propagate the values from lower rows upwards. The end result is that each cell storing value $$$s$$$ updates an $$$s$$$ by $$$s$$$ square up and to the left, rather than just to the left along the row.

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

D2 can be solved very easily using ordered_set (for c++) https://codeforces.com/contest/1227/submission/88584680

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

I did Arson in Berland Forest by using (inventing ^_^) 2-dimensional sweepline algorithm. Have a look : 92480981

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

In DIV2E/DIV1 C, the wording of this statement could have been better You are sure that all burnt trees are shown on the map. All the trees outside the map are undamaged. " are undamaged " should have been replaced with " should be undamaged "

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

I tried to solve problem D2 of Div-2 using segment tree, where I am just assigning new indexes discovered in queries(sorted) to 1 and finding the pos-th 1. But it is giving WA on test 10. Can anyone please help me in finding what I did wrong. Thanks.

https://codeforces.com/contest/1262/submission/110093210