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

Автор awoo, история, 8 месяцев назад, перевод, По-русски

1861A - Простое удаление

Идея: BledDest

Разбор
Решение (BledDest)

1861B - Две бинарных строки

Идея: Roms

Разбор
Решение (Roms)

1861C - Запросы к массиву

Идея: BledDest

Разбор
Решение 1 (Roms)
Решение 2 (BledDest)

1861D - Сортировка умножением

Идея: Roms

Разбор
Решение (Roms)

1861E - Непересекающиеся подперестановки

Идея: BledDest

Разбор
Решение (BledDest)

1861F - Четыре масти

Идея: BledDest

Разбор
Решение (BledDest)
  • Проголосовать: нравится
  • +119
  • Проголосовать: не нравится

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

These solutions explain very clearly.

I'm sad I didn't AC problem D, but it is interesting!

»
8 месяцев назад, # |
  Проголосовать: нравится +15 Проголосовать: не нравится

thanks for the tutorial

»
8 месяцев назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится

Good problems, thanks for the round!

»
8 месяцев назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

Переводы разборов на русский скоро появятся (в течение 40 минут). Прошу прощения за задержку.

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

"BledDest is a graph theory lunatic" had me cracked up.

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

Test 3,682nd test case->great work in testing!

»
8 месяцев назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится

D was looking hard but it is easy

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

Another easy way to implement E is to just combine the last two states into one. So $$$dp_{i,j}$$$ counts how many of arrays of length $$$i$$$ exist such that the number of elements on the suffix we use is $$$x \equiv j \pmod k$$$ and the current cost of the array is $$$c = j\ /\ k$$$. Then the transitions are the same, but you just reset the partial sum whenever $$$j \equiv 0 \pmod k$$$ since you can never transition to a lower cost.

Submission: 221342327

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

In problem C, if you have : ++++1-0 when we verify the number elements in the array we have 3 elements but the array has to be sorted.

Edit : I misunderstood the second condition

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

during contest i had some trouble implementing C (i had same idea as described in approach 1) and using segment trees seemed easier to me. Idea is identical as described in approach 1 but it was easier for me to implement this way, so i thought of sharing it: code.

»
8 месяцев назад, # |
  Проголосовать: нравится -19 Проголосовать: не нравится
#include <bits/stdc++.h>
using namespace std;
#define all(v) (v).begin(), (v).end()
void solve();
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.setf(ios::fixed);
    cout.precision(10);
    srand(time(NULL));
    long long t;
    cin >> t;
    while (t--)
    {
        solve();
    }
}
void solve()
{
    string s;
    cin >> s;
    long long n = s.length();
    if (n == 1)
    {
        if (s[0] == '0' || s[0] == '-')
            cout << "NO" << endl;
        else
            cout << "YES" << endl;
        return;
    }
    long long flag0 = 0;
    long long flag1 = 1;
    long long count = 0;
    for (long long i = 0; i < n; i++)
    {
        if (s[i] == '+')
        {
            if (flag0 > 0)
                flag0++;
            flag1 = 0;
            count++;
        }
        else if (s[i] == '-')
        {
            count--;
            flag0 = max(0LL, flag0 - 1);
        }
        if (s[i] == '0')
        {
            if (count <= 1 || flag1)
            {
                cout << "NO" << endl;
                return;
            }
            if (flag0 == 0)
                flag0 = 1;
        }
        if (s[i] == '1')
        {
            if (flag0)
            {
                cout << "NO" << endl;
                return;
            }
            flag1 = 1;
        }
    }
    cout << "YES" << endl;
}

Can anyone tell me what is wrong with this solution to problem C. Thank you in advance

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

Hi all, it would really help if you can post some insights/hints for the problems of this contest on https://starlightps.org ! Here's a link to the problems: https://starlightps.org/problems/collection/cf-edu-154/. This will help us get more data so users can have a platform to:

  • share/discover hints/insights on various problems
  • find similar problems given insights they struggled with.

Check it out if you're interested. Thanks!

»
8 месяцев назад, # |
Rev. 2   Проголосовать: нравится -11 Проголосовать: не нравится
void solve()
{
    str s;
    cin >> s;
    stack<char> st;
    int nz = 0;
    for (int i = 0; i < s.length(); i++)
    {
        if (s[i] == '+')
        {
            st.push(s[i]);
        }
        else if (s[i] == '-')
        {
            if (st.empty())
            {

                cout << "NO" << endl;
                return;
            }
            else
            {
                if (st.top() == '1' || st.top() == '0')
                {
                    if (st.top() == '0')
                        nz--;
                    st.pop();
                    st.pop();
                }
                else
                    st.pop();
            }
        }
        else
        {
            if (st.size() < 2)
            {
                if (s[i] == '0')
                {

                    cout << "NO" << endl;
                    return;
                }
            }
            else
            {
                if ((st.top() == '1' && s[i] == '0') || (st.top() == '0' && s[i] == '1'))
                {
                    cout << "NO" << endl;
                    return;
                }
                if (s[i] == '1' && nz != 0)
                {
                    cout << i << " "
                         << "hello" << endl;
                    cout << "NO" << endl;
                    return;
                }
                if (s[i] == '0')
                {
                    nz++;
                }
                if (st.top() == '+')
                    st.push(s[i]);
            }
        }
    }
    cout << "YES" << endl;
}

