Submission #7335364


Source Code Expand

;; -*- coding: utf-8 -*-
(eval-when (:compile-toplevel :load-toplevel :execute)
  (sb-int:defconstant-eqx OPT
    #+swank '(optimize (speed 3) (safety 2))
    #-swank '(optimize (speed 3) (safety 0) (debug 0))
    #'equal)
  #+swank (ql:quickload '(:cl-debug-print :fiveam) :silent t)
  #-swank (set-dispatch-macro-character
           #\# #\> (lambda (s c p) (declare (ignore c p)) (read s nil nil t))))
#+swank (cl-syntax:use-syntax cl-debug-print:debug-print-syntax)
#-swank (disable-debugger) ; for CS Academy

;; BEGIN_INSERTED_CONTENTS
;; Should we do this with UNWIND-PROTECT?
(defmacro with-buffered-stdout (&body body)
  "Buffers all outputs to *STANDARD-OUTPUT* in BODY and flushes them to
*STANDARD-OUTPUT* after BODY has been done (without error). Note that only
BASE-CHAR is allowed."
  (let ((out (gensym)))
    `(let ((,out (make-string-output-stream :element-type 'base-char)))
       (let ((*standard-output* ,out))
         ,@body)
       (write-string (get-output-stream-string ,out)))))

(declaim (ftype (function * (values fixnum &optional)) read-fixnum))
(defun read-fixnum (&optional (in *standard-input*))
  (declare #.OPT)
  (macrolet ((%read-byte ()
               `(the (unsigned-byte 8)
                     #+swank (char-code (read-char in nil #\Nul))
                     #-swank (sb-impl::ansi-stream-read-byte in nil #.(char-code #\Nul) nil))))
    (let* ((minus nil)
           (result (loop (let ((byte (%read-byte)))
                           (cond ((<= 48 byte 57)
                                  (return (- byte 48)))
                                 ((zerop byte) ; #\Nul
                                  (error "Read EOF or #\Nul."))
                                 ((= byte #.(char-code #\-))
                                  (setf minus t)))))))
      (declare ((integer 0 #.most-positive-fixnum) result))
      (loop
        (let* ((byte (%read-byte)))
          (if (<= 48 byte 57)
              (setq result (+ (- byte 48)
                              (* 10 (the (integer 0 #.(floor most-positive-fixnum 10)) result))))
              (return (if minus (- result) result))))))))

(declaim (inline bisect-left))
(defun bisect-left (target value &key (start 0) end (order #'<) (key #'identity))
  "TARGET := vector | function (taking an integer argument)
ORDER := strict order

Analogue of lower_bound of C++ or bisect_left of Python: Returns the smallest
index (or input) i that fulfills TARGET[i] >= VALUE, where '>=' is the
complement of ORDER. In other words, this function returns the leftmost index at
which VALUE can be inserted with keeping the order. Therefore, TARGET must be
monotonically non-decreasing with respect to ORDER.

This function returns END if VALUE exceeds TARGET[END-1]. Note that the range
[START, END) is half-open. END must be explicitly specified if TARGET is
function. KEY is applied to each element of TARGET before comparison."
  (declare (function key order)
           (integer start)
           ((or null integer) end))
  (macrolet
      ((body (accessor &optional declaration)
         `(progn
            (assert (<= start end))
            (if (= start end) end
                (labels
                    ((%bisect-left (left ok)
                       ;; TARGET[OK] >= VALUE always holds (assuming
                       ;; TARGET[END] = +infinity)
                       ,@(list declaration)
                       (let ((mid (ash (+ left ok) -1)))
                         (if (= mid left)
                             (if (funcall order (funcall key (,accessor target left)) value)
                                 ok
                                 left)
                             (if (funcall order (funcall key (,accessor target mid)) value)
                                 (%bisect-left mid ok)
                                 (%bisect-left left mid))))))
                  (%bisect-left start end))))))
    (etypecase target
      (vector
       (let ((end (or end (length target))))
         (body aref (declare ((integer 0 #.most-positive-fixnum) left ok)))))
      (function
       (assert end () "Requires END argument if TARGET is a function.")
       (body funcall)))))

(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)))

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

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

(defconstant +mod+ 1000000007)

;;;
;;; Body
;;;

(declaim (inline calc-aoki-minwidth))
(defun calc-aoki-minwidth (x as takahashi-l)
  (declare (uint32 x takahashi-l)
           ((simple-array uint32 (*)) as))
  (let* ((aoki-max (aref as (- takahashi-l 1)))
         (delta (- aoki-max x))
         (aoki-min (- x delta)))
    ;; (assert (<= x aoki-max))
    (let ((aoki-l (bisect-left as aoki-min)))
      (- takahashi-l aoki-l))))

(defun main ()
  (declare #.OPT)
  (let* ((n (read))
         (q (read))
         (as (make-array n :element-type 'uint32))
         ;; cumulative sum
         (cumuls (make-array (+ 1 n) :element-type 'uint62 :initial-element 0))
         ;; cumulative sum of every other element
         (cumuls2 (make-array (+ 1 n) :element-type 'uint62 :initial-element 0)))
    (declare (uint31 n q))
    (dotimes (i n)
      (setf (aref as i) (read-fixnum)
            (aref cumuls (+ i 1)) (+ (aref cumuls i) (aref as i))
            (aref cumuls2 (+ i 1)) (+ (aref cumuls2 (max 0 (- i 1))) (aref as i))))
    (with-buffered-stdout
      (dotimes (_ q)
        (let* ((x (read-fixnum))
               (l (sb-int:named-let bisect ((ok 1) (ng n))
                    (declare (uint32 ok ng))
                    (if (<= (- ng ok) 1)
                        ok
                        (let* ((mid (ash (+ ok ng) -1))
                               (aoki-minwidth (calc-aoki-minwidth x as mid)))
                          (if (<= aoki-minwidth (- n mid))
                              (bisect mid ng)
                              (bisect ok mid))))))
               ;; Takahashi takes [L, N) and Aoki takes [L-(N-L), L)
               (t-score (+ (- (aref cumuls n) (aref cumuls l))
                           (aref cumuls2 (max 0 (- l (- n l)))))))
          (println (the uint62 t-score)))))))

#-swank (main)

Submission Info

Submission Time
Task D - Nearest Card Game
User sansaqua
Language Common Lisp (SBCL 1.1.14)
Score 500
Code Size 6900 Byte
Status AC
Exec Time 385 ms
Memory 34020 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 2
AC × 26
Set Name Test Cases
Sample sample-01.txt, sample-02.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, sample-01.txt, sample-02.txt
Case Name Status Exec Time Memory
01.txt AC 291 ms 34020 KiB
02.txt AC 89 ms 18920 KiB
03.txt AC 89 ms 18916 KiB
04.txt AC 88 ms 18920 KiB
05.txt AC 88 ms 18916 KiB
06.txt AC 87 ms 18912 KiB
07.txt AC 167 ms 25952 KiB
08.txt AC 367 ms 32612 KiB
09.txt AC 252 ms 30436 KiB
10.txt AC 257 ms 30436 KiB
11.txt AC 383 ms 32608 KiB
12.txt AC 385 ms 32608 KiB
13.txt AC 285 ms 32608 KiB
14.txt AC 314 ms 32612 KiB
15.txt AC 305 ms 32608 KiB
16.txt AC 279 ms 32616 KiB
17.txt AC 366 ms 32608 KiB
18.txt AC 324 ms 32608 KiB
19.txt AC 370 ms 32616 KiB
20.txt AC 341 ms 32352 KiB
21.txt AC 343 ms 32356 KiB
22.txt AC 341 ms 32608 KiB
23.txt AC 331 ms 32612 KiB
24.txt AC 328 ms 32616 KiB
sample-01.txt AC 85 ms 18912 KiB
sample-02.txt AC 85 ms 18912 KiB