Use this link in case of broken PDF: https://hackmd.io/@spyofgame/AISearch
image
1. Descriptions
image
Actually, I did implement 27 different search algorithms.
I remove most of them to ensure the PDF is no more than 15Mb
Other than 7 required algorithms, I only keep Dijkstra to ensure correctness.
Hoang Anh Vo changed a year agoView mode Like Bookmark
link
Tags: Trial Division, Sundaram Sieve, Erastothenes Sieve, Atkin Sieve, Wheel Sieve, Bitwise Sieve, Segment Bitwise Sieve, Segment Sieve, Sieve
1. Brute-forces
Với mọi số nguyên $x$ trong đoạn $[0, n]$. Ta đếm số ước $d$ của $x$ trong đoạn $[0, x]$. Nếu $x$ có đúng $2$ ước thì $x$ là số nguyên tố
Time: $O(1 + 2 + \dots + n) = O(n^2)$
Space: $O(n)$
Algo: Brute-forces Sieve
SPyofgame changed 4 years agoView mode Like 3 Bookmark
tags: Hash, Matrix Hash, Multi Hash, Multi Matrix Hash, DP, Template, Partial Sum, DP
link
Tags: Matrix Hash, Multi Matrix Hash, Partial Sum, DP
Mục tiêu
Phiên bản static offline
Offset $1, 1$ - Ô đầu ở $(1, 1)$ kết thúc $(n, m)$
SPyofgame changed 4 years agoView mode Like 1 Bookmark
https://oj.vnoi.info/problem/bedao_m06_hard
Tags: Math, Binary Search, Data Structure, Online Query
Giải truy vấn 1:
Nếu truy vấn 1 không đủ nhanh thì TLE trước cả truy vấn 2 nên mình cần tìm một cấu trúc dữ liệu đủ nhanh
Ta có thể sử dụng các cấu trúc dữ liệu cây để tìm, chèn, xóa trong $O(\log\ n)$ hoặc nhanh hơn, ví dụ như trong C++ có std::set, std::map
Giải truy vấn 2:
SPyofgame changed 4 years agoView mode Like 2 Bookmark
https://oj.vnoi.info/problem/bedao_m06_yugioh
Hướng dẫn
Để kiểm tra một số bất kì có phải là số nguyên tố không quá $X$ hay không, ta chỉ cần sàng các số nguyên tố trong đoạn $[1, X]$ và có thể kiểm tra trong $O(1)$
Yêu cầu đề bài là chuyển các số $a_i$ nguyên tố $\leq X$ lại gần nhau
$\Rightarrow$ Có thể coi mảng $a[]$ như $n$ số nhị phân, với giá trị $1$ khi $a_i$ nguyên tố $\leq X$ và giá trị $0$ với các số còn lại.
$\Rightarrow$ Gọi $k$ là số số $1$ trong dãy. Lúc này ta chỉ cần đưa $k$ số $1$ kề nhau với ít lần swap nhất
SPyofgame changed 4 years agoView mode Like 2 Bookmark
https://oj.vnoi.info/problem/olp_ct20_route
Credit: @darkkcyan
Hướng dẫn tính giá trị
Ta định nghĩa
$P$ là giá trị tích các số trên đường đi hiện tại
$V$ là số số $0$ ở cuối $P$
$c_x$ là số thừa số $x$ trong $P$
SPyofgame changed 4 years agoView mode Like 3 Bookmark
https://oj.vnoi.info/problem/fc130_suraj
Hướng dẫn
Vì chi phí càng tăng khi càng mở nhiều tab cho một cửa sổ, nên ta ưu tiên mở các cửa sổ có ít tab nhất trước.
Để đẩy nhanh tiến độ, ta có thể tìm số $x$ lớn nhất mà $v = k \times \frac{x(x+1)}{2} \leq m$ sau đó ta mở $k$ cửa sổ với $x$ tab đầu tiên.
Phần thừa còn lại ta sẽ dành để mở được $\lfloor \frac{m - v}{x + 1} \rfloor$ cửa sổ tại tab thứ $x + 1$
Dễ thấy $f(x) = k \times \frac{x(x+1)}{2}$ là hàm tăng đơn điệu nên ta có thể chặt nhị phân tìm $x$ lớn nhất thỏa $f(x) \leq m$
SPyofgame changed 4 years agoView mode Like 4 Bookmark
https://oj.vnoi.info/problem/fc130_place
Gợi ý:
Khoảng cách lớn nhất giữa $2$ số nguyên tố liên tiếp không quá $10^9$ là $g = 282$
Hướng dẫn
Xét tập $S = {2, 3, \dots, B}$ và $T = {B + 1, B + 2, \dots, A}$$
Mình cần tìm số $x \in T$ lớn nhất sao cho $\nexists\ d \in S$ mà $d\ |\ x$
SPyofgame changed 4 years agoView mode Like 3 Bookmark
Link
Hướng dẫn
Vào thời điểm $x$, người thứ $k$ làm được $\left \lfloor \frac{x}{T_k} \right \rfloor$ hồ sơ. Nên ta có tổng cộng $f(x) = \overset{n}{\underset{k = 1}{\Large \Sigma}} \left \lfloor \frac{x}{T_k} \right \rfloor$ hồ sơ được làm
Nhiệm vụ của ta là tìm số $x$ nhỏ nhất thỏa $f(x) \geq m$
Nhận thấy vì $T_k > 0\ \forall\ k = 1 \dots n$ nên ta có $f(x) \leq f(x + 1)\ \forall\ x \geq 0$. Hay dãy $f(x)$ tăng đơn điệu.
Nếu $f(p) \geq m$ thì $f(q) \geq m\ \forall\ q \geq p$
SPyofgame changed 4 years agoView mode Like 2 Bookmark
Link
Hướng dẫn
Xét tại vị trí $i$, gọi mực nước dâng tới $b_i$
Nếu như không tồn tại $j < i$ để $a_j > a_i$ hoặc không tồn tại $k > i$ để $a_k > a_i$, thì nước sẽ không đọng lại, nên $b_i$
Ngược lại mực nước không được dâng quá $L = max(a_1, a_2, \dots, a_i)$ và cũng không quá $R = max(a_i, \dots, a_{n-1}, a_n)$ $a_i$ nên $b_i = min(L, R)$
Xét tại vị trí $i$, mình nâng cột lên vị trí $X$, hỏi phần nước còn lại là bao nhiêu
SPyofgame changed 4 years agoView mode Like 3 Bookmark
https://oj.vnoi.info/problem/olp_kc20_fraction
Co-author: Nguyễn Nam
Bài toán con
Xét bài toán kiểm tra xem phân số $\frac{X}{Y}$ có phải là số thập phân tuần hoàn vô hạn hay không
Xét $\frac{A}{B} = \frac{X \div gcd(X, Y)}{Y \div gcd(X, Y)}$ là phân số tối giản của $\frac{X}{Y}$.
SPyofgame changed 4 years agoView mode Like 3 Bookmark
URL
Hướng dẫn
Với mỗi vị trí $[L]$ tìm vị trí $[R]$ nhỏ nhất thỏa mãn số lượng kí tự 'A', 'V' và 'C' trong đoạn $[L, R]$ đều không ít hơn $k$
Vì lúc này $[L, R]$ là một đoạn cố định tương tự như mình xóa $[1, L)$ và $(R, N]$ mà không mất chi phí, nên giờ mình sẽ xóa phần bên trong, sao cho số lượng 'A', 'V' và 'C' đều có đúng $k$.
Gọi $C(L, R, X)$ là số lượng kí tự có giá trị $X$ trên đoạn $[L, R]$. Chi phí sửa đổi của đoạn $[L, R]$ là $(C(L, R,$ 'A' $) + C(L, R,$ 'C'$) + C(L, R,$ 'V'$) - 3k)$.
Vậy bài này có độ phức tạp là $O(n)$ thời gian và bộ nhớ
SPyofgame changed 4 years agoView mode Like 2 Bookmark