IOI 2002: Nhận xét - Hướng dẫn - Lời giải Strict Standards: Non-static method HTML_content::EditIcon() should not be called statically in /home/vmapps4u/public_html/vnoi_v0/components/com_content/content.html.php on line 632 |
Người viết: Thầy Bùi Việt Hà | |
21/04/2008 | |
Strict Standards: Non-static method HTML_content::TOC() should not be called statically in /home/vmapps4u/public_html/vnoi_v0/components/com_content/content.html.php on line 526 IOI 2002: Nhận xét -
Hướng dẫn - Lời giải
Bùi Việt Hà
(Dựa theo Soo-Hwan Kim, Greg Galperin − tác giả của
đề bài được lựa chọn tại IOI 2002
với vài nhận xét bổ xung của người biên
soạn bài viết này).
(1) Thuật toán tự nhiên
Trước tiên ta có nhận xét rằng nếu biết
trước hai vị trí cây đổ trên lưới, ta có
thể xác định được vector hướng
của bước nhảy của ếch và do đó sẽ
xác định được đường thẳng này
có tạo thành một đường ếch hay không
(xem hình 1).
Thuật toán kiểm tra này sẽ có độ phức
tạp là O(N). Thật vậy giả sử pA, pB
là hai điểm đã cho và V(pA,pB) là vector
tạo bởi hai điểm trên, với mỗi
điểm P thuộc tập các vị trí cây lúa đổ
ta chỉ việc kiểm tra xem vector V(P,pB) có song
song và bằng vector V(pA,pB) hay không mà thôi.
Như vậy với thuật toán tự nhiên này chúng ta
duyệt tìm trên tất cả các cặp điểm của
toàn bộ N vị trí đã cho của cây đổ với
độ phức tạp là O(N2) và sử dụng
cách làm trên để tìm ra lời giải bài toán. Tổng
hợp cách giải này yêu cầu thời gian tính toán là O(N3).
(2) Thuật giải ″tập con thẳng hàng
với khoảng cách bằng nhau″.
ý tưởng của thuật giải này rất
đơn giản: chúng ta tìm cách so sánh các bộ 3 điểm
thẳng hàng và đều nhau (pA,pB,pC).
Các bộ 3 điểm ″thẳng-đều″ này
chính là cái lõi của các đường ếch mà chúng ta
cần tìm (xem hình 2).
Ta xây dựng một Đồ thị vô
hướng G với các đỉnh là cặp
điểm (pX,pY) từ tập các vị
trí cây đổ (đồ thị sẽ có O(N2)
đỉnh) như sau: với mỗi bộ 3 điểm
thẳng đều (pA,pB,pC) ta
thiết lập hai đỉnh (pA,pB), (pB,pC)
cho đồ thị G và một cạnh nối từ
đỉnh (pA,pB) với đỉnh (pB,pC).
Như vậy mỗi cạnh nối của đồ
thị sẽ phải tương ứng với một
đường ếch (bởi vì đã có tối thiểu
3 vị trí!). Như vậy các thành phần liên thông của
đồ thị này chính là các đường ếch
cực đại và vấn đề còn lại là tìm ra
số phần tử của thành phần liên thông lớn
nhất của đồ thị mà thôi. Nhận xét rằng
mỗi đỉnh của đồ thị này chỉ có
thể nối tối đa với 2 cạnh, do đó
số cạnh của đồ thị này cũng là
đại lượng O(N2). Vậy thuật toán
tìm miền liên thông cực đại cũng phải là O(N2).
Vấn đề còn lại bây giờ là liệu có
thể tìm kiếm nhanh các bộ 3 điểm thẳng
đều (pA,pB,pC) được
hay không để khởi tạo đồ thị G? Nếu
việc tìm này không nhanh thì ý tưởng thuật toán sẽ
thất bại.
Cách thứ nhất chúng ta sử dụng thêm một
mảng 2 chiều kích thước NxN để lưu trữ
dữ liệu các vị trí cây đổ: giá trị của
mảng M(x,y) = k > 0 nếu và chỉ nếu (x,y) là
toạ độ của cây đổ thứ k (như
vậy mảng M sẽ là mảng hầu như bằng 0).
Với mỗi cặp (pA,pB) giá trị
của pC chỉ phải tìm tại đúng 1 vị
trí có thể trong mảng M, do đó việc tìm các bộ 3
điểm thẳng đều theo cách trên chỉ tốn
O(N2) thời gian (duyệt theo pA và pB).
Tuy nhiên phương án trên sẽ cần bộ nhớ
vượt quá N2 và theo đầu bài thì có thể
lên tới 5000x5000, sẽ vượt quá 64M là yêu cầu
của đề bài. Ta cần xử lý mẹo tại
đây: do mảng M bao gồm hầu hết là 0 nên ta có
thể sử dụng kỹ thuật băm để
lưu trữ mảng này. Tuy nhiên cách làm này sẽ không qua
được các Test ″xấu″.
Cách thứ hai, ta tiến hành sắp xếp toàn bộ các
vị trí cây đổ theo một thứ tự nào đó
(chẳng hạn sắp xếp theo thứ tự tăng
dần của tọa độ hàng, sau đó tọa
độ cột). Các bộ 3 điểm thẳng
đều sẽ được tìm kiếm bằng cách
duyệt theo các bộ điểm pA,pB,pC
với điều kiện pA < p B < p C.
Cách làm này trên thực tế sẽ có thời gian tính toán
rất nhanh, gần như tuyến tính với O(N2)
và không cần sử dụng thêm bộ nhớ.
Bài 2: UTOPIA
(Dựa theo Jung-Hum Park và Ian Munro − các tác giả
của đề bài được lựa chọn tại
IOI 2002 với vài nhận xét bổ xung của người
biên soạn bài viết này).
Trước tiên hãy chứng minh rằng bài toán trên
(với mảng 2 chiều) sẽ suy được dễ
dàng từ bài toán 1 chiều sau đây:
Bài toán chọn dãy 1 chiều:
Cho trước N số nguyên dương khác nhau và N
dấu (là + hoặc -). Khi đó tồn tại một hoán
vị của N số trên và sau khi đặt các dấu vào
trước các số này, ta thu được dãy {Xi} sao cho
với mọi k thì
Chứng minh từ bài toán 1 chiều trên suy
được bài toán UTOPIA của chúng ta. Thật vậy
sau khi nhập vào 2N mã số nguyên dương khác nhau, ta tách
tập này thành 2 phần bằng nhau (một cách bất
kỳ!), mỗi tập con chứa đúng N số. Gọi
các tập con này là A và B. Sau khi đã nhập N số
hiệu miền ta tách mỗi miền này theo hai giá trị
dấu (dX, dY) theo sơ đồ dấu
của đề bài (hình 3).
Như vậy ta thu được hai dãy dấu bao
gồm N phần tử, ứng với các giá trị
dấu của dãy miền nhập vào. Gọi hai tập
dấu này là SX, SY.
Bây giờ ta áp dụng bài toán chọn dãy 1 chiều trên
cho các tập dãy và dấu độc lập, lần
lượt áp dụng cho (A, SX) và (B, SY). Để có
được đáp số ta chỉ việc ghép các hai dãy
số tìm được theo từng cặp giá trị
lần lượt.
Lời giải của bài toán chọn dãy 1 chiều
Ta sẽ chỉ ra một cách xây dựng lần
lượt dãy số {Xi} thỏa mãn điều kiện
đầu bài.
Trước tiên ta có định nghĩa sau: Dãy số
X={Xa, Xa+1,...., Xb} với a<=b
được gọi là dãy đổi dấu đơn
điệu nếu thỏa mãn các điều kiện
sau:
(i) dãy là đơn điệu tăng nếu so sánh giá
trị tuyệt đối:
|Xa| < |Xa+1| <..... < |Xb|
(ii) các phần tử của dãy đổi dấu
tuần tự: Xi luôn khác dấu với Xi+1.
Dễ thấy rằng nếu X={Xa, Xa+1,
...., Xb} là một dãy đổi dấu đơn
điệu thì các dãy con dạng X′ = {Xa, Xa+1,....,
Xk} và X″={Xk,Xk+1,....,Xb} cũng
là đổi dấu đơn điệu.
Bài toán suy từ 2 mệnh đề sau:
Mệnh đề 1: Giả sử X={Xa, Xa+1,....,
Xb} là một dãy đổi dấu đơn
điệu. Khi đó Xb sẽ cùng dấu với tổng
Xa + Xa+1 +.... + Xb.
Chứng minh: Không mất tổng quát giả sử
Xb >0 (dương). Ta xét 2 trường hợp:
Trường hợp 1: dãy X có số chẵn phần
tử. Khi đó theo định nghĩa ta sẽ có Xa+1,
Xa+3,...., Xb là dương. Các tổng con Xa +
Xa+1, Xa+2 + Xa+3, ...., Xb-1+Xb
sẽ là dương. Từ đó suy ra tổng Xa +
Xa+1 +.... + Xb cũng dương.
Trường hợp 2: dãy X có lẻ các phần tử. Khi
đó Xa, Xa+2,...., Xb-2, Xb sẽ
là dương. Các tổng con Xa, Xa+1 + Xa+2,....,
Xb-1 + Xb cũng sẽ dương, vậy
suy ra tổng Xa + Xa+1 + .... + Xb cũng
dương. Mệnh đề 1 được chứng
minh.
Giả sử ta có dãy số X={Xa, Xa+1,
...., Xb} và dãy các dấu S={Sa, Sa+1,...,
Sb}. Ta nói dãy X tương thích với dãy
dấu S nếu các tổng con Xa + Xa+1 +....
+ Xk sẽ có dấu giống Sk với
mọi k.
Mệnh đề 2: Giả sử X = {Xa, Xa+1,....,
Xb} là một dãy đổi dấu đơn
điệu và S = {Sa, Sa+1,..., Sb} là một
dãy các dấu. Giả sử Xb cùng dấu với Sb. Khi
đó tồn tại một hoán vị của X là dãy
X′={X′a, X′a+1,...., X′b}
tương thích với S.
Chứng minh: Ta chứng minh mệnh đề 2
bằng qui nạp theo k là số phần tử của X.
Với k=1 thì không cần chứng minh gì cả. Giả
sử bây giờ k≥2.
Đặt S1 = S - {Sb}, vậy S1
= {Sa, Sa+1,..., Sb-1}. Ta xét 2
trường hợp sau:
Trường hợp 1: Xb cùng dấu với Sb-1.
Đặt X1 = X-{Xa}. Vậy X1</SUB>={Xa+1,Xa+2,....,Xb}.
Đặt T=Xa.
Trường hợp 2: Xb khác dấu với Sb-1 hay Xb-1 cùng
dấu với Sb-1. Đặt X1 =X-{Xb}. Vậy
X1</SUB>={Xa,Xa+1,...,Xb-1}. Đặt T=Xb.
Trong cả hai trường hợp dễ thấy X1 là dãy
đổi dấu đơn điệu và có phần
tử cuối cùng cùng dấu với Sb-1. áp dụng qui
nạp suy ra tồn tại một hoán vị X′1 của
X1 là tương thích với S1. Đặt X′={X′1,T},
khi đó X′ là hoán vị của X có tổng các phần
tử cùng dấu với Sb (theo mệnh đề 1) và có
dãy con X′1 tương thích với S1, do đó sẽ
tương thích với S. Mệnh đề
được chứng minh.
Chú ý: từ cách chứng minh mệnh đề trên
suy ra thuật giải tuyến tính để tìm ra hoán
vị X′. Ví dụ với X={-3,+5,-7,+9} và S={+,-,-,+} ta có:
- Tách phần tử:
S1 = {+,-,-}, khác dấu, X1 = {-3,+5,-7}
S2 = {+,-}, cùng dấu, X2 = {+5,-7}
S3 = {+}, khác dấu, X3 = {+5}
- Ghép phần tử:
X′1 = {+5}
X′2 = {+5,-7}
X′3 = {+5,-7,-3}
X′4 = {+5,-7,-3,+9}
Quay lại lời giải bài toán chọn dãy 1 chiều:
giả sử dãy dấu ban đầu là S1,S2,...,SN. Ta
sắp xếp dãy N mã số nguyên dương ban đầu
theo thứ tự tăng dần và đặt các dấu +,
- trước chúng sao cho dãy này trở thành một dãy
đổi dấu đơn điệu và phần tử
cuối cùng cùng dấu với SN. Theo mệnh đề 2
tồn tại một hoán vị của dãy trên là
tương thích với dãy dấu S và đó chính là dãy
số cần tìm.
Bài 3: XOR
(Dựa theo Jung-Gun Lim và
Trước tiên chúng ta cần định nghĩa và phân biệt
khái niệm điểm lưới và ô
lưới. Điểm lưới là điểm
giao của các đường lưới. Ô lưới là
vùng diện tích giới hạn bởi các đường
lưới. Như vậy mỗi ô lưới sẽ
bị chặn bởi 4 điểm lưới (xem hình 4).
Với mỗi điểm lưới p, ta định
nghĩa giá trị ic(p) (ic-value) như sau: ic(p)=1 khi và
chỉ khi điểm p tiếp giáp với một số
lẻ ô lưới màu đen, ngược lại ta
định nghĩa ic(p)=0. Nếu ic(p)=1 ta nói p là điểm
góc (imagecorner). ý nghĩa của khái niệm này là
dễ hiểu: điểm lưới p là điểm góc
(ic=1) nếu trên màn hình đen trắng, p nằm tại
một ″góc″ của hình ảnh (xem hình 5).
Các mệnh đề sau là quan trọng cho việc tìm
thuật giải của bài toán.
Mệnh đề 1: Hình ảnh là toàn trắng khi và
chỉ khi không có điểm góc.
Mệnh đề này là hiển nhiên.
Như vậy để tìm lời giải bài toán chúng ta
đi ngược từ hình ảnh đã cho. Nhiệm vụ
của ta là tìm một dãy các biến đổi XOR
để cuối cùng thu được hình ảnh không có
điểm góc nào cả.
Mệnh đề 2: Giả sử toán tử
XOR(L,R,T,B) được thực hiện và Q là hình chữ nhật
xác định vùng tác động của toán tử này.
Gọi a,b,c,d là các điểm lưới tại vị trí
góc trái trên, trái dưới, phải trên, phải
dưới của Q. Khi đó toán tử XOR(L,R,T,B) sẽ
thay đổi giá trị ic của các điểm
lưới a,b,c,d và không làm thay đổi giá trị này
của tất cả các điểm lưới còn lại.
Chứng minh: Tước tiên xét ic của các
điểm a,b,c,d. Dễ thấy rằng với tác
động của XOR tương ứng, chỉ có đúng
một ô lưới kề với các điểm a,b,c,d là thay
đổi màu, do đó giá trị ic của các điểm
này sẽ thay đổi. Bây giờ ta xét các điểm còn
lại:
- Các điểm bên ngoài Q: do không bị tác động
bới toán tử XOR, ic của các điểm này không thay
đổi.
- Các điểm nằm trên cạnh (và bên trong cạnh)
của Q. Các điểm này kề với 2 ô lưới
của Q, do đó sẽ có 2 ô kề bị đổi màu và
do đó ic không thay đổi.
- Các điểm nằm bên trong Q. Các điểm này có 4 ô
kề nằm trong Q bị thay đổi màu, do đó ic
cũng không thay đổi. Mệnh đề
được chứng minh.
Kết quả của mệnh đề 2 chỉ ra
rằng mỗi lần áp dụng toán tử XOR thì số
lượng điểm góc của hình ảnh sẽ
giảm tối đa là 4.
Mệnh đề 3: Nếu hình ảnh không là toàn
trắng thì sẽ tồn tại 3 điểm góc tạo
thành 3 đỉnh của một hình chữ nhật trên
lưới.
Chứng minh: Cách tìm 3 điểm góc như sau. Chúng
ta xuất phát từ một ô lưới đen ở hàng
trên cùng và tận cùng bên phải của hàng này. Đó là
điểm góc thứ nhất. Xuất phát từ
điểm này chúng ta đi xuống và đi sang trái,
chắc chắn sẽ tìm được thêm 2 điểm
góc nữa và 3 điểm này tạo thành 3 đỉnh
của một hình chữ nhật.
Mệnh đề 4: Từ một hình ảnh không
toàn trắng ban đầu bao giờ cũng tìm được
một toán tử XOR sao cho sau khi áp dụng cho hình này,
số điểm góc sẽ giảm đi 2 hoặc 4.
Thật vậy theo mệnh đề 3 ta luôn tìm
được một hình chữ nhật với tối
thiểu 3 điểm góc tạo thành hình chữ nhật. áp
dụng toán tử XOR với hình chữ nhật này. Theo
mệnh đề 2 thì sau toán tử này chỉ có 3
điểm góc trên và đỉnh (điểm lưới) còn
lại là bị thay đổi giá trị ic. Trường
hợp cả 4 đỉnh là điểm góc thì số
điểm góc giảm đi 4, trường hợp chỉ
có 3 điểm góc thì số điểm góc sẽ bị
giảm 3 nhưng tăng 1 vì đỉnh còn lại sẽ
trở thành điểm góc và do đó tổng thể số
điểm góc giảm 2. Mệnh đề được
chứng minh.
Từ kết quả của mệnh đề 4 chúng ta
tìm được một thuật giải đơn
giản cho bài toán XOR như sau.
Thuật toán 2-tối ưu cho bài toán XOR:
Liên tục áp dụng các biến đổi XOR với
hình ban đầu sao cho sau mỗi bước số điểm
góc giảm 2 hoặc 4. Sau một số hữu hạn
bước số điểm góc trở về 0 và ta thu được
hình ảnh toàn trắng. Thuật toán này đảm bảo
rằng số lần gọi XOR sẽ chắc chắn
nhỏ hơn 2 lần số lần gọi XOR của
phương án tối ưu và do đó thuật toán
được gọi là 2-tối ưu. Lập kế
hoạch theo khối
Lời giải IOI 2002: |