LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

С iostream'ом вообще вряд ли получится пройти на spoj.

Оно делается accepted, но уже не в топе, а в ... bottom, короче :) Неохота даже смотреть в чём там дело.

Ты кстати, на spoj запостил? Сколько получилось по времени?

13 место — ~1sec / ~5MB. Там много таких решений — наверно все пишут одно и то же тупо на std::map/std::multiset.

Моя реализация такая

(let ((*standard-input*  (sb-sys:make-fd-stream 0 :input  t :buffering :full))
      (*standard-output* (sb-sys:make-fd-stream 1 :output t :buffering :full))
      (*trace-output* *error-output*))
  (time (homo))
  (finish-output))
➜  spoj  ./homo-gen-in 10 10 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  0.000 seconds of real time
  0.000000 seconds of total run time (0.000000 user, 0.000000 system)
  100.00% CPU
  109,052 processor cycles
  0 bytes consed
  
0.26user 0.02system 0:00.29elapsed 97%CPU (0avgtext+0avgdata 207584maxresident)k
0inputs+0outputs (0major+6395minor)pagefaults 0swaps
➜  spoj  ./homo-gen-in 10000000 10 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  10.413 seconds of real time
  10.317433 seconds of total run time (10.200450 user, 0.116983 system)
  [ Run times consist of 0.192 seconds GC time, and 10.126 seconds non-GC time. ]
  99.08% CPU
  20,779,739,936 processor cycles
  3,519,986,224 bytes consed
  
10.46user 0.13system 0:10.70elapsed 99%CPU (0avgtext+0avgdata 347872maxresident)k
0inputs+0outputs (0major+10167minor)pagefaults 0swaps
➜  spoj  ./homo-gen-in 10000000 1000 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  12.103 seconds of real time
  11.902190 seconds of total run time (11.780209 user, 0.121981 system)
  [ Run times consist of 0.193 seconds GC time, and 11.710 seconds non-GC time. ]
  98.34% CPU
  24,151,750,796 processor cycles
  3,520,072,880 bytes consed
  
12.03user 0.14system 0:12.38elapsed 98%CPU (0avgtext+0avgdata 347984maxresident)k
0inputs+0outputs (0major+10670minor)pagefaults 0swaps
➜  spoj  ./homo-gen-in 10000000 1000000 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  16.913 seconds of real time
  16.648468 seconds of total run time (16.396507 user, 0.251961 system)
  [ Run times consist of 0.746 seconds GC time, and 15.903 seconds non-GC time. ]
  98.43% CPU
  33,749,201,068 processor cycles
  3,603,868,336 bytes consed
  
16.65user 0.27system 0:17.19elapsed 98%CPU (0avgtext+0avgdata 584656maxresident)k
0inputs+0outputs (0major+17579minor)pagefaults 0swaps
➜  spoj  ./homo-gen-in 10000000 1000000000 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  20.056 seconds of real time
  19.882977 seconds of total run time (18.828138 user, 1.054839 system)
  [ Run times consist of 2.491 seconds GC time, and 17.392 seconds non-GC time. ]
  99.14% CPU
  40,022,605,012 processor cycles
  4,191,032,800 bytes consed
  
19.09user 1.07system 0:20.34elapsed 99%CPU (0avgtext+0avgdata 2480352maxresident)k
0inputs+16outputs (0major+25761minor)pagefaults 0swaps

Так что запуск и измерение внешним time погоды не делает.

Не сильно хуже при большом разбросе (тогда оно вероятностно чаще hetero), но хуже при малом — я подозреваю, что у них там особый тест с малым разбросом (так что оно не всегда hetero). Ну и памяти больше.

Можешь попробовать продекларировать везде типы и declaim optimize/inline, ещё у тебя в -insert/-delete таблица вольно дёргается — у меня в случае MapShape ins за один проход доставляет итератор insert-ом и дальше всё константно, del — тоже за один проход доставляет find-ом итератор, _на котором_ (it) потом может быть выполнен erase — остальное константно.

Исходная версия quasimoto, :

