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

Автор vovuh, история, 7 лет назад, перевод, По-русски

All ideas belong to MikeMirzayanov

1203A - Круг студентов

Разбор
Решение

1203B - Одинаковые прямоугольники

Разбор
Решение

1203C - Общие делители

Разбор
Решение

1203D1 - Удалите подстроку (простая версия)

Разбор
Решение

1203D2 - Удалите подстроку (сложная версия)

Разбор
Решение

1203E - Боксёры

Разбор
Решение

1203F1 - Завершение проектов (простая версия)

Разбор
Решение

1203F2 - Завершение проектов (сложная версия)

Разбор
Решение
Разбор задач Codeforces Round 579 (Div. 3)
  • Проголосовать: нравится
  • +57
  • Проголосовать: не нравится

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

Thanks for the great editorial ! The tutorial for the problem F2 seems to be unavailable for me. I get the following error "Unable to parse markup [type=CF_MATHJAX]".

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

Can someone elaborate how to handle case when b_i is negative in problem F. Why are we setting a_i = max(a_i,-b_i). Why sorting in the order of a_i+b_i works?

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

    a_i = max(a_i, -b_i) — u delete variants, when yours current rating plus b_i < 0. For example: r = 10, a_0 = 9, b_0 = -20. U can take this project, but yours rating will be negative. And I don’t know, why the sort a_i + b_i works.

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

    First, let me tell you why we are setting ai = max(ai, -bi):let's talk both the situations: ai >= -bi and ai < -bi , if ai >= -bi, that means ai doesn't change, when ai < -bi, the problem let us ensure r > 0, when we do this project i, r will be r + bi(bi if negative), so it's obviously why we let ai be max(ai, -bi), we must ensure r+bi > 0, that means we let ai = -bi(the case 2), we can decrease the judgement.Second, why sorting in the order of ai + bi can work? This problem trouble me for a long time at first, when we let ai be max(ai, -bi), we can ensure ai >= -bi, that means ai + bi is not negative, but it can be zero, if we can't do project i, for j (aj + bj < ai + bi) we must can't do all of this, too.That is because aj is greater than ai or not, if aj >= bi , we can't do project j, if aj is smaller than ai, and aj + bj < ai + bi, we can't do project i that means r < ai, when we do the left thing, r will be smaller, that means we can't do project i, either. So this can work.

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

    I think that you should think about this array like “how much rating I need, to make i-th order”.

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

    Let's try to determine the optimal order to complete all the projects.

    Let's first focus on two adjacent projects $$$i$$$,$$$j$$$ in the current arrangement (supposing $$$j=i+1$$$), and see when we should swap them.(Obviously, the swap will not affect other projects.) That's to say, we should see which way will make completing both projects "easier".

    $$$I.$$$ If we can take both of them by taking $$$i$$$ first, that means our initial rating $$$r$$$ satisfies both $$$r \ge a_i$$$ & $$$r + b_i \ge a_j$$$, which is equivalent to $$$r \ge max(a_i , a_j - b_i)$$$.

    $$$II.$$$ If we can to take both of them by taking $$$j$$$ first, that means our initial rating $$$r$$$ satisfies both $$$r \ge a_j$$$ & $$$r + b_j \ge a_i$$$, which is equivalent to $$$r \ge max(a_j , a_i - b_j)$$$.

    We wonder which constraint is weaker. We already have $$$a_j - b_i \gt a_j , a_i - b_j \gt a_i$$$, so we just need to compare $$$I.$$$ $$$a_j - b_i$$$ and $$$II.$$$ $$$a_i - b_j$$$. The smaller, the weaker. Note that $$$I. \lt II.$$$ <=> $$$a_j - b_i \lt a_i - b_j$$$ <=> $$$a_i + b_i \gt a_j + b_j$$$. So, for every pair of adjacent projects, we should determine whether to swap them or not by the value $$$a_i + b_i$$$. In other words, we have the sequence sorted in the order of $$$a_i + b_i$$$.

    (I hope thinking this way can inspire and help you.)

    (Thank Bekh for better formatting! I'm new to writing comments, but I'll keep trying.)

    (Looking forward to others' better, shorter, clearer answers!)

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

    Why sorting in the order of $$$a_i+b_i$$$ works?

    Assume there are two projects:$$$X$$$,$$$Y$$$, with $$$a_x+b_x \gt a_y+b_y$$$, and our remaining rating is $$$r$$$. If we can't complete $$$Y$$$ after finishing $$$X$$$, that means $$$r+b_x \lt a_y$$$. Using $$$a_x+b_x \gt a_y+b_y$$$ and $$$r+b_x \lt a_y$$$ we can conclude that $$$r+b_y \lt a_x$$$. This means we can't change the order so as to finish both the projects.

»
7 лет назад, скрыть # |
← Rev. 14  
Проголосовать: нравится +35 Проголосовать: не нравится

For problem F2,I have a solution in complexity: $$$O(n^2)$$$ .

My solution is similar to the writer's.The only difference is that I let $$$dp[i][j]$$$ be after you choose j in the first i tasks , the maximum rating you have.Then we can simply solve this problem using dynamic programming and the complexity is $$$O(n^2)$$$ .
Here is my code.

Sorry for my poor English.

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

Can anyone please help me to understand the problem E? I dont understand the problem for a while. It would be really helpfull. Thanks in advance. :) sorry for my poor english.

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

