提出 #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
結果
AC × 2
AC × 30
AC × 47
セット名 テストケース
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