結果
| 問題 | 
                            No.1021 Children in Classrooms
                             | 
                    
| コンテスト | |
| ユーザー | 
                             norioc
                         | 
                    
| 提出日時 | 2025-11-04 02:08:07 | 
| 言語 | Scheme  (Gauche-0.9.15)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 10,011 bytes | 
| コンパイル時間 | 222 ms | 
| コンパイル使用メモリ | 7,972 KB | 
| 実行使用メモリ | 83,912 KB | 
| 最終ジャッジ日時 | 2025-11-04 02:08:35 | 
| 合計ジャッジ時間 | 27,220 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 9 TLE * 8 | 
ソースコード
(use srfi.13)  ; string
(use srfi.42)  ; list-ec
;; (use srfi.210) ; compose-left
(use scheme.list)
(use scheme.vector)
(use gauche.generator)
(use gauche.lazy)
(use gauche.sequence)
(use util.match)
(define input read-line)
(define (read-words)
  (string-split (input) " "))
(define (ii)
  (string->number (input)))
(define (li)
  (map string->number (read-words)))
(define-method prn* ((coll <collection>) :key (sep " "))
  (for-each-with-index (^(i x)
                         (when (> i 0)
                           (display sep))
                         (display x))
                       coll)
  (newline))
(define (prn . args)
  (prn* args))
(define (prn-yn b)
  (prn (if b "Yes" "No")))
(define-syntax def define)
(define-reader-directive 'memo
  (^(sym port ctx)
    (let1 expr (read port)
      (let1 name (car (cadr expr))
        `(begin
           ,expr
           (define ,name (memoize ,name)))))))
(define-macro (d/ . args)
  (let ((ss (map (^x
                  `(format #f "~a=~:w" (quote ,x) ,x))
                 args)))
    `(print (string-join (list ,@ss) " "))))
(define-macro (fn pat . body)
  (let ((args (gensym)))
    `(lambda ,args
       (mlet1 ,pat ,args
         ,@body))))
(define-macro (fn1 pat . body)
  (let ((arg (gensym)))
    `(lambda (,arg)
       (mlet1 ,pat ,arg
         ,@body))))
(define-syntax ->
  (syntax-rules ()
    ((_ init fns ...)
     (call-with-values (^() init)
       (apply compose (reverse (list fns ...)))))))
(define-syntax ->/prn
  (syntax-rules ()
    ((_ x fns ...)
     (-> x fns ... prn))))
(define-syntax let/g
  (syntax-rules ()
    ((_ var body ...)
     (generate (lambda (var) body ...)))))
(define-macro (do1 pat expr . body)
  (let1 var (gensym)
    `(do-ec (: ,var ,expr)
            (mlet1 ,pat ,var
              ,@body))))
(define-syntax do*
  (syntax-rules ()
    ((_ (qualifier1 qualifier2 ...) body ...)
     (do-ec qualifier1 qualifier2 ... (begin body ...)))))
(define-syntax max0-ec
  (syntax-rules ()
    ((_ qualifier ... body)
     (fold-ec 0 qualifier ... body max))))
(define-method reverse ((s <string>))
  (string-reverse s))
(define-method reverse ((vs <vector>))
  (rlet1 res (vector-copy vs)
    (vector-reverse! res)))
(define ord char->integer)
(define chr integer->char)
(define str x->string)
(define-method int () 0)
(define-method int ((x <integer>)) x)
(define-method int ((x <real>)) (truncate->exact x))
(define-method int ((s <string>))
  (let1 v (string->number s)
    (if (exact-integer? v)
      v
      (errorf "invalid string for integer: ~w" s))))
(define-method int ((c <char>))
  (if (char-numeric? c)
    (digit->integer c)
    (errorf "invalid char for integer: ~w" c)))
(define (minmax . xs)
  (values->list (apply min&max xs)))
(define (sum xs)
  (fold + 0 xs))
(define (prod xs)
  (fold * 1 xs))
(define (divmod a b)
  (values->list (div-and-mod a b)))
(define (ceildiv a b)
  (div (+ a (1- b)) b))