Can you please check my submission 58732857 for problem C. It is the same as editorial but it timed out. Is using python such a big problem ?

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

why the problem F2 Tutorial is

Unable to parse markup [type=CF_MATHJAX]

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

I use a different cmp function for sort in problem f1: look at my cmp2 in the solution https://codeforces.me/contest/1203/submission/58799244

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

why do we sort by a + b in decreasing order for negative value in F1

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

Can someone help me with problem D1 code. Where am i going wrong logically? It's giving me WA on test case 5.

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

Do your tester program check if participant find solution though jury can't find it?58820595
There is just comparator and my solution find order though author's answer is NO.
I could check it by myself but I can't see full test case. Where is my mistake?

P.S. Found mistake. Too late to delete this comment.
P.P.S. 58821318 Maybe not found. At each step I checking if r >= ai and r >= 0 after each step. So I think that in test #11 I found correct order to take all projects.
P.P.P.S. Sorry now I really found mistake.

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

i can't prove gcd(...(gcd(gcd(a[1],a[2]),a[3],)...)a[n])=gcd(a[1],a[2],...a[n]) in problem C

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

    We have $$$a, b, c$$$ let's denote $$$gcd(a, b, c) = g$$$ and $$$gcd(a, b) = z$$$ for convenience
    We want to prove that $$$gcd(gcd(a, b), c) = gcd(a, b, c)$$$
    After substituting some terms you get $$$gcd(z, c) = g$$$

    $$$x|y$$$ reads x divides y and means $$$y\%x = 0$$$ or in english $$$x$$$ is a divisor of $$$y$$$

    $$$g|z$$$ and $$$z|a$$$ then $$$g|a$$$
    Same way $$$g|z$$$ and $$$z|b$$$ then $$$g|b$$$
    and $$$g|c$$$ is true anyway so $$$g|a$$$ and $$$g|b$$$ and $$$g|c$$$ are true

    That's for the divisibility. How do you know that it's the greatest?
    Assume $$$gcd(a, b, c) = g$$$ and $$$g \gt z$$$. Since $$$g|a$$$ and $$$g|b$$$. $$$gcd(a, b)$$$ would've given $$$g$$$ not $$$z$$$ which is the greater divisor.
    In other words $$$gcd(a, b, c)$$$ is either gonna be $$$gcd(a, b)$$$ or one of its divisors.

    and you can keep doing the same to generalize to more then three numbers... prove $$$gcd(a, b, c, d) = gcd(gcd(a, b), c, d) = gcd(z, c, d) = gcd(gcd(z, c), d) ...$$$ and so on.

    If something is not clear, please ask.
    There are more formal proofs out there on the internet too.

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

    How would one go about solving the task u mentioned? I mean the constraints are high, and creating dp array for knapsack would go out of memory.

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

      Two ideas:

      • In the code in the editorial the first dimension of dp is neg.size() + 1. This simplifies the code, but actually it only uses dp[i] to calculate dp[i+1], so one only ever needs to store two dp rows at a time.

      • The rows of the dp array will have many repeated values, one might be able to reduce storage by just storing the start and end indexes of each group of repeated values.

      Note that I have not tried writing code using either of these ideas.

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

Can anyone tell me why problem B,s case 2 output is YES and why case -3 output is NO. Thanks in advance. :)

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

    T.C — 2 : -> 10 5 2 10 1 1 2 5

    ->R1 — sides a1 = 10,b1 = 1 and there is extra 10,1 also possible for opposite sides. ->R2 — sides a2 = 5, b2 = 2 and similar here

    as a1.b1 == a2.b2 .Hence Yes.

    T.C — 3:

    -> 10 5 1 10 5 1 1 1

    -> R1 — sides a1 = 10,b1 = 1 and there is extra 10,1 also possible for opposite sides. ->R2 — sides a2 = 5, b2 = 1 and similar here

    as a1.b1 != a2.b2 .Hence No.

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

