# Solution Chung kết OLP MT & TN 2023 (Không chuyên & Chuyên tin) ## TAB Cơ bản: mảng, for, if Lưu ý: Nếu cộng ba số $10^9$ lại thì có khả năng tràn số (kiểu `int` chỉ chứa từ $-2^{31} .. 2^{31} - 1)$, tức là tầm 2 tỉ 140 triệu blabla ## BONUS ### Trâu Chọn một item muốn thay ra (`for`), và một item muốn thêm vào. $O(n^2)$ ### Full Giả sử bỏ đi món $i$. Biết được ngay còn dư bao nhiêu chỗ trống. Vấn đề đặt ra: Thêm vào item có weight $\le S'$ có value lớn nhất có thể. $\rightarrow$ Sort tăng theo $w$. Lúc này những món có $w \le S'$ nằm ở đầu tiên. Ta cần: - Tính trước $f_i$ là $\max s$ của $i$ món đầu tiên sau sort - TKNP để biết là lấy ra bao nhiêu món? (tìm vị trí cuối cùng, mà $\le$ giá trị cho trước, bài `maxge`) ## DIGITSUM ### Trâu Duyệt mọi số từ $1$ tới $n$. ĐPT $O(n \log n)$ ### $n = 10^x$ How to? ### $n \le 10^{12}$ #### $k$ lớn - chạy bộ(i) $O(n \div k \cdot \log)$ #### QHĐ chữ số Ví dụ: Đếm số lượng số bé hơn $\le n$ thỏa mãn tính chất abcxyz. Giả sử $n$ có $t$ chữ số. Giả sử số ta đang quan tâm có dạng `????? (t)` Đặt $f(i,0/1, ...)$: đã điền vào $i$ chữ số đầu tiên, số đã tạo bé hơn hẳn $n$ hay vẫn còn bằng $n$?. Trong bài này $(...)$ sẽ lưu số dư cho $k$. Nếu đặt $f$ là tổng, cần thêm mảng $g$ đếm số lượng số thỏa mãn. $O(\log \cdot k)$ ## NUMRING Bài toán trên vòng tròn $\rightarrow$ gấp đôi mảng $a$. Ta có $a_1, a_2, a_3, ..., a_{n-1}, a_n; \,\,\, a_1, a_2, a_3, ..., a_{n-1}, a_n$ ### Backtrack Chọn ra $3k$ vị trí bất kì trong $n$. Đệ quy $2^n$ ### $k = 1$ Chọn hai vị trí đầu tiên, ở giữa bất kì ($i < j$). Cần tìm vị trí $k \,\,(k < i+n)$ mà $a_i - a_j + a_k$ đạt max. Tìm max đoạn liên tiếp --> Tiền xử lý $f(l,r)$ là max của $a$ từ $l$ tới $r$. $f(l,r) = \max \{f(l,r-1), a_r\}$ ### $n \le 200$ Chọn ra $s$ làm vị trí đầu tiên. (`for` $O(n)$) Đặt $f(i,c,t)$: Giả sử chọn các phần tử trước vị trí $i$, đã chọn được $c$ bộ ($3\times c$ số), đang chọn cho số thứ $t$ của bộ số thứ $c+1$. Công thức: Từ vị trí $i$, xét vị trí $i+1$, có hai t/hợp: - Bỏ qua - Thêm $a_{i+1}$ vào bộ số hiện tại (hoặc tạo bộ mới). ĐPT: $O(n^3)$ ### $n \le 2000$ #### Sol Thay vì xét mảng trên vòng tròn, ta chỉ cần giải quyết bài toán với $a$ từ $1$ tới $n$ **nhưng** quy luật cộng được xoay vòng tròn: - Cộng 1, trừ 2, cộng 3 (theo đề) - Trừ 1, cộng 2, cộng 3 - Cộng 1, cộng 2, trừ 3 Giải bằng QHĐ $O(n^2)$ như trên #### Deleted Chưa test Nếu biết được $a_i$ và $a_k$ là số đầu & số cuối của bộ ($i < k$) thì chắc chắn có số ở giữa là $a_j = \min a[i+1..k-1]$ Bài toán quy về: Chọn các đoạn con không giao nhau, có tổng lớn nhất, và "nằm gọn" trong $n$ phần tử. Vậy sẽ có $O(n^2)$ đoạn cần quan tâm. Vẫn xét các $s$ khác nhau. Tuy nhiên, không cần tính lại toàn bộ mảng QHĐ $f(i,c)$, mà chỉ cần thay đổi những chỗ cần thay đổi. Tức là: Giả sử ta từ $s$ sang $s+1$, cần làm 2 việc: - Xét thêm những đoạn kết thúc tại $s+1+n\,\,\,-1$ - Xóa đi những đoạn bắt đầu tại $s$. Dùng `multiset`?