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

Привет, Codeforces!

В 12.06.2023 17:35 (Московское время) состоится Educational Codeforces Round 150 (Rated for Div. 2).

Продолжается серия образовательных раундов в рамках инициативы Harbour.Space University! Подробности о сотрудничестве Harbour.Space University и Codeforces можно прочитать в посте.

Этот раунд будет рейтинговым для участников с рейтингом менее 2100. Соревнование будет проводиться по немного расширенным правилам ICPC. Штраф за каждую неверную посылку до посылки, являющейся полным решением, равен 10 минутам. После окончания раунда будет период времени длительностью в 12 часов, в течение которого вы можете попробовать взломать абсолютно любое решение (в том числе свое). Причем исходный код будет предоставлен не только для чтения, но и для копирования.

Вам будет предложено 6 или 7 задач на 2 часа. Мы надеемся, что вам они покажутся интересными.

Задачи вместе со мной придумывали и готовили Адилбек adedalic Далабаев, Иван BledDest Андросов, Максим Neon Мещеряков и Дмитрий TheWayISteppedOutTheCar Пискалов. Также большое спасибо Михаилу MikeMirzayanov Мирзаянову за системы Polygon и Codeforces.

Отдельное спасибо тестерам раунда ashmelev, shnirelman и Fanarill за ценные советы и предложения!

Удачи в раунде! Успешных решений!

UPD: Разбор опубликован

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

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

I hope +ve delta for me

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

Excited for the 150th edition of Edu round.

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

Good luck to everyone participating

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

Keep learning because life never stop teaching.

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

A contest after so long! There are two div 2 contests on 18th. Can one of them be shifted to another date?

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

