trang chủ / bài tập / cowmistry / lời giải

Tàu vũ trụ

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Tác giả: huunguyenhuunguyen

Lời giải: Tàu vũ trụ

Nhận xét quan trọng

Chuỗi nút nhấn hợp lệ của Bessie có cấu trúc đặc biệt: khi nhấn nút x, tất cả các nút nhỏ hơn x được "reset" và có thể dùng lại, nhưng nút x trở nên không hợp lệ cho đến khi có nút lớn hơn được nhấn. Điều này có nghĩa là tập hợp các nút đang "hoạt động" luôn có dạng một tập hậu tố (suffix) liên tục không có lỗ hổng, và đây chính là cấu trúc của số Zeckendorf trong hệ đánh số đặc biệt.

Hướng tiếp cận

Chúng ta sử dụng quy hoạch động (DP) với node ảo (virtual node) cho mỗi truy vấn.

Định nghĩa dp[a][b] là số chuỗi hành trình và nhấn nút hợp lệ sử dụng các nút có số không vượt quá mức hiện tại, bắt đầu tại node a và kết thúc tại node b.

  • a,b{0,1,,N1}: các phòng thực
  • a=N+j: node ảo αj — đại diện cho trạng thái "bắt đầu ở phòng sj nhấn nút bs(j)"
  • b=N+j: node ảo βj — đại diện cho trạng thái "kết thúc ở phòng tj nhấn nút bt(j)"

Câu trả lời cho truy vấn jdp[N+j][N+j] sau khi xử lý tất cả K mức nút.

Thuật toán

Với mỗi mức nút h (từ 0 đến K1, tương ứng nút h+1):

  1. Sao chép dp từ mức trước (chuỗi không dùng nút h+1 vẫn hợp lệ).

  2. Với mỗi phòng "trung tâm" c (nơi nhấn nút h+1):

    • Tính mảng left[a]: số chuỗi bắt đầu tại a kết thúc ngay trước khi vào c:
      • left[c]=1 (chuỗi trái rỗng, Bessie bắt đầu ở c)
      • left[N+j]+=1 nếu h=bs(j)1c=sj (node alpha kích hoạt)
      • left[a]+=b:adj[b][c]dp[a][b] (chuỗi DP đi vào c)
    • Tính mảng right[b]: số chuỗi bắt đầu ngay sau c kết thúc tại b:
      • right[c]=1 (chuỗi phải rỗng, Bessie dừng ở c)
      • right[N+j]+=1 nếu h=bt(j)1c=tj (node beta kích hoạt)
      • right[b]+=a:adj[c][a]dp[a][b] (chuỗi DP từ c)
    • Cộng vào DP mới: dp[a][b]+=left[a]×right[b]

Độ phức tạp

  • Số trạng thái DP: O((N+Q)2)
  • Với mỗi mức nút và mỗi phòng trung tâm: tính left và right mỗi cái mất O(N·(N+Q)), cộng vào DP mất O((N+Q)2)
  • Tổng: O(N·(N+Q)2·K)

Với N,K,Q60: (N+Q)2·K·N=1202·60·605.2×107, hoàn toàn trong giới hạn thời gian.


Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0