С iostream'ом вообще вряд ли получится пройти на spoj.

Оно делается accepted, но уже не в топе, а в ... bottom, короче :) Неохота даже смотреть в чём там дело.

Ты кстати, на spoj запостил? Сколько получилось по времени?

13 место — ~1sec / ~5MB. Там много таких решений — наверно все пишут одно и то же тупо на std::map/std::multiset.

Моя реализация такая

(let ((*standard-input*  (sb-sys:make-fd-stream 0 :input  t :buffering :full))
      (*standard-output* (sb-sys:make-fd-stream 1 :output t :buffering :full))
      (*trace-output* *error-output*))
  (time (homo))
  (finish-output))
➜  spoj  ./homo-gen-in 10 10 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  0.000 seconds of real time
  0.000000 seconds of total run time (0.000000 user, 0.000000 system)
  100.00% CPU
  109,052 processor cycles
  0 bytes consed
  
0.26user 0.02system 0:00.29elapsed 97%CPU (0avgtext+0avgdata 207584maxresident)k
0inputs+0outputs (0major+6395minor)pagefaults 0swaps
➜  spoj  ./homo-gen-in 10000000 10 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  10.413 seconds of real time
  10.317433 seconds of total run time (10.200450 user, 0.116983 system)
  [ Run times consist of 0.192 seconds GC time, and 10.126 seconds non-GC time. ]
  99.08% CPU
  20,779,739,936 processor cycles
  3,519,986,224 bytes consed
  
10.46user 0.13system 0:10.70elapsed 99%CPU (0avgtext+0avgdata 347872maxresident)k
0inputs+0outputs (0major+10167minor)pagefaults 0swaps
➜  spoj  ./homo-gen-in 10000000 1000 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  12.103 seconds of real time
  11.902190 seconds of total run time (11.780209 user, 0.121981 system)
  [ Run times consist of 0.193 seconds GC time, and 11.710 seconds non-GC time. ]
  98.34% CPU
  24,151,750,796 processor cycles
  3,520,072,880 bytes consed
  
12.03user 0.14system 0:12.38elapsed 98%CPU (0avgtext+0avgdata 347984maxresident)k
0inputs+0outputs (0major+10670minor)pagefaults 0swaps
➜  spoj  ./homo-gen-in 10000000 1000000 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  16.913 seconds of real time
  16.648468 seconds of total run time (16.396507 user, 0.251961 system)
  [ Run times consist of 0.746 seconds GC time, and 15.903 seconds non-GC time. ]
  98.43% CPU
  33,749,201,068 processor cycles
  3,603,868,336 bytes consed
  
16.65user 0.27system 0:17.19elapsed 98%CPU (0avgtext+0avgdata 584656maxresident)k
0inputs+0outputs (0major+17579minor)pagefaults 0swaps
➜  spoj  ./homo-gen-in 10000000 1000000000 | \time sbcl --noinform --noprint --disable-debugger --load "homo.lisp" > /dev/null
Evaluation took:
  20.056 seconds of real time
  19.882977 seconds of total run time (18.828138 user, 1.054839 system)
  [ Run times consist of 2.491 seconds GC time, and 17.392 seconds non-GC time. ]
  99.14% CPU
  40,022,605,012 processor cycles
  4,191,032,800 bytes consed
  
19.09user 1.07system 0:20.34elapsed 99%CPU (0avgtext+0avgdata 2480352maxresident)k
0inputs+16outputs (0major+25761minor)pagefaults 0swaps

Так что запуск и измерение внешним time погоды не делает.

Не сильно хуже при большом разбросе (тогда оно вероятностно чаще hetero), но хуже при малом — я подозреваю, что у них там особый тест с малым разбросом (так что оно не всегда hetero). Ну и памяти больше.

Можешь попробовать продекларировать везде типы и declaim optimize, ещё у тебя в -insert/-delete таблица вольно дёргается — у меня в случае MapShape ins за один проход доставляет итератор insert-ом и дальше всё константно, del — тоже за один проход доставляет find-ом итератор, _на котором_ (it) потом может быть выполнен erase — остальное константно.