Post on: Jun 26, 2024Last edited: Jul 1, 2024Words 00 min

type
status
date
slug
summary
tags
category
icon
password
“Chào mọi người. Tuyển tập Challenger là những ghi chép, tản mạn của mình về problem-solving, chủ yếu là về Lập trình thi đấu (Competitive Programming) và Capture The Flag (CTF). Mỗi tuyển tập sẽ có các chuỗi bài viết với cùng một mạch ý. Rất mong được sự hưởng ứng và góp ý của các bạn! Mình cảm ơn nhiều.”
Mở đầu cho series, mình sẽ viết về bài E trong Codeforces Round 955 vừa rồi. Trong giờ thi mình đã không đủ thời gian nghĩ bài này, và sau khi dành chút thời gian để hiểu kĩ thì mình thấy ý niệm và cài đặt của bài toán này khá tiêu biểu cho các bài toán thuộc chủ đề Chia để trị (Divide and Conquer - DnC).

1982E - Number of k-good subarrays

Xét dãy số tự nhiên liên tiếp gồm số từ đến , đếm số đoạn con của dãy này mà các số trong đó có số bit 1 . Giải với test. Giới hạn: .

Ý tưởng chính

Nếu ta lấy lớn nhất sao cho , ở vị trí bit , sẽ chỉ gồm 2 đoạn liên tiếp:
  • số đầu tiên có bit thứ .
  • số còn lại có bit thứ .
Gọi với ý nghĩa:
  • số đầu tiên (từ đến ) có bit 1.
  • số cuối cùng (từ đến ) có bit 1.
  • là đáp án.
Theo như nhận xét trên, việc tính có thể quy về tính .

Ghép đoạn

Phần này khi luận ra được sẽ thấy khá hiển nhiên. Đặt là số đoạn con của mảng độ dài .
Giả sử kết quả của .
Ta có .
Sau đó, ta tính lại . Ban đầu, ta đặt .
  • Nếu (tất cả các số trong đoạn đang tính đều thoả có bit 1), thì ta ghép đoạn trước với đầu của đoạn sau, khi đó .
  • Tương tự, nếu , thì ta ghép đoạn sau với đuôi của đoạn trước, khi đó .

Tối ưu

Thuật toán trên vẫn mất độ phức tạp là . Để tối ưu, ta nhận thấy đối với 2 trường hợp trên:
  1. có thể tính theo . Biến vẫn là luỹ thừa của 2.
  1. chính là việc bỏ đi bit thứ và tính toán trên các số còn lại với bit, do đó, quá trình đệ quy sẽ dần quay về trường hợp 1.
Từ đó ta thấy rằng, tất cả các tính toán cuối cùng sẽ quy về chỉ cần tính trước các là các trạng thái đặc biệt.
Sau đó với mỗi truy vấn, khi gọi đệ quy, đã được tính trước, trong khi phần còn lại sẽ cũng sẽ giảm 1 nửa theo mỗi bước đệ quy xuống và quy về những phần đã tính trước.
Do đó thời gian cho mỗi test chỉ mất .
 

Loading...
My setup #1 - i use archwsl btw

⚙️My setup #1 - i use archwsl btw

Because Linux + Windows seamlessly is just surprisingly cool and convenient.


Hello World!

Hello World!

Welcome to my realm! This is the first post.