hello, this will be my first contest on codeforces, any tips??

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

    may your "sheer luck" support you :)

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

    You may try any previous educational round as virtual round or simply solve.

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

    I am not an expert to advice you. But, anyways these are general advices that everyone recommends.

    1- You must stay calm (even if you stuck, even if you got WA) it's ok just try your best and keep a bottle of water with you.

    2- don't rush in reading the problem take your time in reading & thinking (use paper and pencil) investing ~15 minutes reading & thinking carefully may prevents you from getting a WA with penalty 10 minutes + frustration.

    3 — Before submitting try corner cases like when input is small, big, even, odd, prime , string ends with space, what if the last number in array doesn't break some condition ..etc. Think in some cases that you didn't handle.

    4 — Have a confidence in yourself (don't go with mindset oh this hard so I can't solve it) you will the fight before you even started (don't give up without a fight).

    5 — Fight for the last minute of the contest trust me you don't how many times you can submit a solution in the last few minutes.

    6 — After the contest ends try up-solve by solving the problem that you stuck at. If you stuck after the contest too you can see it's tags maybe it's on a topic that you don't know, go study it for a little bit and come back. Stuck again then go for the editorial.

    Good luck & I hope you have a +ve delta bro <3.

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

do you like yuanshen?

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

if i have a wrong submission without any correct submission then will i get panelty for that wrong submission?

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

    Wrong submissions for a problem you don't end up solving do not give you any penalty.

    But if you submit a wrong solution to some problem and don't solve it, your rating will get affected.

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

Fun thought experiment for problem setters: Write problem D without using $$$l$$$ and $$$r$$$.

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

after so many defeats, this is what i call a great comeback

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

bruh c was kinda... interesting

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

    I agree, although the main observation was easy to find, it took me too long to implement.

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

    yeah, it isn't hard but actually implementing all that is hell, I wasn't fast enough to start it and implement a solution.

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

      Yeah, it was hard to implement if you use greedy approach. but you can also solve it with DP and implementation wasn't that hard.

      #include <bits/stdc++.h>
      using namespace std;
      #define ll long long
      #define mod 1000000007
       
      const int N2 = 1e2 + 5;
      const int N3 = 1e3 + 5;
      const int N5 = 1e5 + 5;
      const int N6 = 1e6 + 5;
      const int INF = 2e9 + 5;
       
      vector<pair<int, int> > directions_8 {{-1, -1}, {1, 1}, {1, -1}, {-1, 1}, {0, 1}, {0, -1}, {-1, 0}, {1, 0}};
      vector<pair<int, int> >directions_4 {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
       
       
      int getMax(vector<vector<vector<int>>>& dp, string& str, int currIdx = 0, int currMax = 0, int rem = 1) {
          if(currIdx == str.length()) return 0;
       
          if(dp[currIdx][currMax][rem] != -INF) return dp[currIdx][currMax][rem];
       
          int charIdx = str[currIdx] - 'A' + 1;
       
          int possibleAnswer = - INF;
       
          if(rem == 1) {
              for(int i = 1; i <= 5; i ++) {
                  int temp = pow(10, i - 1);
                  if(i >= currMax) possibleAnswer = max(possibleAnswer, temp + getMax(dp, str, currIdx + 1, i, 0));
                  else possibleAnswer = max(possibleAnswer, -temp + getMax(dp, str, currIdx + 1, currMax, 0));
              }
          }
          
          int temp = pow(10, charIdx - 1);
          if(charIdx >= currMax) possibleAnswer = max(possibleAnswer, temp + getMax(dp, str, currIdx + 1, charIdx, rem));
          else possibleAnswer = max(possibleAnswer, - temp + getMax(dp, str, currIdx + 1, currMax, rem));
          
          dp[currIdx][currMax][rem] =  possibleAnswer;
          return dp[currIdx][currMax][rem];
      }
       
      int main() {
          ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
       
          int t;
          cin >> t;
       
          while(t --) {
              string s;
              cin >> s;
       
              reverse(s.begin(), s.end());
       
              int n = s.length();
       
              vector<vector<vector<int>>> dp(n + 1, vector<vector<int>>(6, vector<int>(2, -INF)));
       
              int answer = getMax(dp, s);
       
              cout << answer << endl;
       
          }
      
»
17 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Very good round, enjoyed it a lot

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

C was logically clear but was unable to code till the end of contest.

anyone explain the code process for the c question

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

What is problem C Wrong answer on test 9 ?

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

    You should consider that a certain large value in the back will affect many small values in the front, and in this case, you need to reduce the large value, such as DDDDDDDDDDDE,you should change E to D.

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

I reduced F to this problem: given a set $$$A$$$ of integer coordinates of the form $$$(x, y)$$$, find $$$\displaystyle\max_{S \subseteq A} [(\sum_{(x, y) \in S}x)^2 + (\sum_{(x, y) \in S}y)^2]$$$. Is this something well-known?

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

    I found this on google: link

    In short, you sweep through all possible lines through the origin. Each one divides the points into two sets, and you consider each of those two sets as a possible answer.

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

      I discovered another way which is possibly easier (only ACed 7mins after end)

      Consider 4 cases of sum(x) and sum(y). Assume sum(x) and sum(y) is positive, then you take all (+x,+y) and discard all (-x,-y). Then you take all (+x,-y) into your sum(x) and sum(y). Next, take the remaining (-x, +y) you didnt take as well as -(+x, -y) which you took (to undo taking them) and sort them increasing (abs(x)/abs(y)) ratio. Then you keep adding the (-x,+y) in sorted order to your sum(x) and sum(y) and take max everytime you do so. Repeat for all 4 cases. (Easiest way is just multiply all the x and y by 1/-1).

      The idea is like the 2 extreme points form like an arc, then the intermediate points form a convex hull of some sort. I cant prove but it feels like it works intuitively.

      Submission: https://codeforces.me/contest/1841/submission/209475017

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

      How good should my search skills be to find something like this?

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

    Treat each $$$(x, y)$$$ as a vector, then the problem becomes finding a subset of vectors whose vector sum is furthest from the origin. Googling "sum of vectors furthest" then brought me to https://cs.stackexchange.com/questions/56158/given-a-set-of-2d-vectors-find-the-furthest-reachable-point which provides a fairly nice to implement solution based on one radial sweep.

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

    I believe this USACO problem is a harder version of that. Copying from the editorial:

    Let f(x,y)=x^2 + y^2 be the function we want to maximize. It turns out that for any convex function f, we can apply the same solution.`
    
    Claim: We only need to consider evaluating f at the vertices of the convex hull of the set of all possible Minkowski sums.`
    
»
17 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

D was way easier than C and E is almost equal to C. Anyways, good contest.

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

    Can you Explain C and D.Plz.

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

      D: Sort the intervals by their left endpoint. Let $$$dp[i]$$$ be the maximum number of intervals in the range $$$[i, n-1]$$$ that we can keep (so the answer is $$$n - dp[0]$$$).

      We have two transitions: if we decide to skip interval $$$i$$$, then we let $$$dp[i] = dp[i+1]$$$. On the other hand, if we decided to keep interval $$$i$$$, we must find another interval $$$j > i$$$ to pair it up with. Now, we might as well pick $$$j$$$ to be the interval with the smallest right endpoint that intersects $$$i$$$, to minimize intersections with other intervals. Note that we have to skip over all other intervals that intersect $$$i$$$ and $$$j$$$, so let $$$dp[i] = 2 + dp[k]$$$, where $$$k$$$ is the leftmost interval that does not intersect intervals $$$i$$$ and $$$j$$$.

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

        I did it slightly differently but the implementation might be cleaner for some.

        Basically, realize that you can reduce the problem to

        1. make a new list of intervals that consists of pairs of intervals in the original array that have nonempty intersection, merged. You can do this in O(n^2).

        2. solve the maximum # of disjoint interval problem on this new list.

        3. your answer is n — 2 * # of disjoint intervals you found in step 2.

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

Test case 9 or problem C ruined my contest.

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

I like to see a magic trick where I lose 100 points at a time

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

Problem F almost = This Problem

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

Problem F almost = This Problem

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

My solution for C was to count the number of "positive" numbers before a letter, ie numbers that weren't guaranteed to be negative by an earlier number. Then calculate the "gain" you get by changing letter s[i] to k, by looking at whether s[i] was guaranteed to be negative by looking at the biggest letter strictly above it, and summing over the number of letters before it that would become negative by changing it to that value. Is this correct? I got wrong answer on testcase 10.

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

    Best answer can be negative (you only allow changes if best > 0)

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

      Hmmm. I did include that. I only set best initialized to -10^15. Maybe that was the issue.

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

Final EDIT: The solution can be negative. Never assume initializing best = 0 will work...

Problem C WA on test 10. Does anyone know what this test is?

Even implemented a brute force solution during the contest and tested on all strings up to length 10 and gives the same result as my solution. What am I missing?

Brute force solution:

def value(s):
    s = [ord(c)-ord('A') for c in s]
    res = 0
    md = 0
    for i in range(len(s)-1, -1, -1):
        if s[i] < md:
            res -= (10 ** s[i])
        else:
            res += (10 ** s[i])
        md = max(md, s[i])
    return res

def generate_replacements(s):
    yield s
    for i in range(len(s)):
        for d in range(5):
            if d == ord(s[i]) - ord('A'):
                continue
            yield s[:i] + chr(ord('A') + d) + s[i+1:]

def brute_force(s):
    return max(value(r) for r in generate_replacements(s))

EDIT: Up to length 10 may not be the best test since 10*D = E, etc. but my code doesn't seem to have issues with things like 100 * 'D' + 'E'.

EDIT2: It does have issues with 100 * 'D' + 'EE' of course...

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

    Input: 2 DDDDDDDDDDDDDDDDDDDE EEEEE

    Expected: 20000 50000

    Found: 28000 40000

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

      OK, So, we should consider decreasing the last E to D.

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

      I don't understand this comment. What does it have to do with mine?

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

      Yes, you can change at max 1, it implies either 0 or 1, so for TC 2, you change 0 times to get 50K

      For input 1, you can change E to D, so answer will be 20*1000

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

    The answer can be negative as well; I missed that at first and got WA on test 10. Maybe that's what you're missing as well.

»
17 месяцев назад, # |
Rev. 4   Проголосовать: нравится -67 Проголосовать: не нравится

I use prefix sum concept in problem c and change one by one charcter in string and every time i take maximum of all but got wr0ng answer on test case 9. Lmao what is the test case that missed my code anyone?

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

Кажется, что задача С — упрощенная версия задачи "Московские числа" (вроде такое название) с какого-то прошлого всероса

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

    задача классная! жаль только WA9... :(

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

SO problem D can be solved by Monotonic stack?

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

have no testers in educational rounds makes trouble again this time in problem F?

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

I tried doing a greedy graphy solution to D but didn't work :D.

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

https://codeforces.me/contest/1841/submission/209467430

What test case for problem B was this solution failing?

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

    I used 2 variables, a prev and current pointer, but my solution failed like 50 times cuz i forgot to check if i added the element prev is at, also try checking if the current number is smaller than first element if you got to the beauty something part (i hope u understood)

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

I think E is easier than D, didn't feel like it belongs there though...

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

    I have +- the same, i will not write Edu in future:)(cause on last maybe 4 edu i get -100. But on normal rounds i dont get such huge drop :))

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

What's test 10 for C?

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

Why am i getting Wa 9 at Problem C?? I changed every char from A to E and adjusted the change accordingly?? What am I missing?

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

    Your code is giving wrong answer for these type of input strings: DDDDDDDDDDDDDE . Changing last E to D is optimal.

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

      I figured out. I wrote some absolute bullSh*t there. Finally did with Dp. I should have thought through dp way too during contest.

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

A: If n>=5, Alice can combine n-2 ones to make the array {1, 1, n-2}, and Bob can only make it into {2, n-2} then Alice wins. If n<=4, Bob always wins.

B: A beautiful array need to be increasing, or there's an index i where a[1, i] and a[i+1, n] are increasing and a[n]<=a[1]. Therefore, we first need to check whether the queried x[i] is not smaller than the last appended element. When the first time we meet such x[i] doesn't satisfy the condition and x[i]<=x[1], we need to accept it, but we can't accept numbers where x[i]>x[1] from now on.

C: To solve this problem we need to pre-calculate 5 arrays sum[t][i]: the contribution of s[1, i] if s[i+1]==t and s[i+2, n] doesn't exist. We calculate it by the following process: First let cnt[u]=0 where 'A'<=u<='E'. When we see s[i]<t, we let sum[t][i]=sum[t][i-1]-10^(s[i]-'A') directly, since the contribution of s[i] will always be negative. Otherwise, we need to check for u where t<=u<s[i]: We let sum[t][i]-=2*cnt[u]*10^(u-'A') and cnt[u]=0, which means contribution of occurences of u changed from positive to negative. Finally we let cnt[s[i]]+=1. After we calculate the arrays, the problem can be solved by trying every possible change of s[i].

D: We sort ranges by r[i] increasingly and run dp: dp[i]=the maximum number of valid pairs for first i ranges after sorted. The transition is dp[i]=max(dp[i-1], dp[left(i,j)]+1) where j<i, r[j]>=l[i] and left(i,j) = the maximum index k where r[k]<min(l[i],l[j]).

E: Each row is divided into several segments by black cells. By greedy method we want to fill numbers in longer segments (since a consecutive segment of white cells with length k can contribute k-1 to the answer), so we need to calculate for each k, how many segments of length k in the matrix. If we scan the matrix from up to down (from n-th row to 1st row), we can see if a[j]=i, then there's a white segment being cut at position j when we scan to the i-th row. So we can let cnt[n]=n and cnt[t]=0 (1<=t<=n-1) at the beginning, when we scan to the i-th row, we cut segments at position j for all a[j]=i. When we remove a segment of length k, we let cnt[k]-=i, and when we add a segment of length k, we let cnt[k]+=i. We can store these segments by an ordered map. Finally we check segments from length n to length 2, and fill them to get the answer.

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

    In D, how do you deal with cases where l[i]<l[j]? Thanks in advance!

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

    There's a much easier to implement solution for C. If we change a character with another character having value greater than it, it's always best to change the first occurrence of the original character. And, if we change a character with another character having value less than it, it's always best to change the last occurrence of the original character. So we just have to check values of at most 31 strings, and print the maximum of those.

    UPD: at most 21*

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

      Did the same but initialised max with 0

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

      So we just have to check values of at most 31 strings, and print the maximum of those

      According to your observation, given a pair (original -> modified), there is only one string that needs to be checked.

      There are 5 different characters, and each one can be modified to 4, so shouldn't it be at most 5*4 + 1 = 21 strings?

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

      Used the same implementation but getting wrong answer on test 10. Not able to find mistake. mysolution

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

        ans can be negative, you shouldn't initialise it with 0.

         int ans=0;
         ans=max(ans,call(s));
        

        change this to

         int ans=call(s);
        
    • »
      »
      »
      17 месяцев назад, # ^ |
      Rev. 2   Проголосовать: нравится +12 Проголосовать: не нравится

      Can't wrap my head around the observation.

      Consider this testcase: CCBCEB

      Changing B to D, wouldn't it be better to change the last occurrence in this case?

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

        Yeah you're right, it should be the first occurrence of the character where changing the character results in a positive value for the character. Not sure how I overlooked this during contest. The original algorithm still works though, because for such cases, it'll be better to change the first occurrence to the character having max value which appears after it in the original string, which is luckily considered.

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

        I believe that increasing the first occurrence gives you the best answer. Increasing the later occurrence will give you atmost the same answer as before but it would not be any better for sure. Like in your example changing the 2nd B to D does not give you a better solution than changing the first B to D.

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

    I did it slightly differently but the implementation might be cleaner for some.

    Basically, realize that you can reduce the problem to

    1. make a new list of intervals that consists of pairs of intervals in the original array that have nonempty intersection, merged. You can do this in O(n^2), and multiple versions of the same array do not matter (e.g. the new list can have duplicates).

    2. solve the "maximum # of disjoint interval problem" on this new list of intervals

    3. your answer is n — 2 * # of disjoint intervals you found in step 2.

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

    sum[t][i]=contribution of s[1...i] if s[i+1]==t and s[i+2....n] doesn't exist.

    lets calculate sum[t][i];

    intialise cnt['A']=0,cnt['B']=0,cnt['C']=0,cnt['D']=0,cnt['E']=0;

    sum[t][i]=sum[t][i-1] here sum[t][i-1] is the contribution of s[1....i-1] if s[i]==t.

    if(s[i]<t) sum[t][i]-=value(s[i])

    but if (t at (i+1)th position < s[i]) means that bec u added sum[t][i-1] at there but at the ith place bigger element was there hence therefore for all 'A'<=u<= 'E' and u>=t && u<s[i] which were accounted as positive in sum[t][i-1] now need to be subtracted and make cnt[all need to be subtracted for whom s[i] is the greater just next greater element]=0 now ..

    recurse

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

      also one more thing dp states are just 5*2e5 ...when ever u see such things try to make dp .in this way the problem is very standard dp otherwise greedy makes the job even simple ...

      one more approch that i think will work:

      we can construct 5 multisets ...set a ,set b,set c,set d,set e;

      we have an algorithm named as next greater element by stack ds.use it to find next greater element of each .

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

That feeling when you solve a problem right after the contest is the worst.

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

I managed to bruteforce C by checking every possibility at every position and efficiently calculating the updated string value, did anyone else do the same?

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

Can anyone tell me why my code fails for problem B... 209470922

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

    Consider this test case : q = 8 and array = [1 1 8 8 2 3 8 3] Your output: 11111000 Actual ans : 11110010

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

Can hacks affect penalty time?

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

    No. In EDU, Div.3 and Div.4, i.e. contests with an open hacking phase, succesful hacks don't give any extra score and unsuccesful hacks don't give any penalty.

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

Amazing set of problems.

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

Does anybody know what is testcase 10 for C?

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

Amazing contest! If you guys feel stuck on any of these problems (Problem A, Problem B, Problem C, Problem D), Please checkout this video editorial on Youtube here

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

Hi can anyone help me to find a counter testcase where my code gives runtime error. Got runtime error on test 3 and couldn't find the fix till now. Link:- https://codeforces.me/contest/1841/submission/209481108

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

What's the technology used in F? I figured out the goal is to maximize $$$(\sum a - \sum b)^2 + (\sum c - \sum d)^2$$$ but i don't know how and seems LGMs' solutions all involved in vector and convex hull things.

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

Can you guys tell where my code is wrong for B[submission:https://codeforces.me/contest/1841/submission/209450341]

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

    Looks like you might get wrong answer if the first element to break the increasing order is larger than the first element of the array.

    Input:

    1
    1 9
    3 7 7 9 4 4 6 3 4
    

    Correct output:

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

Problem F (same solution): Link

where xi = b - a, yi = d - c

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

Can't you do D in O(nlogn) using RMQs? Should've switched C and D or make n = 2*10^5 in D. Then again it's edu so it doesn't matter as much.

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

for this submission, my pc and ideone.com shows right output, but in cf, a completely different output is shown. can someone pls point out the problem?

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

    You should initialize k with some value (maybe with n-1), otherwise there is undefined behavior and only compiler decide, what to do.

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

I am getting TLE in the test case 5 for this solution of the problem c. I have tried a DP solution.

I am not able to get why this solution is giving TLE. I think the time complexity of this solution is O(2e5* 10) or O(N*10). Since here the state is of order: O(N*10) and the transition is of order O(1).

Similarly I am also getting Segmentation Fault when I have run this solution on some random test consisting of string having length nearer to 1e5 on my local system.

The approach, I have used is something like this: For the dp the states were: ind , pos

The first state(ind) is for the index and the another state(pos) is finding two things at any index.

The first thing(last) is the last character occurred till now from the ind+1 to index n-1 and, The second thing(st) is to tell whether we have placed 'E' character or not in some higher index then this index earlier or not.

So over all, I can say: dp[ind][pos] => this will tell me the largest sum I am able to make from the index 0.. to till index ind when the last occurrence maximum alphabet is:'A' + a%5; This last occurrence is from the index ind+1 to index n-1.

So in the recursive function I just try to check If i am able to assign the character 'E' to my current index or not. If I can assign to current character then I will try to get the solution for both the cases when I have assigned to current index and when I have not. and taking maximum of them will be my answer.

If I can not assign then I will just find the value of current character value and try similarly for other lower indexes.

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

    You call the recursive function is called to calculate the dp state dp[ind][pos], but the return line is

    return dp[ind][st] = ans;
    

    This means that the state you're trying to calculate doesn't get stored at dp[int][pos], meaning that successive recursive calls to the same state will not utilize the already calculated dp values, which leads to TLE.

    Fixing this gave me WA9. Here is a case where your code fails:

    Input:
    1
    DDDDDDDDDDDDDDDDDDDDDDDDE
    
    Expected Output:
    25000
    
    Your Output:
    -3000
    
    

    Explanation: Change last E into D.

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

There could be a fun twist to Problem (A):

In every turn the players choose exactly 2 equal numbers and replace them with their sum. They start with $$$n$$$ $$$1(s)$$$ and Alice goes first. The player with all numbers different in their turn wins.
Figure out who will win.

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

In problem C, is it possible to have an answer < 0?

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

One of my friend, kehuydiet800cf, has copied Problem C in recent contest, these codes look the same:

209470016 from kehuydiet800cf

209468826 from chhavirana8

I think they has copied each other or from one source.

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

One of the toughest contest ever faced??

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

Can anyone please help me to figure out... what wrongs in my logic for Problem D... it is giving me wrong answer for 5th test case... I had almost similar approach as others stated here... Any help will be appreciated!

Code Link

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

How much time does it takes to update rating after finishing system testing?

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

for C it was easy to come up with an idea but I found implementation was lengthy and error prone. Does someone have easy implementation for C?

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

Can anyone please explain to me the approach for problem D. And if possible, please share a list of question to master DP.

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

    i did it a bit differently without dp, using segment trees

    each time pair two intersectable segments, and it is always optimal that we should pair such intervals such that their combined range is more left wards

    like say there are k intervals [l1,r1],[l2,r2],.....,[lk,rk]

    and let the combined range of paired intervals be [l,r]

    we should pair such intervals with minimum r, then remove all the intervals with intersects with this range and repeat the process

    you can take a look at my submission : 209523466

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

    My solution: consider all pairs of segments. If they intersect than you can make a new segment by uniting these segments. Put all these "pair-segments" in a set. Then observe a new problem: you need to find the maximum disjoint subset of this set of "pair-segments". It can be done with dp with coordinate compression for example. The answer will be n — 2*(size of maximum subset)

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

      It can be done with greedy too:

      From the "pair-segments", sort by the end point of intervals and take from the first, if possible.

      Submission for the implementation: 209554396

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

    It's CSES Projects with 1 extra step.

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

I found a small bug in tourist's code!

In the code of his Problem E

He used int where long long should have been used

Here is a python code to make a hack data

import random as rnd
N=200000
print("1\n200000")
for i in range(N):
    if i%3:print(0,end=' ')
    else:print(N,end=' ')
print()

The correct output is 13333200000

But tourist's output is 448298112

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

Hope to release tutorial earlier.

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

can someone tell me how to do problem C with DP

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

    I have made a detailed video (its in hindi language) to solve problem C using different approaches.
    Video link : link
    Let me know if it helps you.

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

Can someone please tell me why my code is failing in D [submission:209540485 Jun/13/2023]

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

Can someone please tell me why my code is failing in D 209540485

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

Finally I became master in this round! And this time I got the highest rank of all Div. 2 round.

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

In question E, I do not understand that the answer to the fourth example is 4

4 2 0 3 1 10

Can someone help me?

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

sorry

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

a similar question approach for 1841-D is in Interviewbit

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

Please help with “Your solution 209416596 for the problem 1841A significantly coincides with solutions theSSS/209391885, tanukool/209416596.”

The only code I used from the common source is for dealing with IO which is from USACO guide. Other than that the solution is my own and it is actually very simple by the nature of the problem so I guess there might be room for collision. Please reconsider this blame.

Edited: Many people got the same solution with similar coding style except it is c++ (e.g. 209387876).

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

Any counter test for this code of C

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

https://youtu.be/xImHQo2cTJU Video solution for D (shameless promotion :P)

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

I have made a detailed video (its in hindi language) to solve problem C using different approaches.
Video link : link
Let me know if it helps you :)

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

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

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

Why did the rating updated before system test again?

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

My opinion about problems and contest: A: I think it was a cute problem. Just some observation and you have it, but if you get stuck, its over. I got stuck btw :'( B: Average. Just some implementation and you have it. C: Its tough, I think it should be at the place of D in the contest. Logic is easy but the implementation is way tough (atleast what I did to AC was really tough and annoying to code). D: Its easier, I think it would had around 3-4k AC in the contest if it was at the place of C. Most of the people got stuck into C and didn't moved forward.

If you're Interested to know about any of my approach then do let me know. I would love to explain. Overall Nice Contest. Great Problems.

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

The problem C has weakly pretest, maybe you need play genshin