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

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

Today, I had spent hours trying to solve problem : (https://mirror.codeforces.com/contest/1334/problem/C) and submitted several solutions with an O(n) complexity, but I kept getting a TLE. After some further inspection, I changed from using cin to scanf, and my solution was finally accepted. While it's well-known that scanf is slightly faster than cin, I was surprised by how much of a difference it actually made in this case.

TLE Code : 284211972 Accepted Code : 284212724

This blog may not be overly educational, but I just want to highlight that even a O(n) solution can lead to a TLE error. Understanding this can help you avoid the frustration and wasted time that I experienced.

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

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

ios::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);

Use this if you want to use cin/cout

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

I thought everyone learns to put cin.tie(0) -> sync_with_stdio(0) in their code the first day they start cp.

Guess not :/

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

it does not affect complexity, QED.

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

std::cin is tied (or synchronized) with std::cout by default in C++, which means it will ensure that your stdout will always be flushed before the input operations. It makes your program slows due to the fact that you have to flush the output before you take the next input from stdin. If you provide those:

ios::sync_with_stdio(false);
cin.tie(0);

Then they are untied, and the output will only be flushed when stdout is full, or your program has been terminated. That's why you see the whole output after reading and processing all test cases. And that's why it is said that using endl is not a good practice as it flush your output immediately, which means using those two lines of codes above are useless. This blog is quite nice and you should take a look.

(I thought I have remind you before but you didn't really care about that).