awoo's blog

By awoo, history, 10 months ago, In English

1861A - Prime Deletion

Idea: BledDest

Tutorial
Solution (BledDest)

1861B - Two Binary Strings

Idea: Roms

Tutorial
Solution (Roms)

1861C - Queries for the Array

Idea: BledDest

Tutorial
Solution 1 (Roms)
Solution 2 (BledDest)

1861D - Sorting By Multiplication

Idea: Roms

Tutorial
Solution (Roms)

1861E - Non-Intersecting Subpermutations

Idea: BledDest

Tutorial
Solution (BledDest)

1861F - Four Suits

Idea: BledDest

Tutorial
Solution (BledDest)
  • Vote: I like it
  • +119
  • Vote: I do not like it

»
10 months ago, # |
Rev. 3   Vote: I like it +27 Vote: I do not like it

These solutions explain very clearly.

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

»
10 months ago, # |
  Vote: I like it +15 Vote: I do not like it

thanks for the tutorial

»
10 months ago, # |
  Vote: I like it +12 Vote: I do not like it

Good problems, thanks for the round!

»
10 months ago, # |
Rev. 2   Vote: I like it +15 Vote: I do not like it

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

  • »
    »
    10 months ago, # ^ |
      Vote: I like it +15 Vote: I do not like it

    The point is that the sentence's coming from himself.

»
10 months ago, # |
  Vote: I like it +8 Vote: I do not like it

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

»
10 months ago, # |
  Vote: I like it +13 Vote: I do not like it

D was looking hard but it is easy

»
10 months ago, # |
  Vote: I like it +8 Vote: I do not like it

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

»
10 months ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

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

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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.

»
10 months ago, # |
  Vote: I like it -19 Vote: I do not like it
#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

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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!

»
10 months ago, # |
Rev. 2   Vote: I like it -11 Vote: I do not like it
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.

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

»
10 months ago, # |
Rev. 2   Vote: I like it +6 Vote: I do not like it

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

  • »
    »
    10 months ago, # ^ |
      Vote: I like it +4 Vote: I do not like it

    Thank you, this is an error. Will be fixed in a couple of minutes

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

woww clear editorial , tnx awoo , BledDest

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

  • »
    »
    10 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    ignore the question I didnt read that it ends with 1 and starts with 0

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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.

»
10 months ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

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

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

Roms very clean and readable code. Thanks.

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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 ??

  • »
    »
    10 months ago, # ^ |
      Vote: I like it +4 Vote: I do not like it

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

    So your test case is wrong.

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

What's wrong with this solution for C?

  • »
    »
    10 months ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    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. :)

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

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

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

»
10 months ago, # |
Rev. 6   Vote: I like it 0 Vote: I do not like it

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]

  • »
    »
    10 months ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it
    l=1,r=2,x=3   30  15  10  9  6  9  8  9  5 
    l=1,r=4,x=-1 -30 -15 -10 -9  6  9  8  9  5
    l=7,r=8,x=2  -30 -15 -10 -9  6  9 16 18  5
    l=9,r=9,x=4  -30 -15 -10 -9  6  9 16 18 20
    
»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

  • »
    »
    10 months ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    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.

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

  • »
    »
    10 months ago, # ^ |
    Rev. 4   Vote: I like it 0 Vote: I do not like it

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

»
10 months ago, # |
  Vote: I like it +1 Vote: I do not like it

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

»
10 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

»
9 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

  • »
    »
    7 months ago, # ^ |
    Rev. 2   Vote: I like it 0 Vote: I do not like it

    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?

»
8 months ago, # |
  Vote: I like it +1 Vote: I do not like it

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?

»
5 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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.

»
3 months ago, # |
  Vote: I like it 0 Vote: I do not like it

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

my submission

»
3 weeks ago, # |
  Vote: I like it 0 Vote: I do not like it
#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <string.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
typedef pair<int,int> pi;
#define F first
#define S second
#define PB push_back
#define MP make_pair
#define REP(i,a,b) for (int i = a; i <= b; i++)
int KadaneAlgorithm(const vector<int>& array) {
    int best = 0, sum = 0;
    for (int k = 0; k < array.size(); k++) {
        sum = max(array[k], sum + array[k]);
        best = max(best, sum);
    }
    return best;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    ll t;
    cin >> t;
    while(t--)
    {
        ll n;
        cin >> n;
        vi a(n);
        for(int i = 0 ;i < n ;i++)
        {
            cin >> a[i];
        } 
        vi pref(n,0);
        pref[0] = 1;
        ll res = 0;
        //cout << 1 << " ";
        for(int i = 1 ;i < n ;i++)
        {
            pref[i] = pref[i-1] + (a[i] >= a[i-1]);
          //  cout << pref[i]<<" ";
        }
        //cout << endl;
        ll sum = 0;
        for(int i = 1 ; i < n ;i++)
        {
            if(a[i] <= a[i-1]) res++;
        }
        for(int i =  n - 2 ; i >= 0;i--)
        {
            if(a[i] >= a[i+1])
            {
                sum++;
             //   cout << sum << endl;
                
            }
            pref[i] += sum;
        }
        for(int i = 0 ;i < n ;i++)
        {
           // cout << pref[i] << " ";
        }
        //cout << endl;
        for(int i = 0 ;i < n ;i++)
        {
            res = min(res,pref[i]);
            //cout <<pref[i] + ((n- (i+1)) - (pref[n-1] - pref[i]) )<<endl;
        }
        cout << res << endl;
    }
    return 0;
}

Can anyone tell me where am i doing wrong this is d question.