I have another solution for problem F1(cannot contribute to problem F2, but has a more obvious correctness). First, deal with the projects with positive b values greedily.

Then, calculate the rating after all projects are completed. If it's negative, terminate the program. Otherwise, consider to process the projects in a reversed order, beginning with the calculated "final" rating R. Each time we choose a project i such that R — b_i >= a_i, and update R by R — b_i. So the rating R will be increasing during the reversed process. Then it's easy to determine if it's possible to complete all the tasks.

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

    Very easy to understand the "obvious" correctness as you stated.

    Thanks.

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

    Upd:this solution can contribute to F2 in fact. We focus on the projects with negative b values only.

    Assume we have finished processed all the projects we selected with a remaining final rating R0. Then consider to process the projects in a reversed order with R0 as the initial rating. We can process a project i iff R-b_i >= a_i, so we can store these available projects in a priority_queue and one by one greedily choose the project with the smallest -b_i(rating change) to process, thus yielding the minimum initial rating required to finish a certain number of projects with final rating R0. It's easy to maintain the available projects with the rating increasing in O(n), and priority_queue is O(nlogn). The final rating R0 ranges from 0 to the biggest a_i+b_i (a larger R0 doesn't make sense since this is sufficient for us to choose the projects freely at the reversed "beginning"), a O(r) range.

    The above process doesn't require the real initial rating r, so with this approach we can also answer queries about multiple initial ratings efficiently.

    Overall Complexity(single query): O(nrlogn)

    Overall Complexity(multiple query): O(nrlogn + nq) (q:number of queries)

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

    Woah. This is just amazing and doesn't even require a proof because it is just so obvious.

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

orz xk

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

Hi, I tried solving the question D1, but I was getting WA on test 5. Editorial also suggest the use of brute force. I am not able to figure out if I have missed some boundary condition.

In short, what am I doing: I am calculating all possible indexes for a substring in the main string. After getting all possible indexes, I am just finding the case which removes the most characters from the main string.

The code:

def checker(mainstr, substr, index):
    pos=[]
    for i in substr:
        temp = mainstr.find(i,index)
        if(temp == -1):
            return []
        else:
            pos.append(temp)
            index = temp+1
    return [pos[0], pos[-1]]

def logicmain(mainstr, substr):
    size = len(mainstr)-1
    index = 0
    allpos=[]
    while(True):
        first = checker(mainstr, substr, index)
        if(len(first) == 0):
            break
        else:
            allpos.append(first)
            index = first[0]+1
    
    maxdrop=0
    for i in allpos:
        val = max(i[0], size-i[1])
        maxdrop = max(maxdrop, val)
    return maxdrop

def main():
    mainstr= input()
    substr = input()

    ans = logicmain(mainstr, substr)
    print(ans)

if __name__ == "__main__":
    main()
»
7 лет назад, скрыть # |
 
Проголосовать: нравится +3 Проголосовать: не нравится

Hi, I just want to know what 1ll in the solution of the 1st problem ?

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

    1ll is the number 1 but of type long long not int. It is used to avoid overflow. because the result of the multiplication will be of type int since the array a is an array of int, and therefore it could overflow. Using 1ll makes the result of the multiplication of type long long rather than int.

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

Proof for F1: Take array of the projects with negative $$$b_i$$$ (sorted as given in the tutorial). Let’s complete the projects in this order. If we get stuck at index $$$k$$$ , then:

$$$ r + \sum_{i \lt k}b_i \lt a_k $$$

Let’s assume we have a good order of projects in range $$$[0,k]$$$ so that all of them can be completed. Let the project completed last of this set , the one with index $$$p$$$. ($$$p ≠ k$$$ because of the starting inequality).

$$$a_p+b_p ≥a_k+b_k $$$ ,so $$$ a_p+b_p-b_k≥a_k$$$ (because we ordered them so).

Then after we complete everything except the $$$p^{th}:$$$ $$$r+\sum_{i \lt k}b_i-b_p+b_k ≥a_p$$$.

After reorder: $$$r+\sum_{i \lt k}b_i ≥a_p+b_p-b_k≥a_k$$$. That is in contradiction to the one in the beginning.

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

In problem B i stored the number and occurrence in a map . If the occurrence of any number is odd then this Case would be "NO" else i check from i from 1 to n that a[i]*a[n] and then i++ and n-- . if all the area is equal then it's "YES" . I don't know what is problem it's getting wa. this is my submission 58846470 And sorry for bad english :)

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

In B: I get a WA on test case 8 here is my code

