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

Автор skrydg, 10 лет назад, По-русски

http://mirror.codeforces.com/contest/484/submission/8617714

http://mirror.codeforces.com/contest/484/submission/8617627

различие этих решений только в выводе и вводе

Поясните что здесь не так?

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

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

Кажется getline(cin, s) работает долго без ios_base::sync_with_stdio(false)

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

Кстати, а зачем выводить строку вот таким циклом? :)

for (int i = 0; i < s.size(); i++)
        cout << s[i];
  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится

    У меня был сабмит и с нормальным выводом строки.

    Он тоже не проходил по тл.

    Это сделано, для того чтобы никто не придирался к фразе

    "различие этих решений только в выводе и вводе"

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

Есть подозрение, что просто всякий раз при чередовании cin-cout потоки синхронизируются, дабы данные например в консоли выглядели естественно, поэтому вот такой код работает за меньше чем 600мс.

http://mirror.codeforces.com/contest/484/submission/8617887

UPD. Хоть я понимал sync_with_stdio(false) как раз как отключение синхронизации потоков для cin-cout. Если кто-то разъяснит, будет здорово! :)

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

    Понял. Спасибо!

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

    Ещё эту проблему можно решить добавлением строки cin.tie(0); Это отключает синхронизацию потоков.

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

    sync_with_stdio(0) отключает синхронизацию iostream и stdio, т.е. cin/cout и scanf/printf.

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

Потому что нечего слишком части cout флашить.

Решение проблемы — отвязка cin от cout с помощью cin.tie(0);.

8617989

UPD: MrDindows обогнал)

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

My advice: When you read many lines of input, always turn synchronization off, if you use streams.

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

Иногда бывало на контестах, что удаление этих двух заветных строк:

ios_base::sync_with_stdio(false);
cin.tie(NULL);

меняло вердикт решения с WA на ACC, при это ввод и вывод осуществлялся через cin и cout. До сих пор не понимаю почему. Наверное это зависит от тестирующих систем и компиляторов.

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

    Пример был бы к стати. Другими словами — есть ли какие-то причины/минусы неиспользовать эти 2 строки в программах СП?

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

    При наличии этих строк нельзя одновременно использовать scanf и cin, printf и cout. Скорее всего, WA был из-за этого.

    Anyway, под Visual Studio эти строчки ничего не делают, поэтому пользующимся этой средой локально сие явление незаметно.