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

Автор NetSpeed1, 16 месяцев назад, По-английски

2048A - Kevin and Combination Lock

Author: Little09

Hint 1
Tutorial

2048B - Kevin and Permutation

Author: NetSpeed1

Hint 1
Tutorial

2048C - Kevin and Binary Strings

Author: Little09

Hint 1
Hint 2
Hint 3
Tutorial

2048D - Kevin and Competition Memories

Author: cmk666

Hint 1
Hint 2
Hint 3
Tutorial

2048E - Kevin and Bipartite Graph

Author: Little09

Hint 1
Tutorial

2048F - Kevin and Math Class

Author: NetSpeed1

Hint 1
Hint 2
Tutorial

2048G - Kevin and Matrices

Author: cmk666

Hint 1
Hint 2
Hint 3
Hint 4
Tutorial

2048H - Kevin and Strange Operation

Author: JoesSR

Hint 1
Hint 2
Hint 3
Tutorial

2048I1 - Kevin and Puzzle (Easy Version)

Author: Little09

Hint 1
Tutorial

2048I2 - Kevin and Puzzle (Hard Version)

Author: Little09

Hint 1
Hint 2
Hint 3
Hint 4
Tutorial
Разбор задач Codeforces Global Round 28
  • Проголосовать: нравится
  • +128
  • Проголосовать: не нравится

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

first

I was one $$$=$$$ sign off from getting $$$E$$$ lol

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

I think the $$$O(n)$$$ solution for C is quite interesting. Why not split it into a C2?

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

First time ever i solve 5 problems in a div2, i think D is very cool, and i kinda guessed E but good contest overall

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

great contest and tutorial :)

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

Can anyone explain why my D Solution is too slow?

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

