0

OBLIVION-0

đã đăng vào 8, Tháng 7, 2026, 0:04

OBLIVION-0: HÀNH LANG KÝ ỨC CUỐI CÙNG

THE LAST MEMORY CORRIDOR
U.A.R.D. CENTRAL ARCHIVES
United Anomalous Research Division

PROJECT ID             : OBLIVION-0
CODENAME               : The Last Memory Corridor

Containment Protocol   : IMPOSSIBLE
Threat Classification  : Ω-BLACK
Anomaly Category       : Memetic / Cognitive-Parasitic
Hazard Rating          : MH-∞
Current Status         : ACTIVE
Clearance Required     : LEVEL Ω-9

Giới hạn thời gian: 2.0 giây
Giới hạn bộ nhớ: 512 MB
Phương thức vào/ra: Standard Input / Standard Output


HỒ SƠ TỐI MẬT CẤP Ω

Nếu bạn vẫn nhớ vì sao mình mở tài liệu này, hãy tiếp tục đọc.

Nếu bạn phải mất vài giây để nhớ lại...

...thì quá trình lây nhiễm có thể đã bắt đầu.


TÓM TẮT SỰ KIỆN

Năm 2194, toàn bộ mạng lưới lưu trữ của nhân loại đồng loạt ghi nhận một hiện tượng không thể giải thích.

Không có máy chủ nào bị xâm nhập.

Không có gói tin bất thường.

Không có đoạn mã độc nào được phát hiện.

Không có dữ liệu nào bị sửa đổi.

Mọi kiểm tra đều cho cùng một kết quả.

Hệ thống hoàn toàn bình thường.

Thế nhưng...

Những người vận hành bắt đầu quên đi những tập tin mà chính họ vừa mở vài phút trước.

Một kỹ sư quên mật khẩu của chính mình.

Một nhà nghiên cứu quên dự án mình đã dành mười hai năm theo đuổi.

Một AI lưu trữ tuyên bố:

"Có một thư mục mà tôi biết chắc mình từng lập chỉ mục."

"Nhưng tôi không còn nhớ nó nằm ở đâu."


Trong vòng ba tháng.

Hơn bốn mươi phần trăm kho dữ liệu của nhân loại biến mất khỏi trí nhớ của mọi sinh vật có nhận thức.

Điều đáng sợ là...

Dữ liệu vẫn còn nguyên.

Không một bit nào bị thay đổi.

Chỉ không còn ai nhớ rằng chúng tồn tại.


Hiện tượng này được đặt tên là

OBLIVION-0

Không ai biết nó là sinh vật.

Không ai biết nó là chương trình.

Không ai biết nó có trí tuệ hay không.

Bởi mọi giả thuyết từng được đưa ra đều biến mất cùng những người đề xuất chúng.


THÍ NGHIỆM 42

Một AI không được phép lưu ký ức dài hạn được giao nhiệm vụ quan sát OBLIVION-0.

Sau mỗi một giây, toàn bộ bộ nhớ của AI sẽ bị xóa sạch và khởi tạo lại.

Mỗi lần khởi động, AI chỉ nhận được một câu lệnh.

Quan sát.
Ghi lại.
Quên tất cả.
Lặp lại.

Sau hơn ba triệu chu kỳ, AI phát hiện một quy luật duy nhất không bao giờ thay đổi.

OBLIVION-0 không xóa ký ức một cách liên tục.

Nó di chuyển.

Giống như một sinh vật đang bò qua các nút ghi nhớ của nhân loại.

Mỗi nơi nó đi qua đều để lại một "vết thương nhận thức".

Có nơi ký ức tự phục hồi.

Có nơi ký ức tiếp tục bị ăn mòn.

Nếu biểu diễn mức thay đổi ký ức tại mỗi phân đoạn bằng một số nguyên:

  • Giá trị dương nghĩa là ký ức được phục hồi.
  • Giá trị âm nghĩa là OBLIVION-0 vừa ăn thêm một phần ký ức.

Toàn bộ hành trình của thực thể có thể được mô tả bằng một dãy

A₁, A₂, ..., Aₙ

PHÁT HIỆN QUAN TRỌNG NHẤT

Sau mười bảy năm.

Chỉ còn ba nhà nghiên cứu vẫn còn nhớ vì sao dự án tồn tại.

Một trong số họ phát hiện điều mà mọi thế hệ trước đều đã quên.

OBLIVION-0 không thể xóa ký ức ngay lập tức.

Nó cần "đói".

Trong khi một người đang đọc liên tục các phân đoạn ký ức, người đó luôn mang theo một lượng "ổn định nhận thức".

Ban đầu lượng ổn định này bằng 0.

Mỗi phân đoạn đi qua sẽ làm thay đổi lượng ổn định theo giá trị năng lượng của chính nó.

Nếu tại bất kỳ thời điểm nào lượng ổn định trở thành âm, OBLIVION-0 lập tức có thể "cắn" vào dòng nhận thức.

Kể từ khoảnh khắc đó...

mọi ký ức phía sau sẽ không còn được con người tiếp nhận.

