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

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

We will hold AtCoder Regular Contest 163.

The point values will be 300-400-600-700-900-1100.

We are looking forward to your participation!

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

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

Lost 80% of contest time by only thinking. depressed :(

How to solve C/D ?

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

Proud to submit B at the last second and got accepted! :)

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

Problem F is the same as this

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

Cool C & D, i get like 5 WA's on B, because don't think about case A[0] > A[1] ....

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

$$$C$$$ is interesting problem. We can notice that $$$\frac{1}{x} = \frac{1}{x+1} + \frac{1}{x(x+1)}$$$. This will be the only transition from $$$n$$$ to $$$n + 1$$$ — we will remove some $$$x$$$ and insert $$$x + 1$$$ and $$$x(x + 1)$$$. Since the size of set is $$$ \lt 500$$$, with high probability there will be no both these numbers.

My solution is:

set = {2, 3, 6}
for t in 3 .. n:
    while true:
        x = rand in set <= 1000
        y = x + 1, z = x * (x + 1)
        if y not in set and z not in set:
            set.remove(x)
            set.add(y)
            set.add(z)
            break
»
3 года назад, скрыть # |
 
Проголосовать: нравится -8 Проголосовать: не нравится

anyone get why https://atcoder.jp/contests/arc163/submissions/43201545 does not work for C?

asserts should ensure it works well + bruteforcing on all cases reveals no issues (i.e. all criterias are satisfied IMO).

Idea is quite similar, just the edge cases ($$$N = i * (i + 1)$$$) are handled slightly differently,

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

I saw the editorial is written by GPT-4. Was it generated from only problem, or from essential describing of solving method?

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

How to solve B?

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

Would anyone like to talk more about problem D. I read that "theorem" in the editorial, but I don't quite understand. For instance, it says that if s1,s2,...,sk form a strongly connected component, then A and B satisfy the condition. But, we have an edge from sk to s1, and this means that there is an edge directed from B to A, which is against the condition?

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

    My understanding of the editorial:

    SCCs (s1, s2, ... , sk) form a DAG.

    Let's arrange these SCCs so that iff i < j, then s_i is topologically earlier than s_j. With such an arrangement there may not be any edge from sj to si, if j > i, as that would lead to a contradiction (as sj is later in topological order).

    Note, that as it's a tournament, there exists a single topological ordering of the SCCs, as there is always a directed edge between any pair of vertices.

    So we can safely divide SCCs into sets A = { s1, s2, ..., si }, B = { si+1, si+2, ..., sk}, so that they meet the conditions. And there will be exactly K+1 such divisions into two sets of SCCs as we can choose any i in range [ 0, k ].

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

    s1,s2,...,sk form a strongly connected component

    Here is the misunderstanding. According to the editorial, (s1,s2,...,sk) do not FORM a strongly connected component. (s1, s2, ..., sk) ARE LABELS for all the strongly connected components in the graph.

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

    I did something different, although I didnt manage to debug and AC within contest.

    Basically, my dp state was dp[n][cc][m] = how many different graphs of n vertices have cc connected components and m edges from small to big. Once u have that its just simple math.

    The transition then is take k vertices to form the 1st CC in the DAG, suppose it has m1 s->b edges, and suppose the 1st CC to the rest of the CC have m2 s->b edges and the remaining CC-1 components have the rest (m — m1 — m2 edges). If you get the 3 parts, you can just multiply all 3 and add to dp[n][cc][m]. So ull add something like (ways to pick k vertices with m2 as described above)*dp[k][1][m1]*dp[n-k][cc-1][m- m1 — m2]

    Also u cant compute dp[n][1][m] directly, but you can get it via C(n*(n-1)/2, m) — dp[n][2][m] — dp[n][3][m] — etc. (Or maybe there is a combinatorial argument that eludes me)

    For the ways to choose the k vertices, basically its the number of multisets such that k numbers from 0 to (n-k) such that it add up to m2. (You can write a dp for that, I dont know of a formula, bars and stars is ordered which is not what we want)

    Depending on how u do it, it can take very long (like O(n^10)), but what I realised after the contest was that by reordering the loops, u can do convolution on the results of the 3 parts to get the result fast, instead of having 3 for loops (which is O(n^6)) and reduce to just O(n^4) or O(n^2logn) with NTT. Link: https://atcoder.jp/contests/arc163/submissions/43206412

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

    My code (according to the editorial):

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

C can even be found on search engines. Hope to see more interesting CP problems instead of well-know math problems.

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

I didn't know that GPT-4 is smart enough to solve E

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

How Does checker of problem C work?

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

    long double has accuracy upto 18 digits, right? and we need accuracy upto 9 digits for numbers between 1 and 1e9.

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

      untrue, taking only 9 digits is not enough, for example 9, 9, 9, .... 9(9 nine times) is correct (ignore equal rule break) and 9, 9..., 9, 1e9 is not correct but you will mark exactly opposite

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

        What I meant was something like

        Code

        returns true for the first case u mentioned, and false for second

        edit: hm you're right 9 digits are not enough because of upto 500 different additions.. still, 12 digits would do and we hv 18 digits (more than enough to guarantee correct answer)

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

          (2, 4, ....., 2^n, 2^n) adds to 1

          (2, 4, ....., (2^n) — 1, (2^n) + 1) gives a difference of the order 1e-25 according to my computer (for n = 28)

          one must always be careful of making such analysis without really giving any reason for why its correct.

          void Solve() 
          {
              long double ok = 1 << 28;
              long double sum = 0;
              
              sum += 2 * (1 / ok);
              sum -= 1 / (ok - 1);
              sum -= 1 / (ok + 1);
              
              cout << sum << "\n";
          }
          
  • »
    »
    3 года назад, скрыть # ^ |
     
    Проголосовать: нравится +10 Проголосовать: не нравится

    modulo hash fractions should work

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

    Note that the sum $$$1/a_1 + 1/a_2 + \dots + 1/a_n$$$ can have a denominator of about $$$(10^9)^n$$$, so it can be super close to $$$1$$$, while not being $$$1$$$ exactly.

    The bounds are low, so the checker can just calculate the exact fraction using big number arithmetic. It will only need the plus and times operations on bignums, and use those bignums in a fractions struct. It can be implemented without that much pain in C++. (If it is possible, I would do it with Python.)

    A fast way to do it is divide and conquer. So calculate the exact fractional sum for the left halve and right halve of the array, then add those two. This ensures most additions of fractions are done on small fractions, and only the last few additions are really done on really big fractions.

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

how to handle a[0]>a[1] in B?(0 based indexing)

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

    In that case, at least one of the endpoints will have to be modified (either the lower bound (a[0]) is greater than the minimum element or the upper bound (a[1]) is smaller than the maximum element for any elements in a[2..n]). The core of the solution does not change in this case.

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

Problem F is exactly the same with my idea.