great contest tho I find it wired that F requires such complex data structure (probably it isn't wired and I just lack experience)

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

Special Thanks to cmk666 for the nice problem 2048D - Kevin and Competition Memories

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

one more div2 contest where i can't solve more than 3 questions.

how should i practice to solve question D in div 2 contests? thanks in advance

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

Anyone tried solving E with below approach.

Each edge can be represented as ordered pair ( i , j ) . where 'i' belongs to left side, and 'j' belongs to right side.

Now, we have total of 2 * n * m such ordered pairs. each of these edge can be actually convert into a vertex. since our graph is bipartite, after we travel one of our edge, next edge direction will be opposite ( if we travel current edge from left to right, next edge we must travel right to left )

=> if I am going from (i,j1) to (i,j2) , i will try to give available color to (i,j2) and then I will keep 'j2' constant and try to find some valid 'i' which is not yet colored and try to color it.

Now start DFS from (1,1) , and if its odd iteration of the we will go from left to right, if it is even iteration, we will go from right to left.

When we go from left to right , we will keep 'i' constant and loop over all the 'j' in the ordered pair ( i , j ) .

When we go from right to left, we will keep 'j' constant and loop over all the 'i'.

We will try to basically color this graph of 2 * n * m vertices,,, with 'n' colors. I tried this approach, but don't know, why does it fail ?

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

    If n < m your solution does not find the answer. While answer exists in some cases. Consider n = 3, m = 4.

    Answer for n = 3, m = 4
    • »
      »
      »
      16 месяцев назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится

      I know, my above logic is flawed.

      Then I had thought of doing BFS instead of DFS ( which was also flawed )

      Then I thought of doing color-wise bfs (pass specific color to the bfs, and try to paint as many edges you can with the given color without generating the cycle. This approach itself is O ( n ) * O ( 2 * n * m ) So, I didn't bother implementing it.

      I wish, we could reduce it to some sort of graph coloring problem, than just guess-work.

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

        Any greedy approach to general graph coloring problem will be doomed to fail. Since general graph coloring problem is NP-Complete, you can not solve it in polynomial time, unless P = NP. In this type of problems most probably you have to build certain construction for specific type of graph. In this case we need to use the fact that complete bipartite graph is given.

        In my approach I did the following. Think about each color separately, and try to use certain edges for this color such that the graph induced by these edges does not contain a cycle, i.e. is a forest. Then you try to cover the whole set of edges using these forests for each color.

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

E made me sad.

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

G is a nice one! ❤️

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

For F, the constraints don't cut the $$$n \cdot \log^2(a)$$$ solution, but also make it harder for people who are careful.

I spent extra time to optimize out a $$$\log(a)$$$ factor just like the editorial because $$$n \cdot \log^2(a) \approx 8 \cdot 10^8$$$.

If instead the time limit was greater or $$$a = 10^9 \implies n \cdot \log^2(a) \approx 2 \cdot 10^8$$$, I would definitely go for this solution and not waste time. Since I optimized, I failed to finish F by a few minutes.

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

Was curious about F's solution and heard for the first time about min cartesian tree!! Anyone have any good resources to learn more about it?

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

Why is this code for D failing?


int n, m; cin >> n >> m; int me; cin >> me; vector<int>participants, problems, solved; // only participants with rating greater than mine matter for (int i = 0; i + 1 < n; i++){ int num; cin >> num; if (num > me) participants.push_back(num); } // same thing for problems for (int i = 0; i < m; i++){ int num; cin >> num; if (num > me) problems.push_back(num); } sort(participants.begin(), participants.end()); sort(problems.begin(), problems.end()); // computing how many people solve each problem for (int problem : problems){ int first = lower_bound(participants.begin(), participants.end(), problem) - participants.begin(); solved.push_back(participants.size() - first); } sort(solved.begin(), solved.end()); for (int k = 1; k <= m; k++){ int ans = 0; for (int i = k; i <= solved.size(); i += k) ans += solved[i - 1] + 1; cout << ans << " \n"[k == m]; }
  • »
    »
    16 месяцев назад, скрыть # ^ |
    Rev. 2  
    Проголосовать: нравится 0 Проголосовать: не нравится

    I had a similar implementation which worked : 297364236 I dont think you can ignore problems with lower difficulty than Kevin's skill since you can use them to "pad" contests

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

      bro im gonna be honest i dont even know what am im doing, could you explain what the greedy algorithm the editorial describes is doing ?

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

        Consider a problem which has difficulty X such that X > Kevin's skill. Then if the number of people who can solve this problem are Y, this means that if you include this problem in a contest, at least Y people will be ahead of Kevin since Kevin can't solve it.

        If the difficulty X is equal to or less than Kevin's skill, then no one will be able to get ahead of Kevin using only this problem, in which case the number of people ahead of Kevin is 0. So, for each problem P[i] you can calculate how many people can potentially get ahead of Kevin using only P[i] (say we call this value Ahead[i]).

        Now you need to create K groups. Kevin's final ranking in a group will be max(all Ahead[i] values in the group) + 1. For example If the group has Ahead values 0 1 4, that means everyone solves the first problem, the second problem is solved by one person who is not Kevin and the third problem is solved by 4 people but not Kevin. This means that a total of 4 people are ahead of Kevin, giving Kevin 5th rank (Note that the person who solves the second problem is also among the people who solve the third problem, which is why we take max(Ahead[i])). The final answer is the sum of ranks across all groups.

        Now in order to minimize the sum, you must minimize the max(Ahead[i]) in each group which you can do by greedily assigning K values with lowest Ahead[i] in the first group, next K lowest in next group and so on. So if Ahead array is 0 1 3 5 and K = 2, we make groups (0, 1) and (3, 5). The sum of ranks would be max(0,1) + 1 + max(3, 5) + 1 = 2 + 6 = 8

        I hope this didn't confuse you even more lol

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

For E, I found this paper which solves a slightly more general problem of coloring a complete bipartite graph into the minimum number of colors such that each color is a forest.

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

Can someone please help me out where I am going wrong with C: my submission

I get that the first substring will be the entire string, and the second substring will be of the length = length of complete string — position of first 0 from left. But since we only have to find out which such substring gives the maximum XOR, I take a different parameter called 'ans' in my solution and I claim that the substring which gives the higher 'ans' will also give the higher XOR value.

Here is how I am constructing 'ans': I am comparing the portion of two strings which is to be XOR'ed. Starting from the most significant bit, if the corresponding bit in both the strings are 0 and 1 respectively, I am incrementing ans by a larger value (and decrementing if the bits are 1 and 1 respectively since that will decrease XOR value). As I move from left to right, The value with which I increment/decrement ans decreases (since the right bits will have less contribution to the XOR value than the left bits). The substring which gives the maximum 'ans' value will also give me the maximum XOR value. But I am getting wrong answer on test case 2 itself and I am unable to figure out where I am going wrong! Please help

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

    Maybe my implementation can help you:


    string s; int n; cin >> s; n = s.size(); bool hasZero = false; for (int i = 0; i < n; i++) if (s[i] == '0') { hasZero = true; break; } if (!hasZero) { cout << 1 << " " << n << " " << 1 << " " << 1 << endl; return; } int first_zero = 0; for (int i = 0; i < n; i++) if (s[i] == '0') { first_zero = i; break; } int best_l = 0; int sz = n - first_zero; for (int l = 0; l <= n - sz; l++) for (int i = 0; i < sz; i++) { if (s[first_zero + i] == '1') { // If at this position of the string we have a 1 if (s[l + i] == '1' && s[best_l + i] == '0') // If the current substring has a 1 and my current answer has a 0, the current substring is worse and should not be processed break; if (s[l + i] == '0' && s[best_l + i] == '1') { // If the current substring has a 0 and the current answer has a 1 I found a better answer best_l = l; break; } } else { // if the original string has a '0' if (s[l + i] == '0' && s[best_l + i] == '1') // if the current substring has a 0 and the answer has 1 then this is worse and should not be processed break; if (s[l + i] == '1' && s[best_l + i] == '0') { // if the current substring has a 1 and the answer has a 0 i found a better answer best_l = l; break; } } } cout << 1 << " " << n << " " << best_l + 1 << " " << best_l + sz << endl;
»
16 месяцев назад, скрыть # |
 
Проголосовать: нравится +21 Проголосовать: не нравится

I hate the fact, that I was debugging F for 40 minutes, because I was getting RTEs on test 3. There was some stupid stack overflow; the recursion was returning a big static object (488 bytes), and after changing it to return an 8 byte pointer, it started working; however, my memory usage was under 350MB, so it should have passed initially.

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

Good contest,make me promote to IM :)

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

Little09 Can you elaborate on the $$$O(n\log^2n)$$$ solution for I2? Idk what block convolution is.

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

    There is a solution of complexity $$$O(n\sqrt{\frac{n\log n}{\omega}})$$$. The general idea is to divide the sequence into chunks for every $$$B$$$ positions, and for each $$$l+r$$$ value find the $$$r$$$ that minimally satisfies the condition. If $$$l,r$$$ belongs to different blocks, enumerating the blocks of $$$r$$$ and then convolving this block with the prefixes tells us which $$$l+r$$$ occur, and then finding the smallest $$$r$$$ within the block. The case where $$$l,r$$$ belongs to the same block is easily solved. Finally, the bitset optimization is performed to obtain a complexity of $$$O(\frac{n^2}B\log n+\frac{nB}{\omega})$$$.

    About $$$O(n\log ^2n)$$$ solution, it comes from JoesSR and it is more difficult and maybe I will add in the Editorial in a few days.

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

"In fact, this is easy to construct"

Even after reading more than 5 times, above statement still hurts my soul.

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

    I think it will be easy, if you make construction this way:

    Our answer should satisfy the following property, if we fix two rows i.e., the nodes on the left side, there should not be greater than two columns of same colours.

    Like this case where there are two columns of (1, 1) which forms cycle for a pair of nodes on left. So, it won't work.

    1....1.....2

    3....3.....4

    1....1.....3

    By trying out small cases and making construction based on this would be easy.

    So, for (n, m = 2 * n — 1), you could always find a case, where there are no two columns of same colour for every possible pair of rows. And this also satisfies for all m <= 2 * n — 1 (Printing the array till m columns).

    for n = 4

    1 1 1 1 2 3 4

    2 2 2 2 3 4 1

    3 3 3 3 4 1 2

    4 4 4 4 1 2 3

    1 2 3 4 1 1 1

    1 2 3 4 2 2 2

    1 2 3 4 3 3 3

    1 2 3 4 4 4 4

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

Why my stupid $$$\Theta(n\log^2 v)$$$ solution for F ran for just 827ms, can sb hack it or did it just run too fast because of constant factor? 297330202

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

Identity V?

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

I have a doubt in problem C, if the problem does not say that string starts with '1' does it will change the answer?

I yes how?

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

    Well you always want one of the strings to be in the range of [the left most one,1]. So instead of solving on the entire string, you would first check the edge case of all 0s and then just solve the same thing on the substring from where the first 1 ocurrs

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

Can someone help me identify where I went wrong in this solution 297315319? I believe my solution has a time complexity of $$$O(n^2)$$$, yet I am experiencing a TLE for test case 21. Any assistance would be greatly appreciated.

How my code works
  • »
    »
    16 месяцев назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    In the worst-case scenario, if the test case is 1, the length of s is 5000, and the string is "111...110", your code will execute approximately 5000 × 5000 × 2500 operations. This happens because the code compares the entire string with every suffix of the string. On average, the length of these suffixes is about 2500. I hope this explanation makes sense.

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

Problem E's idea is same as AGC061 B. :/

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

I think my solution on C is O(n³) but somehow passed can you hack it?297271696

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

Why is this submission get WA on #2? 297329851

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

Can someone explain why a greedy solution doesn't work for F.

Here I'm thinking to construct a Cartesian Tree, then starting from the root (which is the node with minimum value $$$b[i]$$$) just divide all elements in the range with $$$b[i]$$$ until $$$a[i]$$$ reaches $$$1$$$, then traversing down through the trees. It intuitively makes sense since the root node can only be divided by $$$b[i]$$$ so might as well divide the as large of a range possible. Then, recursively thinking, the children of those nodes can be divided with $$$b[j]$$$ which is greater than $$$b[i]$$$ thus better so we perform the same action until all $$$a$$$ is 1.

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

    For this case:

    3
    4 2 4
    3 2 3
    

    Using your solution, it would use 3 steps. Divide [1,3] by 2, [1,1] by 3, and [3, 3] by 3.

    However, it can be done in 2 steps. Divide [1,3] by 2 twice.

    Your solution's problem is that the program does not know when to stop using a certain $$$b[i]$$$. Just because $$$a[i] = 1$$$ doesn't mean that we stop using that $$$b[i]$$$ on the whole range.

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

Here's a different (?) breakdown of the main case for I2, at least for me it's easier to understand.

Assume we're in the RL case (i.e. $$$s = R \ldots L$$$). All values of $$$a_i$$$ then are in $$$[1, m]$$$. Let's consider where 1's are.

First, the entire array may be 1s anyhow. Add 1 to the answer for this case.

Otherwise, at most one (leftmost) L and at most one (rightmost) R may be 1. If both are 1, then every element of the array sees a 1, thus we can remove them both, decreasing all other values by 1. We should also remove all but one character among the leading Rs and trailing Ls (because all those are forced to be equal to $$$m$$$). Note that this case is impossible when the string looks like $$$RR \ldots LL$$$. Add the (say, recursively computed) answer for the resulting string.

If, say, only the leftmost L is 1, then the rightmost R is at least 2. Then the values for the trailing Ls must have something other than $$$m$$$. Looking at the rightmost such element, we conclude that it's a unique $$$m-1$$$ in the entire sequence. Then consider removing: 1) all leading Rs, 2) leftmost L, 3) characters corresponding to the the $$$m-1$$$ and all $$$m$$$s to the right of it. Basically, the sequence $$$a_i$$$ looks like $$$[m, m, \dots, m, 1, (\ldots), m - 1, \ldots, m]$$$, and none of $$$1, m - 1, m$$$ appear anywhere else. Every element in the central $$$(\ldots)$$$ part sees exactly two distinct values among $$$1, m - 1, m$$$, thus we obtain any such solution by solving the $$$(\ldots)$$$ and adding 2 to all $$$a_i$$$. However, the distinct values of $$$a_i$$$ for the $$$(\ldots)$$$ must fill a range $$$0, \ldots, x - 1$$$, thus when trimming border characters in $$$( \ldots)$$$ like before we can't encounter another RL case. This can checked with bitsets, and there are $$$O(n)$$$ situations to check.

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

Could anyone explain why the power of -1 is i+j in problem G?

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

    Let's consider 1-D case, suppose the matrix size is $$$1 \times n$$$.

    Define the set with $$$Property_i$$$: those i-th position of the matrix get the maximum value K, the size is $$$K^{(n-1)}$$$

    Then the intersection of $$$Property_i$$$ and $$$Property_j$$$ size is: $$$K^{(n-2)}$$$

    So we can use inclusion-exclusion principle:

    The union of all $$$Property_i$$$ size is $$$\sum_{i=1}^{n} (-1)^{i-1} \tbinom{n}{r} K^{(n-i)}$$$

    When it comes to the 2-D case, I am a little confused about how the property of the set should be defined and what the intersection of two properties should look like.

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

      I had the same question and here is what I think the writer meant:

      Consider choosing just doing inclusion exclusion on $$$I$$$. You get a factor of $$$(-1)^{I+1}$$$. Then you have to do inclusion exclusion on $$$J$$$, there you get a factor of $$$(-1)^{J+1}$$$. You multiply then to get $$$(-1)^{I+J}$$$.

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

can someone please help me why am i getting a WA in D 297718482

first i sorted both the arrays

then if m%k!=0 i tried rejecting the problems which were just greater then that of kevin, for eg if remainder is two, i removed two problems just greater in rating than that of kevin's

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

I'm not understanding in Problem E, the fact "for any given color, there are at most 2n+m−1 edges", can anyone help me? Why is that true?

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

Can someone explain the $$$O(n \log n)$$$ solution for problem F? I only understand the $$$O(n \log^2 n)$$$ solution.

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

    The DP function is $$$f_{i+j} = min(f_{i+j}, max(fl_i, fr_j))$$$. Assume that we start with $$$fl_0$$$ and $$$fr_0$$$ and, wlog, $$$fl_0 \gt fr_0$$$, we will never need to pair $$$fl_0$$$ with any $$$fr_j$$$ where $$$j \gt 0$$$ because that won't give us a more optimal $$$i + j$$$. Then we can increase $$$i$$$ to $$$1$$$ and do the same process.

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

      How to efficiently update all js?
      Using example fl0>fr0, j>0 won't give us a more optimal i+j, but how to update all i+js? If I update all js (all f[i+j]), time will be O(n*log a*log a) again.
      Even if I update just the smallest/optimal i+j, if I go through all i (so, in this scenario, I only have i for loop, I don't have two for loops for one vertice from Cartesian tree), in my code there is a loss of generality for fli>fri. Maybe fri>fli. Fl is non-incresing which means maybe there is some t, where i>t and fri>flt>=fri. And then fri and fli is not optimal i+j so I lose generality. (Although I agree there isn't a loss of generality for fli>fri when we have two nested for loops for each of vertices, because we can operate with j for loop, but, again, that is O(n*log a*log a).)

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

        You only need one for loop and if you examine carefully, the loop actually goes through all needed $$$i + j$$$ values because either $$$i$$$ or $$$j$$$ has to be increased after each step. This is my implementation for reference:

          for (int i = 0, j = 0; i + j < MX;)
            if (fl[i] > fr[j])
            {
              f[i + j] = min(f[i + j], fl[i]);
              i++;
            }
            else
            {
              f[i + j] = min(f[i + j], fr[j]);
              j++;
            }.
        
»
12 месяцев назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

求求中国人别出题了,题解都是 “注意到”,“很简单”