結果

問題 No.21 平均の差
ユーザー sansaquasansaqua
提出日時 2020-10-27 03:38:32
言語 Common Lisp
(sbcl 2.3.8)
結果
TLE  
(最新)
AC  
(最初)
実行時間 -
コード長 4,176 bytes
コンパイル時間 1,231 ms
コンパイル使用メモリ 39,688 KB
実行使用メモリ 32,752 KB
最終ジャッジ日時 2023-09-29 03:09:29
合計ジャッジ時間 6,940 ms
ジャッジサーバーID
(参考情報)
judge12 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 9 ms
23,376 KB
testcase_01 AC 21 ms
25,360 KB
testcase_02 AC 58 ms
32,752 KB
testcase_03 AC 9 ms
23,332 KB
testcase_04 TLE -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
; compiling file "/home/judge/data/code/Main.lisp" (written 29 SEP 2023 03:09:21 AM):
; processing (IN-PACKAGE :CL-USER)
; processing (DEFPARAMETER *OPT* ...)
; processing (SET-DISPATCH-MACRO-CHARACTER #\# ...)
; processing (DEFINE-INT-TYPES 2 ...)
; processing (DEFCONSTANT +MOD+ ...)
; processing (DEFMACRO DBG ...)
; processing (DECLAIM (INLINE PRINTLN))
; processing (DEFUN PRINTLN ...)
; processing (DEFPACKAGE :CP/MODIFY-MACRO ...)
; processing (IN-PACKAGE :CP/MODIFY-MACRO)
; processing (DEF MINF ...)
; processing (DEF MAXF ...)
; processing (DEF MULF ...)
; processing (DEF DIVF ...)
; processing (DEF IORF ...)
; processing (DEF XORF ...)
; processing (DEF ANDF ...)
; processing (USE-PACKAGE :CP/MODIFY-MACRO ...)
; processing (IN-PACKAGE :CL-USER)
; processing (DEFUN MAIN ...)
; processing (MAIN)

; wrote /home/judge/data/code/Main.fasl
; compilation finished in 0:00:00.145

ソースコード

diff #

(in-package :cl-user)
(eval-when (:compile-toplevel :load-toplevel :execute)
  (defparameter *opt*
    #+swank '(optimize (speed 3) (safety 2))
    #-swank '(optimize (speed 3) (safety 0) (debug 0)))
  #+swank (ql:quickload '(:cl-debug-print :fiveam :cp/util) :silent t)
  #+swank (use-package :cp/util :cl-user)
  #-swank (set-dispatch-macro-character
           #\# #\> (lambda (s c p) (declare (ignore c p)) `(values ,(read s nil nil t)))))
#+swank (set-dispatch-macro-character #\# #\> #'cl-debug-print:debug-print-reader)

(macrolet ((def (b)
             `(progn (deftype ,(intern (format nil "UINT~A" b)) () '(unsigned-byte ,b))
                     (deftype ,(intern (format nil "INT~A" b)) () '(signed-byte ,b))))
           (define-int-types (&rest bits) `(progn ,@(mapcar (lambda (b) `(def ,b)) bits))))
  (define-int-types 2 4 7 8 15 16 31 32 62 63 64))

(defconstant +mod+ 1000000007)

(defmacro dbg (&rest forms)
  #+swank (if (= (length forms) 1)
              `(format *error-output* "~A => ~A~%" ',(car forms) ,(car forms))
              `(format *error-output* "~A => ~A~%" ',forms `(,,@forms)))
  #-swank (declare (ignore forms)))

(declaim (inline println))
(defun println (obj &optional (stream *standard-output*))
  (let ((*read-default-float-format* 'double-float))
    (prog1 (princ obj stream) (terpri stream))))

;; BEGIN_INSERTED_CONTENTS
(defpackage :cp/modify-macro
  (:use :cl)
  (:export #:minf #:maxf #:mulf #:divf #:iorf #:xorf #:andf))
(in-package :cp/modify-macro)

(macrolet ((def (name fname)
             `(define-modify-macro ,name (new-value) ,fname)))
  (def minf min)
  (def maxf max)
  (def mulf *)
  (def divf /)
  (def iorf logior)
  (def xorf logxor)
  (def andf logand))

;; BEGIN_USE_PACKAGE
(eval-when (:compile-toplevel :load-toplevel :execute)
  (use-package :cp/modify-macro :cl-user))
(in-package :cl-user)

;;;
;;; Body
;;;

(defun main ()
  (let* ((n (read))
         (k (read))
         (nums (coerce (loop repeat n collect (read)) '(simple-array uint31 (*))))
         (state (make-array n :element-type 'uint8 :initial-element 0))
         (sums (make-array k :element-type 'uint31 :initial-element 0))
         (counts (make-array k :element-type 'uint31 :initial-element 0))
         (res 0))
    (labels ((update! ()
               (fill sums 0)
               (fill counts 0)
               (dotimes (i n)
                 (let ((num (aref nums i))
                       (group (aref state i)))
                   (incf (aref sums group) num)
                   (incf (aref counts group))))
               (unless (find 0 counts)
                 (loop for sum across sums
                       for count across counts
                       maximize (/ sum count) into max
                       minimize (/ sum count) into min
                       do (maxf res (round (- max min))))))
             (dfs (pos)
               (if (= pos n)
                   (update!)
                   (dotimes (i k)
                     (setf (aref state pos) i)
                     (dfs (+ pos 1))))))
      (dfs 1)
      (println res))))

#-swank (main)

;;;
;;; Test and benchmark
;;;

#+swank
(progn
  (defparameter *lisp-file-pathname* (uiop:current-lisp-file-pathname))
  (setq *default-pathname-defaults* (uiop:pathname-directory-pathname *lisp-file-pathname*))
  (defparameter *dat-pathname* (uiop:merge-pathnames* "test.dat" *lisp-file-pathname*))
  (defparameter *problem-url* "https://yukicoder.me/problems/no/21"))

#+swank
(defun gen-dat ()
  (uiop:with-output-file (out *dat-pathname* :if-exists :supersede)
    (format out "")))

#+swank
(defun bench (&optional (out (make-broadcast-stream)))
  (time (run *dat-pathname* out)))

#-swank
(eval-when (:compile-toplevel)
  (when (or (> sb-c::*compiler-warning-count* 0)
            sb-c::*undefined-warnings*)
    (error "count: ~D, undefined warnings: ~A"
           sb-c::*compiler-warning-count*
           sb-c::*undefined-warnings*)))

;; To run: (5am:run! :sample)
#+swank
(5am:test :sample
  (5am:is
   (equal "535
"
          (run "5
3
555
20
432
301
21
" nil)))
  (5am:is
   (equal "651
"
          (run "8
4
329
980
656
738
739
542
873
501
" nil))))
0