提出 #6094721
ソースコード 拡げる
;; -*- coding: utf-8 -*-
(eval-when (:compile-toplevel :load-toplevel :execute)
(defparameter OPT
#+swank '(optimize (speed 3) (safety 2))
#-swank '(optimize (speed 3) (safety 0) (debug 0)))
#+swank (progn (ql:quickload '(:cl-debug-print :fiveam))
(shadow :run)
(use-package :fiveam))
#-swank (set-dispatch-macro-character #\# #\> (lambda (s c p) (declare (ignore c p)) (read s nil (values) t))))
#+swank (cl-syntax:use-syntax cl-debug-print:debug-print-syntax)
;; BEGIN_INSERTED_CONTENTS
(defstruct (queue (:constructor make-queue
(&optional list &aux (tail (last list)))))
(list nil :type list)
(tail nil :type (or null (cons t null))))
(declaim (inline enqueue))
(defun enqueue (obj queue)
"Pushes OBJ to the end of QUEUE."
(symbol-macrolet ((list (queue-list queue))
(tail (queue-tail queue)))
(if (null list)
(setf tail (list obj)
list tail)
(setf (cdr tail) (list obj)
tail (cdr tail))))
queue)
(declaim (inline dequeue))
(defun dequeue (queue)
"Pops OBJ from the front of QUEUE."
(pop (queue-list queue)))
(declaim (inline queue-empty-p))
(defun queue-empty-p (queue)
(null (queue-list queue)))
(declaim (inline enqueue-front))
(defun enqueue-front (obj queue)
"Pushes OBJ to the front of QUEUE."
(symbol-macrolet ((list (queue-list queue))
(tail (queue-tail queue)))
(if (null list)
(setf tail (list obj)
list tail)
(push obj list))
queue))
;; Scheme-style named let
(defmacro nlet (name args &body body)
(labels ((ensure-list (x) (if (listp x) x (list x))))
(let ((args (mapcar #'ensure-list args)))
`(labels ((,name ,(mapcar #'car args) ,@body))
(,name ,@(mapcar #'cadr args))))))
(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))))))))
(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
(defun first-win-p (xs revgraph degs threshold)
(declare #.OPT
((simple-array uint32 (*)) degs xs)
((simple-array list (*)) revgraph)
(uint32 threshold))
(let* ((n (length revgraph))
(dp0 (make-array n :element-type 'int8 :initial-element -1))
(dp1 (make-array n :element-type 'int8 :initial-element -1))
(degs0 (copy-seq degs))
(degs1 (copy-seq degs))
;; vertex . turn
(q (make-queue)))
(dotimes (i n)
(if (>= (aref xs i) threshold)
(progn (setf (aref dp0 i) 1)
(enqueue (cons i 0) q))
(progn (setf (aref dp1 i) 1)
(enqueue (cons i 1) q)))
(when (zerop (aref degs i))
(if (>= (aref xs i) threshold)
(progn (setf (aref dp1 i) 0)
(enqueue (cons i 1) q))
(progn (setf (aref dp0 i) 0)
(enqueue (cons i 0) q)))))
(loop until (queue-empty-p q)
for (vertex . turn) of-type (uint32 . uint32) = (dequeue q)
for dp = (if (= turn 0) dp0 dp1)
for opponent-dp = (if (= turn 0) dp1 dp0)
for degs = (if (= turn 0) degs0 degs1)
for opponent-degs = (if (= turn 0) degs1 degs0)
do (dolist (prev (aref revgraph vertex))
(when (= (aref opponent-dp prev) -1)
(decf (aref opponent-degs prev))
(if (zerop (aref dp vertex))
(progn (setf (aref opponent-dp prev) 1)
(enqueue (cons prev (logxor 1 turn)) q))
(when (zerop (aref opponent-degs prev))
(setf (aref opponent-dp prev) 0)
(enqueue (cons prev (logxor 1 turn)) q))))))
(= 1 (aref dp0 0))))
(defun main ()
(let* ((n (read))
(m (read))
(xs (make-array n :element-type 'uint32))
(revgraph (make-array n :element-type 'list :initial-element nil))
(degs (make-array n :element-type 'uint32 :initial-element 0)))
(dotimes (i n) (setf (aref xs i) (read-fixnum)))
(dotimes (i m)
(let ((a (- (read-fixnum) 1))
(b (- (read-fixnum) 1)))
(push a (aref revgraph b))
(incf (aref degs a))))
(nlet bisect ((ok 0) (ng #xffffffff))
(if (<= (- ng ok) 1)
(println ok)
(let ((mid (ash (+ ok ng) -1)))
(if (first-win-p xs revgraph degs mid)
(bisect mid ng)
(bisect ok mid)))))))
#-swank(main)
提出情報
| 提出日時 | |
|---|---|
| 問題 | D - 有向グラフと数 |
| ユーザ | sansaqua |
| 言語 | Common Lisp (SBCL 1.1.14) |
| 得点 | 100 |
| コード長 | 6378 Byte |
| 結果 | AC |
| 実行時間 | 606 ms |
| メモリ | 103008 KiB |
ジャッジ結果
| セット名 | Sample | Dataset1 | Dataset2 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 30 / 30 | 70 / 70 | ||||||
| 結果 |
|
|
|
| セット名 | テストケース |
|---|---|
| Sample | sample-01.txt, sample-02.txt |
| Dataset1 | sample-01.txt, sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt |
| Dataset2 | 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt, 02-13.txt, 02-14.txt, 02-15.txt, 02-16.txt, 02-17.txt, sample-01.txt, sample-02.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 01-01.txt | AC | 336 ms | 38120 KiB |
| 01-02.txt | AC | 130 ms | 25188 KiB |
| 01-03.txt | AC | 131 ms | 25184 KiB |
| 01-04.txt | AC | 130 ms | 25184 KiB |
| 01-05.txt | AC | 130 ms | 25192 KiB |
| 01-06.txt | AC | 131 ms | 25188 KiB |
| 01-07.txt | AC | 130 ms | 25188 KiB |
| 01-08.txt | AC | 131 ms | 25188 KiB |
| 01-09.txt | AC | 131 ms | 27232 KiB |
| 01-10.txt | AC | 132 ms | 27240 KiB |
| 01-11.txt | AC | 131 ms | 25188 KiB |
| 01-12.txt | AC | 133 ms | 29280 KiB |
| 01-13.txt | AC | 135 ms | 29280 KiB |
| 01-14.txt | AC | 135 ms | 29284 KiB |
| 01-15.txt | AC | 136 ms | 29288 KiB |
| 01-16.txt | AC | 133 ms | 29280 KiB |
| 01-17.txt | AC | 134 ms | 29280 KiB |
| 01-18.txt | AC | 133 ms | 29280 KiB |
| 01-19.txt | AC | 133 ms | 27236 KiB |
| 01-20.txt | AC | 133 ms | 29284 KiB |
| 01-21.txt | AC | 133 ms | 27236 KiB |
| 01-22.txt | AC | 133 ms | 29284 KiB |
| 01-23.txt | AC | 133 ms | 29284 KiB |
| 01-24.txt | AC | 135 ms | 29288 KiB |
| 01-25.txt | AC | 134 ms | 29284 KiB |
| 01-26.txt | AC | 136 ms | 29288 KiB |
| 01-27.txt | AC | 135 ms | 29280 KiB |
| 01-28.txt | AC | 132 ms | 29284 KiB |
| 02-01.txt | AC | 342 ms | 88808 KiB |
| 02-02.txt | AC | 464 ms | 84580 KiB |
| 02-03.txt | AC | 546 ms | 96868 KiB |
| 02-04.txt | AC | 336 ms | 96868 KiB |
| 02-05.txt | AC | 383 ms | 90724 KiB |
| 02-06.txt | AC | 522 ms | 90728 KiB |
| 02-07.txt | AC | 340 ms | 86628 KiB |
| 02-08.txt | AC | 337 ms | 92772 KiB |
| 02-09.txt | AC | 426 ms | 94820 KiB |
| 02-10.txt | AC | 570 ms | 96864 KiB |
| 02-11.txt | AC | 437 ms | 90728 KiB |
| 02-12.txt | AC | 506 ms | 103008 KiB |
| 02-13.txt | AC | 572 ms | 84580 KiB |
| 02-14.txt | AC | 566 ms | 96868 KiB |
| 02-15.txt | AC | 504 ms | 82528 KiB |
| 02-16.txt | AC | 606 ms | 90724 KiB |
| 02-17.txt | AC | 321 ms | 80488 KiB |
| sample-01.txt | AC | 131 ms | 25192 KiB |
| sample-02.txt | AC | 131 ms | 25188 KiB |