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

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

I can't understand why this solution 268341805 is passing but this 268341778 is giving WA on testcase 2, both codes are 99% same.

TLDR: I am writing down the part of my code which I changed so that my code got AC.

Please all the help would be greatly appreciated. Thank you so much in advance.

auto it = upper_bound(v.begin(),v.end(),val);
                        if(it!=v.end()&&it!=v.begin()) {
                            ans=min(ans,min(abs(*(it)-val),abs(*(--it)-val))); // old
                        }
                        else if(it==v.end()) {
                            ans = min(ans,abs(*(--it)-val));  //old
                        }
                        else if(it==v.begin()) {
                            ans=min(ans,abs(*(it) - val));  //old
                        }
auto it = upper_bound(v.begin(),v.end(),val);
                        if(it!=v.end()&&it!=v.begin()) {
                            auto it2 = it; it--;                                   // new
                            ans=min(ans,min(abs(*it2-val),abs(*(it)-val)));
                        }
                        else if(it==v.end()) {
                            it--;
                            ans = min(ans,abs(*(it)-val));                        // new
                        }
                        else if(it==v.begin()) {
                            ans=min(ans,abs(*it - val));                         // new
                        }
  • Проголосовать: нравится
  • +2
  • Проголосовать: не нравится

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

you're <999 and you solve Div2 C? :O

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

I think *(--it) is wrong because it gives WA always ive seen this alot many times in the past histories and i think this is the greatest mistake you can do in life

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

I see the changes you made to your code, and it makes sense why these adjustments led to getting an Accepted (AC) verdict. Let's break down why the new version works better:

Handling upper_bound Result Properly:

Old Code: Directly uses *(--it) which modifies it and could cause unexpected behavior if it is at v.begin(). New Code: Introduces a temporary iterator it2 to store the original upper_bound result and safely decrements it for the correct comparison. This ensures that both it and it2 are valid and not out of bounds. Edge Case Handling:

Old Code: Might mishandle edge cases where it is at the boundaries of the array. New Code: Explicitly ensures it is decremented safely and used for comparisons, which prevents undefined behavior when it is at the start or end of the vector.

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

PS: newbies please don't comment non-sensical things here, Only 1400+ are allowed to comment.

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

    not a good thing to say, some people below 1000 are actually really good but just haven't done any CF.

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

gholyo could help.

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

ans=min(ans,min(abs(*(it)-val),abs(*(--it)-val)));

For checking minimum, It will calculate both values for the comparison, but you decrement it which will reflect on the first argument too lol

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

if you compare min(a,b) b is evaluated first however in some compilers a can be evaluated as it depend on compiler so when you do min(*it,*(--it)) it first evaluate second one which cause it to go to previous position and now you compare previous position with previous position

here change ans=min(ans,min(abs(*(--it)-val),abs(*(it)-val))); // compiler is not dumbass

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

Ok