can someone please elaborates how to do :(

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

For problem B, I tought that if we sort the array and check that if for every i (1 to (n*2)-1) (i use v[0]*v[n-1] for checking) is equal to v[0]*v[n-1]. Where is my wrong? I couldn't find it. Please help. (I got wrong in 8th test.)

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

    You should check, whether the number of sticks of the same length is even, and in for(ll i=1;i<(n/2)-1;i++) , you should write i<=(n/2)-1, because you would miss a pair. This way, your solution works.

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

Can anyone tell me why my java solution for problem c exceeding time limit?

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

Can someone give me an intuition for the D2 problem? Why are we creating a prefix and a suffix array? What is the purpose of that?

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

    you can imagine that for each letter "c" in the second array, you create the first[c] and the last[c] in the first array in the sense that A[last[c],lA] contains B[c..LB]. Then, you will try to find the largest interval [p,q] such that p>first[c] or q<last[c] for all c in the second array.

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

why is sorting by $$$a_i + b_i$$$ is optimal for negative projects in F1?

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

Regarding problem C solution provided in the editorial ;

please consider the expression/condition in the following IF block(the following is as given in the solution);

i.e if (i != g / i) { ++ans; } .

Now when I tried using if ((i*i) != g ) { ++ans; } in my solution ; I received a Wrong Answer Verdict.

Can someone please help me out where am i going wrong.?

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

Can someone help find out why the hell am i getting runtime error,(problem F1) my submisssion https://codeforces.me/contest/1203/submission/58887999

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

Can anyone please explain editorial of problem D2 ?

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

Thanks for the great editorial!

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

the common divisors problem code is still saying that time limit exceeded on test case 3 here is the code below... if any one could find the solutions please tell me why its giving time limit exceeded..... thanks in advance .....

include <bits/stdc++.h>

using namespace std; long long int gcd(long long int a,long long int b) { if(a == b) return a; else if(a>b) return gcd(a-b,b); else if(b>a) return gcd(a,b-a); } int main() { long long int count = 0; long long int n; cin >> n; long long int a[n]; long long int i; for(i = 0;i<n;i++) cin >> a[i]; long long int GCD = a[0]; for(i = 0;i<n;i++) { GCD = gcd(GCD,a[i]); } for(i = 1;i*i<=GCD;i++) { if(GCD % i == 0) { count++; if(GCD/i != i) { count++; } } } cout << count << endl; return 0; }

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

Can someone explain me solution to D2 that How are the iterators i and pos working? I did the easy version but don't have a clue how to optimize it. The editorial seems harder than the problem itself

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

I can't understand why my solution is giving wrong answer for D2(testcase 6).

Can someone help me?

int main(){
    string s,t;
    cin>>s>>t;
    int I=0,J=SZ(s)-1;
    REV(i,SZ(t)){
        while(s[J]!=t[i]) J--;
        J--;
    }
    int ans=++J;
    int id=0;
    REP(i,SZ(t)){
        while(s[id]!=t[i]) id++;
        id++;
    }
    uax(ans,SZ(s)-id);
    REP(i,id){
        if(s[i]==t[I]){
            I++;
            J++;
            while(J<SZ(s) && s[J]!=t[I]) J++;
        }
        uax(ans,J-i-1);
    }
    pd(ans);
    return 0;
}
»
7 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Someone could explain why problem B actually work with the editorial solution?

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

F2 is solvable in O(N log N) as it's equivalent to the deadlines and durations scheduling problem: https://cp-algorithms.com/schedules/schedule-with-completion-duration.html

Code: https://codeforces.me/contest/1203/submission/60304846

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

Может кто нибудь решить F2 методом "Отжиг", если да, оставьте код

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

In problem E in test case 3:

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

    Lets see the array in sorted order : 1 2 4 6 7 8 8 9 9 10 10

    Um operations selection like this would conclude the answer to be 10 :

    1 2 4 5(6 — 1) 6(7 — 1) 7(8 — 1) 8 9 10 11(10 + 1)

    There maybe some other permutations for the same but hope this would clear ur query !

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

Oh no,I applied preSum for question D2 and ignore the order of letters

my code:

import java.util.*;
import java.io.*;
import java.math.*;
import java.text.*;
public class Main{
    public static void main(String args[]) throws IOException {
        Read sc = new Read();
        String s = sc.next();
        String t = sc.next();
        List<Integer> list1=new ArrayList<>();
        List<Integer> list2=new ArrayList<>();
        for(int i=0,j=0;i<t.length();i++){
            while(s.charAt(j)!=t.charAt(i)){
                j++;
            }
            list1.add(j);
            j++;
        }
        for(int i=t.length()-1,j=s.length()-1;i>=0;i--){
            while(s.charAt(j)!=t.charAt(i)){
                j--;
            }
            list2.add(j);
            j--;
        }
        Collections.reverse(list2);
        int ans=Math.max(list2.get(0),s.length()-list1.get(t.length()-1)-1);
        //System.out.print(ans);
        for(int i=1;i<t.length();i++){
            ans=Math.max(ans,list2.get(i)-list1.get(i-1)-1);
        }
        sc.print(ans);
        sc.bw.flush();
    }
}
class Read{
    BufferedReader bf;
    StringTokenizer st;
    BufferedWriter bw;
    public Read(){
        bf=new BufferedReader(new InputStreamReader(System.in));
        st=new StringTokenizer("");
        bw=new BufferedWriter(new OutputStreamWriter(System.out));
    }
    public String nextLine() throws IOException{
        return bf.readLine();
    }
    public String next() throws IOException{
        while(!st.hasMoreTokens()){
            st=new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }
    public char nextChar() throws IOException{
        return next().charAt(0);
    }
    public int nextInt() throws IOException{
        return Integer.parseInt(next());
    }
    public long nextLong() throws IOException{
        return Long.parseLong(next());
    }
    public double nextDouble() throws IOException{
        return Double.parseDouble(next());
    }
    public float nextFloat() throws IOException{
        return Float.parseFloat(next());
    }
    public byte nextByte() throws IOException{
        return Byte.parseByte(next());
    }
    public short nextShort() throws IOException{
        return Short.parseShort(next());
    }
    public BigInteger nextBigInteger() throws IOException{
        return new BigInteger(next());
    }
    public void println(int a) throws IOException{
        bw.write(String.valueOf(a));
        bw.newLine();
        return;
    }
    public void print(int a) throws IOException{
        bw.write(String.valueOf(a));
        return;
    }
    public void println(String a) throws IOException{
        bw.write(a);
        bw.newLine();
        return;
    }
    public void print(String a) throws IOException{
        bw.write(a);
        return;
    }
    public void println(long a) throws IOException{
        bw.write(String.valueOf(a));
        bw.newLine();
        return;
    }
    public void print(long a) throws IOException{
        bw.write(String.valueOf(a));
        return;
    }
    public void println(double a) throws IOException{
        bw.write(String.valueOf(a));
        bw.newLine();
        return;
    }
    public void print(double a) throws IOException{
        bw.write(String.valueOf(a));
        return;
    }
    public void print(BigInteger a) throws IOException{
        bw.write(a.toString());
        return;
    }
    public void print(char a) throws IOException{
        bw.write(String.valueOf(a));
        return;
    }
    public void println(char a) throws IOException{
        bw.write(String.valueOf(a));
        bw.newLine();
        return;
    }
}
»
3 года назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

For D2, you may want to consider this greedy trick I have seen a few times: left and right.

For each index i in t, get the leftmost index j of S where t[:i] is a subsequence of S[:j].

For each index i in t, get the rightmost index j of S where t[i:] is a subsequence of S[j:].

The answer can be:

1) the n-1-(leftmost index of S where t is a subsequence of S[:ans])

2) the rightmost index of S where t is a subsequence of S[ans:]