(define (divide? a b)
  (zero? (mod a b)))
(define (1+ n) (+ n 1))
(define (1- n) (- n 1))
(define (!= a b) (not (= a b)))
(define (midpoint a b) (div (+ a b) 2))
(define pow
  (case-lambda
   ((a b) (expt a b))
   ((a b m) (expt-mod a b m))))
(define sq square)
(define isqrt exact-integer-sqrt)
(define (sq? n)
  (let1 x (isqrt n)
    (= (sq x) n)))
(define len size-of)
(define pos? positive?)
(define neg? negative?)
(define == equal?)
(define ++ string-append)
(define all every)
(define any-ec any?-ec)
(define all-ec every?-ec)
(define concat concatenate)
(define foldl fold-left)
(define (pairwise xs)
  (zip xs (cdr xs)))
(define-method indexed ((coll <collection>) :optional (start 0))
  (list-ec (: x (index i) coll)
           (list (+ i start) x)))
(define-method fst ((coll <collection>))
  (~ coll 0))
(define-method snd ((coll <collection>))
  (~ coll 1))
(define (comb n k)
  (if (or (< k 0) (> k n))
    0
    (let loop ((i 0)
               (x 1))
      (if (= i k)
        x
        (loop (1+ i) (div (* x (- n i)) (1+ i)))))))