what is the error in this code, getting WA in test 3, for problem C. I have used a stack-based approach.

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

Can someone find out what is wrong with my code problem c 221486376

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

Kevin114514 , How can you make A this much complicated ? His submission (221392540)

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

awoo,BledDest I think in tutorial of problem E, in the paragraph before the last, you should have written: "difference is: $$$dp_{i,j,c}$$$", instead of $$$dp_{i,j+1,c}$$$

because we have according to the second type of transitions

$$$dp_{i+1,j} <== d_{i,j} + d_{i,j+1} + ... + dp_{i,k-1}$$$

$$$dp_{i+1,j+1} <== d_{i,j+1} + d_{i,j+2} + ... + dp_{i,k-1}$$$

difference: $$$dp_{i+1,j}-dp_{i+1,j+1} = dp_{i,j}$$$ and not $$$dp_{i,j+1}$$$

I hope I'm not mistaking, but correct me if I'm wrong...

thx

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

woww clear editorial , tnx awoo , BledDest

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

at problem B wouldnt the example a = 00010000 b = 00011111 give a no?

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

thank you for the editorial It was really helpful, I have a question How on earth did you come up with that idea of the last x elements on problem E, You assumed some number and built the dp table on the assumed number, it is my first time to see such a thing I Don't think this sort of things come from practice, and the amazing thing is that most of accepted solutions are the same idea, Is that I'm too dump or you are too smart? Thank You :D

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

Why you most of the times post the editorial late, it is expected that you should post the editorial as soon as the hacking phase in over.

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

The title for D in the tutuorial text is Russian, not English. awoo fix it pls, thx

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

Roms very clean and readable code. Thanks.

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

Hey Author,

I am in trouble to get the Problem B

according to me for the test case

1
1000101
1000100

I am not able to find the way to make this same : (

but according to the Author code

it is printed YES

Can anyone know how to make this equal ??

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

    According to the question .. both the strings should start with 0 and end with 1's.

    So your test case is wrong.

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

What's wrong with this solution for C?

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

    In your code dealing with '-' :

    if (!unsorted.empty() && elements < unsorted.back())
                unsorted.pop_back();
    

    IF shoule be replaced by WHLIE , for the cases like this : ++++000-1 , you need to pop back more than once.

    Then your code will get accepted. :)

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

Any one could help me I don't know what is the wrong in this solution

https://codeforces.com/contest/1861/submission/221355113

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

Can someone please explain, what is the partial sum technique mentioned in E and why is it true?

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

For problem D can someone explain how can this be sorted in 4 operations? n = 9, a = [10 5 10 9 6 9 8 9 5]

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

Problem C Approach 1(Roms) Can anyone explain why we need to check it after each query? After each query, we can just check that the longest sorted prefix is shorter than the shortest non-sorted prefix

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

    If the current query is '1', then make longest sorted prefix equal current length, which is consistent with the current query. And the shortest non-sorted prefix is consistent with the previous queries. If longest sorted prefix is shorter than the shortest non-sorted prefix, it means the current query is valid based on the previous queries.

    If the current query is '0', then make shortest non-sorted prefix=min(shortest non-sorted prefix, cur_length), which is consistent with the current query. Then check the inequality.

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

Seems like this editorial doesn't explain why there is no better solution in problem D, which makes prefix with length x negative by several multiplications on negative number

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

    HELP, Can anyone prove the solution to Problem D. Why does this approach give an optimal solution? Thanks.

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

Why Was My Submission Skipped Despite Submitting First https://codeforces.com/blog/entry/120756

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

Can anyone help me in which test case is this solution going wrong it shows WA on 303 (test case 3)

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

I have an easier solution for E.

We can use dp in one dimension. Dp[i] means how many arrays with length i has the subarray from i-k+1 to i, which contains integers 1~k. Fac[i] means the factorial from 1 to i. Pw[i] means the i-th power of k.Every time, dpi has initial value fac[k] * pw[i-k], because we chose number from 1~k optionally to fill the position 1 ~ i-k+1, and from 1-k+1 to i, the ways is equal to an arrangement of 1~k.

But this may cause duplication, for example. n = 4, k = 3 and for the array 1 2 3 1, we will calculate the contribution in both dp[3] and dp[4], but the cost of this array is 1. To solve this, when we calculate dp[i], we need to minus dp[j] which j is from i — k + 1 to i — 1. Actually we need to minus dp[j] * fac[i-j] because dp[j] only caluculate array of length j. From the position j+1 to i, the ways we fill it is equal to an arrangement of 1~i-j.

Submission: Code

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

    Your solution is brilliant, although I don't know why the answer is sum of all dp[i] * Pow(k, n — i). It looks like taking any possible from the rest n — i elements, but it will be confused, as I don't know whether there is any duplication or not. Could you explain this part?

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

In the BledDest approach for problem C, specifically in this line:
"In terms of our tree, it means that a vertex marked with 0 has an ancestor (possibly itself) marked with 1."
Shouldn't it be the other way? find a vertex marked with 1 that has an ancestor marked with 0?

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

For C, what about the condition where something that is unsorted, is a prefix of something that's unsorted? Isn't that an automatic 'NO' as well?

For example, we have a 1, then we delete some characters without adding any, then we have a 0. That couldn't happen.

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

someone know why this submission keep wrong on test 3 problem C pls

my submission