3) for some index of i from 0 to t.size()-2, take the rightmost index r of S where t[i+1:] is a subsequence of S[r:] and the leftmost index l of S where t[:i] is a subsequence of S[:l] the candidate can be r-l-1;

#include<bits/stdc++.h>
using namespace std;

int main() {
    string a, b; cin >> a >> b;
    int n = a.size(), m = b.size();
    vector<int> lb(m, 0), rb(m, 0);
    int tmpb = m-1;
    for(int i = n-1; i>=0; i--) {
        if(b[tmpb]==a[i]) {
            rb[tmpb--] = i;
        }
        if(tmpb<0) break;
    }
    tmpb = 0;
    for(int i = 0; i<n; i++) {
        if(b[tmpb] == a[i]) {
            lb[tmpb++] = i;
        }
        if(tmpb==m) break;
    }
    int ans = 0;
    ans = max(ans, n-1-lb[m-1]);
    ans = max(ans, rb[0]);
    for(int i = 0; i<m-1; i++) {
        ans = max(ans, rb[i+1]-lb[i]-1);
    }
    cout << ans << endl;
    return 0;
}
»
2 года назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

In F2, for the knapsack dp, you can use sliding dp and reduce memory to $$$O(r+n)$$$. Time complexity is still $$$O(rn)$$$ though.

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

in F1, it is ok if after the last project, rating becomes 0. This is not clear in problem statement. I thought rating needs to be positive at all times.