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

Автор gepardo, история, 3 года назад, По-русски
Tutorial is loading...
Tutorial is loading...
Tutorial is loading...
Tutorial is loading...
Tutorial is loading...
Tutorial is loading...
Разбор задач Codeforces Round 765 (Div. 2)
  • Проголосовать: нравится
  • +74
  • Проголосовать: не нравится

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

Thanks for the editorial ^^

»
3 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
  • »
    »
    3 года назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится
    Input
    Expected Output
    Your Output
    Comment
»
3 года назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

My O(max(n,q) * sqrt(n) * log(max(q,sqrt(n))) solution to E1

This solution works even when the segment asked in query is not a RBS. Note that log factor can be removed on using pointers and using prefix sum(for heavy chains).

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

My O(max(n,q) * sqrt(n) * log(max(q,sqrt(n))) solution to E1

This solution works even when the segment asked in query is not a RBS. Note that log factor can be removed on using pointers and using prefix sum(for heavy chains).

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

а как в Е1 считать кол-во псп на отрезке? Там же по сути надо разбить наши запросы на несколько поддеревьев, сложить дпшки в них, а потом ещё к ответу добавить cnt *(cnt — 1) / 2, но просто при разбиении отрезка на поддеревья, их может быть слишком много

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

    Нас интересует сумма на последовательных сыновьях нашей вершины. Можно, например, просто сохранить префикс-суммы по сыновьям в каждой вершине, а в запросе просто взять сумму на отрезке и потом добавить к ней cnt * (cnt - 1) / 2.

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

Can someone explain the Binary Spiders solutions.

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

    +. more detail if it's possible. cause I'm dealing with tries first time. and i watching about tries there. i got the gist of the idea. but here the process of finding the maximum subset for i in the trie is little bit complicated. thanks in advance

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

      let's give it a trie.
      this is my solution which is a little different than the one in the editorial.
      First, let's focus on the MSB of K and try to group the number based on bits starting from the MSB position to the end. for example, if we have K=00010101
      so we're interested in the prefix part till the first 1 bit, split k like that.
      0001 | 0101
      and we split numbers at the same position to height bits and lowest bits
      0110 | 1000
      0110 | 1001
      1010 | 1100
      1011 | 1010
      0001 | 1001
      0111 | 1000
      group numbers by the first part.

      observation-1 look at the left part (highest bits) if this part is equal then XOR will be zero and it's bad as it will make our XOR lower than K, so the max we can get from this group is only one element.
      observation-2 if the left part only differs at the lowest bit then we can get one element from each group, we just need to know that the XOR between these two elements is >=K and we can do this using trie (later I will explain how).
      observation-3 if the bits are different then it's guaranteed that it will produce a number greater than K.
      so getting to the Trie part, the trie is only needed in observation two, if we found two numbers have the same prefix and differ only in the first bit.
      so to check that we're checking two groups A, B and trying to find if we have any two pairs that have XOR >=k. put all the numbers in group A in a trie, our binary trie will have left as zero bit, right as 1 bit. now iterate over numbers in group B, for each number try to find the MAX XOR you can get, basically you iterate over the bits in this number from left to write and try to go to the opposite if possible.
      if the current bit is 1 then try to go to 0 in the trie (this will maximize the XOR value).
      hope this helped out.
      my submission for ref: https://codeforces.me/contest/1625/submission/142621030

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

Do anyone have the implementation of problem D, using the approach explained in the editorial?

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

Please upload the codes also.

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

Please upload the codes also.

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

For C, I think "min(dp[n][j]) over all 0 <= j <= k" is not the final answer, because that is forcing the n-th sign to be taken (not removed). To get the final answer, we have to enumerate the last taken sign, add the remaining road section's time to each one, and finally take the minimum value among all of them.

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

I think problem D memory limit should've been higher if bit-trie solutions were intended to be accepted. Fitting $$$O(n \log A)$$$ memory into 256 MiB is quite a challenge, especially for Java and Python

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

I was trying O(n^2) solution for Problem C by having additional DP state for propagating last selected speed limit. I am not looking for solution, but if someone can take a look and tell if this would work or not, that would help. Thanks.

142748551

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

    Hey, I am also doing this only. But unable to figure out the mistake. Did you get to know why this will not work. Or anybody else can help us out! Please!! Thank you so much!

    My Code -> 142787581 (Similar to @i_will_be_expert's)

    PLEASE PLEASE, help us out!

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

On D

To solve the problem, we need the following well-known fact. Suppose we have a set of numbers and we need to find minimal possible xor over all the pairs. It is true that, if we sort the numbers in non-descending order, the answer will be equal to minimal xor over neighboring numbers.

Is it actually well known? Does anyone have a proof for why that is the case? Afaik the most common way to solve this problem is by making a bit trie.

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

    In bitwise xor, same bits give us 0, while different bits give us 1. If we try to find minimal xor pair, neighboring numbers have more of the same bits starting from the MSB, which makes the xor value smaller.

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

      Not always true.

      Consider 6 7 8, (7^8) is greater than (6^8).

      But still the overall minimum comes out as (6^7) which are still the neighboring elements. Its so confusing lol.

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

    Let a,b and c be three numbers such that a<b<c. Let the first bit where a and c differ be the kth bit, then kth bit in a must be unset and it must be set in c. Then depending upon whether kth bit is set in b or not we get (b xor c) <(a xor c) or (b xor a) <(a xor c)

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

I think in E2,it is more natural for me to think up the $$$O((n+q)\log n)$$$ solution than the $$$O((n+q)\sqrt n)$$$ solution.

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

    Another thing I've noticed, converting RBS to tree is pretty much the inverse operation of DFS/finding the Eulerian path of a tree. So instead of building the tree explicitly, I found it much more efficient to simply compute the statistics for each node/open bracket in place.

    142753393 link to my submission

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

E2 can still be solved if not only leaves are erased, but each pair must form a matching.

If we build the bracket tree, the erase operation can be transformed to erase a node and link all its sons to its father. The queries can be transformed to sum up $$$k*(k+1)/2$$$ for each node in the interval. We can use unionset to deal with father changes and a Fenwichtree to deal with subtree sum except the root. Degree of the root of each interval can be transformed to occurrences of minumum prefix sum in the interval. It can be maintained by segment tree.

Here is the code.

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

In question B, the answer seem to be n - min(v - u).

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

Can someone tell me why doesn't greedy algorithm work for problem C in which we remove the sign which causes a maximum decrease in time. If someone can provide a short test case which I can visualize that would be helpful. Here is my code 142511895

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

Some hints for people stuck at debugging problems B and C.

Iizy Problem: B

Input
Expected Output
Your Output
Comment

i_will_be_expert nitigya Problem: C

Input
Expected Output
Your Output
Comment

umanggupta1975 Problem: C

Input
Expected Output
Your Output
Comment

HaidRam Problem: C

Input
Expected Output
Your Output
Comment
»
3 года назад, # |
Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

Can someone explain E2 solution in $$$O((n+q)\sqrt{n})$$$?

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

Can anyone suggest why my submission is getting MLE? any possible improvements?

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

Another solution for problem D using divide and conquer:)
Suppose that now we have a set of spiders, $$$S$$$, to calculate the answer, obviously at first it's just the original set.
Let's look through the bits of $$$k$$$ from high to low, for the $$$i-th$$$ bit, there are two cases:
1. the $$$i-th$$$ bit of $$$k$$$ equals to $$$0$$$. In this case we can divide the set $$$S$$$ into two parts: one set $$$s_0$$$ with all elements whose $$$i-th$$$ bits equal 0, the other set $$$s_1$$$ with all elements whose $$$i-th$$$ bits equal 1. It's for the reason that if we choose any element $$$x$$$ in $$$s_0$$$ and any element $$$y$$$ in $$$s_1$$$, $$$x\ xor\ y$$$ will always be larger than $$$k$$$. Now here come two subproblems with $$$s_0$$$ and $$$s_1$$$ and it goes to the $$$(i-1)-th$$$ bit;
2. the $$$i-th$$$ bit of $$$k$$$ equals to $$$1$$$. In this case we can choose no more than two elements in $$$S$$$, and their $$$i-th$$$ bit must be different. To find the elements, we also need to divide $$$S$$$ into two parts following the rule above, and then go to the $$$(i-1)-th$$$ bit and continue to divide the two sets... To ensure that the two sets we have now always satisfying the property that the $$$xor$$$ of two elements from each must not be less than $$$k$$$. You can view my code for more details.
The time complexity is $$$O(n\cdot log\ max\lbrace a_i, k\rbrace)$$$, here is my code.

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

Can anyone explain the convex hull trick in problem C? Thx.

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

For problem C, why would it not work to use a simple greedy where you pick the sign such that its removal decreases the total time as much as possible, and repeat k times?

144901424

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

Why my code is giving wrong answer in 4th test case of Elementary particle question? PLEASE HELP.

include <bits/stdc++.h>

using namespace std;

int main() { int t; cin>>t; while(t--) { int n; cin>>n; int a[n]; for(int j=0;j<n;j++) cin>>a[j];

map<int,pair<int,int>> m;
  int temp=INT_MAX;
  for(int j=0;j<n;j++)
  {
    if(m[a[j]].first==0)
    {
      m[a[j]].first=j+1;
    }

    else if(m[a[j]].second==0)
    {
      m[a[j]].second=j+1;
    }

    else
    {
      if(m[a[j]].second - m[a[j]].first > j+1 - m[a[j]].second)
      {
        m[a[j]].first=m[a[j]].second;
        m[a[j]].second=j+1;
      }
    }
  }

  for(auto it=m.begin();it!=m.end();it++)
  {
    if(((*it).second).first==0 || ((*it).second).second==0)
    continue;

    if(((*it).second).second - ((*it).second).first < temp)
    temp=((*it).second).second - ((*it).second).first ;
  }

  if(temp==INT_MAX)
  cout<<"-1\n";
  else
  cout<<n-temp<<'\n';
}

return 0;

}

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

Sorry for necroposting, but I didn't find any solution for this in comments or anywhere

In problem D, The editorial solution uses a trie. if you use trie. Then there are at most nlogA vertices. If we implement using pointers then its memory would be nlogA*32 (32 if because of pointer address size in 32 bit compiler) = 3*10^5*30*30 = 2.7*10^8 ~ 2 GB. But memory limit is just 256 MB. How to solve this issue?

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

[Deleted]

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

why is my code not right for problem 1625C - Road Optimization?

anyone who can explain?

int f(int i, int k, int l,vll &v, vll &tpk, vvll &dp) { if(i == 0) { return (l)*tpk[0]; } if(dp[i][k] != -1)return dp[i][k];

int remove = INT_MAX;
if(k > 0)remove = f(i-1, k-1, l, v, tpk, dp);
int notremove =  tpk[i]*(l - v[i]) + f(i-1, k, v[i], v, tpk, dp);


return dp[i][k] = min(remove, notremove);

}

void solve() { read(n); read(l); read(k); vecin(v, n); vecin(tpk, n); vvll dp(n,vll(k+1,-1)); cout<<f(n-1, k, l, v, tpk, dp)<<endl; }

int32_t main() { fast_io; int t = 1; // cin >> t; fer (i, 1, t) { // cout << "Test Case " << i << endl; solve(); } return 0; }

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

For C

dp[i][k] = min answer up to ith speed limit and we took k speed limit. (we assume ith limit is taken)

dp[i][k] = min(dp[i-1][k-1] + ... , dp[i-2][k-1]+...., ....)

I think it can be solved in O(n^2) if we use some kind of prefix sum on dp table