(define-method frequencies ((xs <collection>))
  (rlet1 d (make-dict)
    (for-each (^x (d'update! x 1+ 0)) xs)))
;; '(a b c) -> op(op(op(init, a), b), c)
(define (scanl op init xs)
  (define (f a b)
    (let1 t (op b a)
      (values t t)))
  (map-accum f init xs))
;; '(a b c) ->  op(a, op(b, op(c, init)))
(define (scanr op init xs)
  (define (f a b)
    (let1 t (op a b)
      (values t t)))
  (reverse (map-accum f init (reverse xs))))
(define (map-accuml op init xs)
  (values-ref (map-accum (^(a b) (op b a)) init xs)
              0))
(define (liter f seed)
  (coroutine->lseq
   (^(yield)
     (let loop ((x seed))
       (receive (nx nseed) (f x)
         (yield nx)
         (loop nseed))))))
(define min* (apply$ min))
(define-method min* ((v <vector>))
  (assume (> (len v) 0))
  (fold min (vector-ref v 0) v))
(define max* (apply$ max))
(define-method max* ((v <vector>))
  (assume (> (len v) 0))
  (fold max (vector-ref v 0) v))
(define minmax* (apply$ minmax))
(define zip* (apply$ zip))
(define string* (apply$ string))
(define values* (apply$ values))
(define mlet match-let)
(define mlet* match-let*)
(define mlet1 match-let1)
(define (=$ x) (pa$ = x))
(define (==$ x) (pa$ == x))
(define-macro (var . binds)
  (let1 defs (map (fn1 (k v)
                    `(match-define ,k ,v))
                  (slices binds 2))
    `(begin ,@defs)))
(define-macro (input! . vars)
  (define (group xs)
    (if (null? xs)
      '()
      (let1 x (car xs)
        (cond
         ((keyword? x) ; (:i VAR)
          (assume (and (pair? (cdr xs))
                       (symbol? (cadr xs))))
          (cons (list x (cadr xs)) (group (cddr xs))))
         ((symbol? x)  ; default :i
          (cons (list :i x) (group (cdr xs))))
         ((pair? x)
          (cons (group x) (group (cdr xs))))
         (else
          (error "parse error: " xs))))))
  (define (gen-define-values binds)
    (let* ((ss (gensym))
           (vars (map cadr binds))
           (vals (map-with-index
                  (^(i x)
                    (ecase x
                      ((:i)   `(int (list-ref ,ss ,i)))
                      ((:i-1) `(- (int (list-ref ,ss ,i)) 1))
                      ((:s)   `(list-ref ,ss ,i))))
                  (map car binds))))
      `(define-values ,vars (let1 ,ss (read-words)
                              (values ,@vals)))))
  (define (gen-define-values-1 kind var)
    (let* ((val (ecase kind
                  ((:i)   `(map int (read-words)))
                  ((:i-1) `(map (^x (- (int x) 1)) (read-words)))
                  ((:s)   `(read-words)))))
      `(define-values (,var) (values ,val))))
  (define (gen bind)
    (match bind
      ((':i var)   `(define ,var (int (input))))
      ((':i-1 var) `(define ,var (- (int (input)) 1)))
      ((':s var)   `(define ,var (input)))
      (else
       (match-let1 (x . more) bind
         (if (null? more)
           (gen-define-values-1 (car x) (cadr x))
           (gen-define-values bind))))))
  (let ((binds (group vars)))
    `(begin
       ,@(map gen binds))))
(define (digits n)
  (map digit->integer (str n)))
(define (digits->int ds)
  (fold-left (^(a b) (+ (* 10 a) b)) 0 ds))
(define (sort/v . args)
  (list->vector (apply sort args)))
(define (+/mod . args)
  (foldl (^(x a) (mod (+ x a) MOD)) 0 args))
(define (rep n thunk)
  (list-ec (: _ n)
           (thunk)))
(define (memoize fn)
  (let1 cache (make-hash-table 'equal?)
    (lambda args
      (if (hash-table-exists? cache args)
        (hash-table-get cache args)
        (rlet1 val (apply fn args)
          (hash-table-put! cache args val))))))
(define (accumulate xs)
  (list->vector (scanl + 0 xs)))
(define (accum xs)
  (let ((vs (accumulate xs)))
    (case-lambda
     ((l r)  ; [l, r]
      (- (vector-ref vs r) (if (> l 0) (vector-ref vs (1- l)) 0)))
     ((r)    ; [0, r]
      (vector-ref vs r)))))
(define (uniq xs)
  (let1 used (make-hash-table 'equal?)
    (let loop ((xs xs))
      (if (null? xs)
        '()
        (mlet1 (x . more) xs
          (if (hash-table-contains? used x)
            (loop more)
            (begin
              (hash-table-put! used x #t)
              (cons x (loop more)))))))))
(define (new-object self fntable)
  (let1 ht (make-hash-table 'eq?)
    (for-each (^x (hash-table-put! ht (car x) (cadr x)))
              (slices fntable 2))
    (^(tag . args)
      (let1 fn (hash-table-get ht tag #f)
        (if fn
          (apply fn self args)
          (error "tag not found: " tag))))))
(define (make-dict)
  (define fntable (list
                   'get       hash-table-get
                   'put!      hash-table-put!
                   'update!   hash-table-update!
                   'push!     hash-table-push!
                   'contains? hash-table-contains?
                   'keys      hash-table-keys
                   'values    hash-table-values
                   'items     hash-table->alist
                   'size      hash-table-num-entries
                   'map       hash-table-map))
  (new-object (make-hash-table 'equal?) fntable))
(define (tap/d . args)
  (pprint args)
  (apply values args))
(use data.ring-buffer)
(input! (N M) (A) :s S)
(define (list->ring-buffer lis)
  (rlet1 rb (make-ring-buffer)
    (for-each (^x (ring-buffer-add-back! rb x))
              lis)))
(define (ring-buffer->list rb)
  (rlet1 lis '()
    (while (not (ring-buffer-empty? rb))
      (push! lis (ring-buffer-remove-back! rb)))))
(define (move-left rb)
  (let* ((a (ring-buffer-remove-front! rb))
         (b (ring-buffer-remove-front! rb)))
    (ring-buffer-add-front! rb (+ a b))
    (ring-buffer-add-back! rb 0)))
(define (move-right rb)
  (let* ((a (ring-buffer-remove-back! rb))
         (b (ring-buffer-remove-back! rb)))
    (ring-buffer-add-back! rb (+ a b))
    (ring-buffer-add-front! rb 0)))
(let1 rb (list->ring-buffer A)
  (do-ec (: c S)
         (if (== c #\L)
           (move-left rb)
           (move-right rb)))
  (prn* (ring-buffer->list rb)))
            
            
            
        
            
norioc