Không phải vì dữ liệu biến mất.

Mà vì người đọc không còn khả năng ghi nhớ chúng.


MÔ HÌNH TOÁN HỌC

Giả sử chọn đọc liên tục các phân đoạn từ L đến R.

Đặt lượng ổn định ban đầu bằng

S₀ = 0

Sau đó

S₁ = A[L]

S₂ = A[L] + A[L+1]

...

Sₖ = A[L] + A[L+1] + ... + A[L+k-1]

Trong quá trình đọc,

nếu tồn tại bất kỳ giá trị nào

Sᵢ < 0

thì OBLIVION-0 sẽ lập tức xâm nhập vào ý thức người đọc.

Toàn bộ dữ liệu phía sau sẽ không bao giờ được ghi nhớ.

Cuộc trích xuất thất bại.

Ngược lại,

nếu

S₀, S₁, ..., S(R-L+1)

đều không âm,

thì người đọc có thể đi hết hành lang ký ức mà không để thực thể có cơ hội can thiệp.


DỰ ÁN "HÀNH LANG CUỐI CÙNG"

Nguồn năng lượng còn lại của U.A.R.D. chỉ đủ để mở một hành lang duy nhất.

Không có lần thử thứ hai.

Nếu hành lang quá ngắn,

quá nhiều lịch sử của nhân loại sẽ biến mất mãi mãi.

Nếu hành lang quá dài,

nguy cơ OBLIVION-0 xâm nhập sẽ tăng lên cho đến khi toàn bộ chiến dịch thất bại.

Bạn được giao nhiệm vụ tìm ra hành lang dài nhất có thể được đọc liên tục mà thực thể không bao giờ có cơ hội kích hoạt.

Đó sẽ là phần cuối cùng của lịch sử nhân loại còn có thể được cứu.


MÔ TẢ BÀI TOÁN

Cho dãy số nguyên

A₁, A₂, ..., Aₙ

Hãy tìm giá trị lớn nhất X sao cho tồn tại ít nhất một đoạn liên tiếp có độ dài không nhỏ hơn X, và nếu bắt đầu với tổng bằng 0, thì trong suốt quá trình duyệt đoạn từ trái sang phải, tổng tích lũy không bao giờ nhỏ hơn 0.


INPUT

  • Dòng đầu tiên chứa số nguyên N.
  • Dòng thứ hai chứa N số nguyên A₁...Aₙ.
1 ≤ N ≤ 2 × 10⁵

-10⁹ ≤ Aᵢ ≤ 10⁹

OUTPUT

In ra độ dài lớn nhất của hành lang ký ức có thể được trích xuất thành công.


PHỤ LỤC Ω-17

Bản ghi cuối cùng được tìm thấy trong phòng nghiên cứu số 4.

Không có tên tác giả.

Không có dấu thời gian.

Không có thiết bị nào ghi nhận quá trình nó được tạo ra.

Chỉ có đúng một đoạn văn.

Chúng tôi đã sai ngay từ đầu.

OBLIVION-0 không ăn dữ liệu.

Nó cũng không ăn con người.

Nó ăn khả năng ghi nhớ rằng một điều từng tồn tại.

Khi thực thể đi qua một nơi, dữ liệu vẫn ở đó.

Chỉ không còn ai biết cách tìm lại.

Nếu bạn đang đọc được những dòng này, điều đó có nghĩa là hành lang cuối cùng vẫn chưa sụp đổ.

