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