Submission #3962590


Source Code Expand

;; -*- 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 (cl-syntax:use-syntax cl-debug-print:debug-print-syntax)

;; BEGIN_INSERTED_CONTENTS
(deftype non-negative-fixnum () '(integer 0 #.most-positive-fixnum))

(defstruct (union-find
            (:constructor make-union-find
                (size &aux (parents (let ((seq (make-array size :element-type 'non-negative-fixnum)))
                                      (dotimes (i size seq) (setf (aref seq i) i))))
                           (ranks (make-array size :element-type 'non-negative-fixnum
                                                   :initial-element 0)))))
  (parents nil :type (simple-array non-negative-fixnum (*)))
  (ranks nil :type (simple-array non-negative-fixnum (*))))

(declaim (ftype (function * (values non-negative-fixnum &optional)) uf-root))
(defun uf-root (x uf-tree)
  "Returns the root of X."
  (declare (optimize (speed 3))
           (non-negative-fixnum x))
  (let ((parents (union-find-parents uf-tree)))
    (if (= x (aref parents x))
        x
        (setf (aref parents x)
              (uf-root (aref parents x) uf-tree)))))

(declaim (inline uf-unite!))
(defun uf-unite! (x1 x2 uf-tree)
  "Unites X1 and X2 destructively."
  (let ((root1 (uf-root x1 uf-tree))
        (root2 (uf-root x2 uf-tree))
        (parents (union-find-parents uf-tree))
        (ranks (union-find-ranks uf-tree)))
    (cond ((= root1 root2) nil)
          ((< (aref ranks root1) (aref ranks root2))
           (setf (aref parents root1) root2))
          ((= (aref ranks root1) (aref ranks root2))
           (setf (aref parents root2) root1)
           (incf (aref ranks root1)))
          (t (setf (aref parents root2) root1)))))

(declaim (inline uf-connected-p))
(defun uf-connected-p (x1 x2 uf-tree)
  "Checks if X1 and X2 have the same root."
  (= (uf-root x1 uf-tree) (uf-root x2 uf-tree)))

(defmacro buffered-read-line (&optional (buffer-size 30) (in '*standard-input*) (terminate-char #\Space))
  "Note that the returned string may be changed by repetitive use."
  (let ((buffer (gensym))
        (character (gensym))
        (idx (gensym)))
    `(let ((,buffer (load-time-value (make-string ,buffer-size
                                                  :element-type 'base-char
                                                  :initial-element ,terminate-char))))
       (declare (simple-base-string ,buffer))
       (loop for ,character of-type base-char =
                #-swank (code-char (read-byte ,in nil #\Newline))
                #+swank (read-char ,in nil #\Newline)
             for ,idx from 0
             until (char= ,character #\Newline)
             do (setf (schar ,buffer ,idx) ,character)
             finally (setf (schar ,buffer ,idx) ,terminate-char)
                     (return ,buffer)))))

(defmacro split-ints-and-bind (arg-lst string &body body)
  (let ((pos1 (gensym "POS"))
	(pos2 (gensym "POS"))
	(str (gensym "STR")))
    (labels ((expand (arg-lst &optional (init-pos1 t))
	       (if (null arg-lst)
		   body
		   `((let* ((,pos1 ,(if init-pos1 0 `(1+ ,pos2)))
			    (,pos2 (position #\space ,str :start ,pos1 :test #'char=))
			    (,(car arg-lst) (parse-integer ,str :start ,pos1 :end ,pos2)))
		       ,@(expand (cdr arg-lst) nil))))))
      `(let ((,str ,string))
         (declare (string ,str))
	 ,@(expand arg-lst)))))

(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 4 7 8 15 16 31 32 62 63 64)

(defmacro println (obj &optional (stream '*standard-output*))
  `(let ((*read-default-float-format* 'double-float))
     (prog1 (princ ,obj ,stream) (terpri ,stream))))

;; Hauptteil

(defun main ()
  (declare #.OPT)
  (let* ((n (read))
         (q (read))
         (tree (make-union-find (* 2 (1+ n)))))
    (dotimes (i q)
      (split-ints-and-bind (w x y z) (buffered-read-line)
        (declare (uint32 w x y z))
        (if (= w 1)
            (if (evenp z)
                (progn (uf-unite! (+ x x) (+ y y) tree)
                       (uf-unite! (+ x x -1) (+ y y -1) tree))
                (progn (uf-unite! (+ x x) (+ y y -1) tree)
                       (uf-unite! (+ x x -1) (+ y y) tree)))
            (if (uf-connected-p (+ x x) (+ y y) tree)
                (write-line "YES")
                (write-line "NO")))))))

#-swank(main)

Submission Info

Submission Time
Task D - 偶数メートル
User sansaqua
Language Common Lisp (SBCL 1.1.14)
Score 100
Code Size 4892 Byte
Status AC
Exec Time 311 ms
Memory 31592 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 70 / 70
Status
AC × 3
AC × 32
AC × 62
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
Subtask1 sample_01.txt, sample_02.txt, sample_03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask1_20.txt, subtask1_21.txt, subtask1_22.txt, subtask1_23.txt, subtask1_24.txt, subtask1_25.txt, subtask1_26.txt, subtask1_27.txt, subtask1_28.txt, subtask1_29.txt
Subtask2 sample_01.txt, sample_02.txt, sample_03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt, subtask1_17.txt, subtask1_18.txt, subtask1_19.txt, subtask1_20.txt, subtask1_21.txt, subtask1_22.txt, subtask1_23.txt, subtask1_24.txt, subtask1_25.txt, subtask1_26.txt, subtask1_27.txt, subtask1_28.txt, subtask1_29.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt, subtask2_13.txt, subtask2_14.txt, subtask2_15.txt, subtask2_16.txt, subtask2_17.txt, subtask2_18.txt, subtask2_19.txt, subtask2_20.txt, subtask2_21.txt, subtask2_22.txt, subtask2_23.txt, subtask2_24.txt, subtask2_25.txt, subtask2_26.txt, subtask2_27.txt, subtask2_28.txt, subtask2_29.txt, subtask2_30.txt
Case Name Status Exec Time Memory
sample_01.txt AC 274 ms 31592 KB
sample_02.txt AC 109 ms 18916 KB
sample_03.txt AC 109 ms 18916 KB
subtask1_01.txt AC 112 ms 20960 KB
subtask1_02.txt AC 112 ms 18912 KB
subtask1_03.txt AC 113 ms 20968 KB
subtask1_04.txt AC 111 ms 18920 KB
subtask1_05.txt AC 111 ms 18912 KB
subtask1_06.txt AC 111 ms 20968 KB
subtask1_07.txt AC 111 ms 18920 KB
subtask1_08.txt AC 114 ms 20968 KB
subtask1_09.txt AC 116 ms 20964 KB
subtask1_10.txt AC 115 ms 20960 KB
subtask1_11.txt AC 116 ms 20964 KB
subtask1_12.txt AC 115 ms 20964 KB
subtask1_13.txt AC 116 ms 20964 KB
subtask1_14.txt AC 116 ms 20964 KB
subtask1_15.txt AC 115 ms 20964 KB
subtask1_16.txt AC 114 ms 20964 KB
subtask1_17.txt AC 115 ms 20964 KB
subtask1_18.txt AC 115 ms 20964 KB
subtask1_19.txt AC 115 ms 20968 KB
subtask1_20.txt AC 115 ms 20968 KB
subtask1_21.txt AC 115 ms 20964 KB
subtask1_22.txt AC 115 ms 20968 KB
subtask1_23.txt AC 115 ms 20968 KB
subtask1_24.txt AC 116 ms 20964 KB
subtask1_25.txt AC 115 ms 20964 KB
subtask1_26.txt AC 115 ms 20968 KB
subtask1_27.txt AC 115 ms 20964 KB
subtask1_28.txt AC 116 ms 20964 KB
subtask1_29.txt AC 115 ms 20960 KB
subtask2_01.txt AC 179 ms 21088 KB
subtask2_02.txt AC 277 ms 23136 KB
subtask2_03.txt AC 120 ms 20968 KB
subtask2_04.txt AC 268 ms 21092 KB
subtask2_05.txt AC 187 ms 23136 KB
subtask2_06.txt AC 185 ms 23136 KB
subtask2_07.txt AC 263 ms 23144 KB
subtask2_08.txt AC 286 ms 23140 KB
subtask2_09.txt AC 218 ms 21092 KB
subtask2_10.txt AC 310 ms 23272 KB
subtask2_11.txt AC 311 ms 23268 KB
subtask2_12.txt AC 305 ms 23268 KB
subtask2_13.txt AC 309 ms 23272 KB
subtask2_14.txt AC 309 ms 23264 KB
subtask2_15.txt AC 309 ms 23268 KB
subtask2_16.txt AC 307 ms 23264 KB
subtask2_17.txt AC 309 ms 23272 KB
subtask2_18.txt AC 306 ms 23268 KB
subtask2_19.txt AC 311 ms 23272 KB
subtask2_20.txt AC 308 ms 23268 KB
subtask2_21.txt AC 213 ms 23016 KB
subtask2_22.txt AC 210 ms 23016 KB
subtask2_23.txt AC 212 ms 23012 KB
subtask2_24.txt AC 211 ms 23008 KB
subtask2_25.txt AC 212 ms 23008 KB
subtask2_26.txt AC 211 ms 23012 KB
subtask2_27.txt AC 212 ms 23012 KB
subtask2_28.txt AC 209 ms 23016 KB
subtask2_29.txt AC 212 ms 23012 KB
subtask2_30.txt AC 295 ms 21224 KB