Xin đừng để nó trở thành ký ức cuối cùng của nhân loại.


Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    YOSHI_BA_SAU  đã bình luận lúc 8, Tháng 7, 2026, 9:49

    Codeforces 1771F optimization Yoshi likes e4 July 2025 1 Introduction First, let us give an overview on what this problem is. We are given an array A of length n ≤ 200000, each containing elements from [0, n − 1], and there are q ≤ 200000 queries, each containing two numbers l, r. We need to find the minimum element that appears an odd number of times in the range [l, r] or report that it does not exist. The problem is interactive, i.e. you can only get the next query after answering the last one. 2 Step A: Precursor This is not the solution (yet), but we will leave it here. Consider an array B[i][j] that is the value of [Ai = j]. We want to find the minimum j such that the sum of B[l..r][j] is odd. We can use a prefix sum array here: We take the cumulative sum (in the i-dimension) of B[i][j] for each j. This allows us to check for the sum faster. However, storing cumulative sums is expensive. We just want to check for the parity. How can we store parity only? If we consider B[i] as a binary vector, then if we want to get the parity of the sum, we just XOR them together. We can finally represent the cumulative XOR of B[i] as an additional ar- ray C[i]. Then, the answer to the query is just the position of the LSB in C[r] XOR C[l − 1]. (Assume that the C array represents the full prefix interval and C[−1] = 0). We can now represent C as an array of bitsets and construct C from B simply by XOR-ing. The XOR and LSB finding operation can be done in O(n/w). This gives us a O(nq/w) time complexity. Yay!!! 3 Step B: Initial ”Solution” We consider the obvious bottleneck: The memory consumption of the C array. The C array takes n2 bits to store, or a whopping 5 GB, far exceeding the 256 MB limit. 1 We can take an idea inspired by sqrt decomposition: Store only spaced values of C[i], each representing a block of the array. Suppose that the block size is now BLOCK. Let C′[i] be the cumulative XOR up to the i-th block (0-indexed). Note: the / operator here represents floor division. (from now on) Then, when answering a query, we can take C′[l/BLOCK] XOR C′[r/BLOCK− 1]. Then, we flip the bits in the 2 sides of the interval (everything excluding the range [(l/BLOCK + 1) ∗ BLOCK, r/BLOCK ∗ BLOCK)). We find the LSB of the resulting bitset normally. Choosing an optimal block size for time complexity gives us the time com- plexity of O(nq/w + (n + q)pn/w) with space complexity of O(n√nw + q). The method described above will not pass under normal conditions. There’s a lot of excessive copying, and this will be eliminated in Part C. 4 Step C: Initial Solution We devise a few optimizations that can be done to the method above. First, reflipping is better than copying (Consider the number of operations: n/w compared to pn/w). We can just directly flip over C′[r/BLOCK − 1] and flip it back after the LSB finding phase. This avoids an expensive copy of C′[r/BLOCK − 1]. We can write our own ”Find LSB” function that takes 2 bitsets (as reference) then find the LSB while directly XOR-ing them. This eliminates the need of copying for both C′[r/BLOCK − 1] and C′[l/BLOCK]. Note: To facilitate the ”Find LSB” operation, we need to find a way to access the inner elements of the bitset. Such a way is possible if we either cast the bitset reference to an array reference (not recommended) or write our own bitset. Writing your own bitset (for this problem) is rather easy. A few optimiza- tions are listed here: We use builtin ctzll for finding LSB of a single integer. For maximum performance, remember to add alignment to the inner bitset data. The time and space complexity won’t change, but your code should be 3 − 4 times faster. 5 Step D: Xor Hashing Let’s bring our most valuable friend: XOR hashes. We assign to each number from [0, n) a big 64-bit random number. Store this array as R[x]. The XOR of a sequence of integers is the XOR of the odd-frequent numbers. Then, if we take the XOR of R[A[i]] for all A[i] in the range [0, v] and i in the range [l, r], we get the XOR hash of all the odd-frequent numbers ≤ v in the subarray A[l..r]. 2 Then, we just need to find the minimum v for this hash to be non-zero (We consider the collision probability to be negligible). Easy, right? 6 Step E: Square Root Decomposition Now, XOR hashing on its own doesn’t provide a time complexity improvement. But, we can combine it with Sqrt decomposition to completely eliminate the O(nq/w) part. First, we decompose the bitset to pn/w parts. Each part now contains√nw bits. Let V LB = √nw. We construct an additional array XORHASH[i][j] of dimensions [n, pn/w]. This will keep the 2-dimensional cumulative XOR hash of all the numbers in the subarray A[0..i] up to (j + 1) · V LB − 1. We can easily construct this array in O(npn/w) time. Then, if we wanted to check whether v (see Part D) is in the range [0; j ∗ V LB), we can just check if XORHASH[r][j −1] XOR XORHASH[l −1][j −1] is zero or not. After constraining v to a block of size V LB, we can limit the ”Find LSB” operation to only work with pn/w numbers. We still do the re-flipping phase like before. The space complexity is not changed. The time complexity is now O((n + q)pn/w). 7 Extra talk

    1. How can we eliminate reflipping? Create a new tmp bitset that have only elements of 2 sides that were inside v’s block. Then, we wouldn’t need to reflip. Instead, we can erase the block of size V LB in the tmp bitset.
    2. Are we FindLSB bottlenecked? In the sqrt decomp solution, probably no. In the bitset solution, a thousand time yes.
    3. What if, the problem wasn’t actually interactive? We can use Mo’s algorithm here. It provides a simple O(n√q + qpn/w) solution that is memory-optimal, i.e. O(n + q). 3

  • 2
    minhlnstmk  đã bình luận lúc 8, Tháng 7, 2026, 4:59

    Gọi ~p~ là mảng cộng dồn của ~a~.

    Để một đoạn ~[l, r]~ thỏa mãn, với mọi ~i \in [l, r]~ cần có ~p_{l - 1} \le p_i~.

    Với mỗi vị trí bắt đầu ~l~, ta cần tìm một vị trí kết thúc ~r~ lớn nhất sao cho ~[l, r]~ là một đoạn thỏa mãn yêu cầu đề bài. Gọi ~x~ là số nhỏ nhất thỏa mãn ~l \le x~ và ~p_x < p_{l - 1}~, dễ dàng thấy được vị trí kết thúc ~r~ lớn nhất là ~x - 1~, rồi cập nhật kết quả

    res = max(res, r - l + 1);
    

    Để tìm vị trí ~x~ nhỏ nhất thỏa mãn ~l \le x~ và ~p_x < p_{l - 1}~, sử dụng cấu trúc dữ liệu Monotonic Stack tương tự như bài này: lmh_lineup.