IOI 2008 - Ngày 1

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 IOI 2008 - Type Printer 100 (p) 1.0s 64M
2 IOI 2008 - Islands 100 (p) 2.0s 128M
3 IOI 2008 - Fish 100 (p) 3.0s 64M

1. IOI 2008 - Type Printer

Điểm: 100 (p) Thời gian: 1.0s Bộ nhớ: 64M Input: bàn phím Output: màn hình

Bạn cần in \(N\) từ bằng một chiếc máy in chữ rời. Đây là loại máy in cổ, trong đó người dùng xếp các miếng kim loại nhỏ, mỗi miếng mang một chữ cái, để tạo thành từ. Sau đó, một tờ giấy được ép lên các miếng kim loại để in từ đó. Chiếc máy của bạn cho phép thực hiện ba thao tác:

  • Thêm một chữ cái vào cuối từ hiện đang có trong máy.
  • Xóa chữ cái cuối cùng của từ hiện đang có trong máy. Chỉ được thực hiện thao tác này khi trong máy có ít nhất một chữ cái.
  • In từ hiện đang có trong máy.

Ban đầu máy trống, không chứa miếng kim loại mang chữ cái nào. Khi in xong, bạn được phép để lại một số chữ cái trong máy. Bạn cũng có thể in các từ theo thứ tự tùy ý.

Mỗi thao tác đều tốn thời gian, nên bạn muốn thực hiện ít thao tác nhất có thể. Hãy tìm số thao tác ít nhất để in tất cả \(N\) từ đã cho, đồng thời đưa ra một dãy thao tác đạt được số lượng đó.

Dữ liệu vào

Đọc từ đầu vào chuẩn:

  • Dòng đầu tiên chứa số nguyên \(N\), là số từ cần in.
  • Mỗi dòng trong \(N\) dòng tiếp theo chứa một từ. Mỗi từ chỉ gồm các chữ cái tiếng Anh viết thường từ a đến z và có độ dài từ \(1\) đến \(20\), kể cả hai đầu mút. Các từ đôi một khác nhau.

Dữ liệu ra

Ghi ra đầu ra chuẩn:

  • Dòng đầu tiên chứa số nguyên \(M\), là số thao tác ít nhất cần thực hiện để in \(N\) từ.
  • Mỗi dòng trong \(M\) dòng tiếp theo chứa đúng một ký tự mô tả một thao tác, theo thứ tự thực hiện:
    • Thêm một chữ cái: ghi chính chữ cái đó ở dạng viết thường.
    • Xóa chữ cái cuối cùng: ghi ký tự - (dấu trừ, mã ASCII \(45\)).
    • In từ hiện tại: ghi ký tự P (chữ P viết hoa).

Ràng buộc

  • \(1 \le N \le 25\,000\).
  • Độ dài mỗi từ nằm trong đoạn \([1,20]\).
  • Các từ đôi một khác nhau và chỉ chứa chữ cái tiếng Anh viết thường.

Chấm điểm trên hệ thống

Lưu ý: Cách chia nhóm và tính điểm dưới đây là bản điều chỉnh để luyện tập trên hệ thống, không khẳng định tương đương cách chấm tại IOI gốc.

Mỗi nhóm được chấm độc lập: chỉ nhận điểm của nhóm khi vượt qua tất cả bộ kiểm thử trong nhóm; nếu có bộ kiểm thử không đạt thì nhóm nhận 0 điểm. Tổng điểm tối đa là 100.

Nhãn nhóm là phần số trong tên tệp dữ liệu gốc. Tất cả tệp cùng nhãn, kể cả các hậu tố chữ và pf, đều thuộc nhóm đó.

Nhãn nhóm Điểm Tệp dữ liệu vào gốc
1 10 typ/typ1a.in, typ/typ1b.in
2 10 typ/typ2apf.in, typ/typ2bpf.in
3 10 typ/typ3a.in, typ/typ3b.in
4 10 typ/typ4a.in, typ/typ4b.in
5 10 typ/typ5a.in, typ/typ5b.in
6 10 typ/typ6apf.in, typ/typ6bpf.in
7 10 typ/typ7a.in, typ/typ7b.in
8 10 typ/typ8apf.in, typ/typ8bpf.in
9 10 typ/typ9a.in, typ/typ9b.in, typ/typ9c.in
10 10 typ/typ10a.in, typ/typ10b.in, typ/typ10c.in, typ/typ10d.in

Các ví dụ trong đề không tính điểm. Các tệp ví dụ gốc có nhãn 0 được giữ lại riêng và có trọng số 0.

Tệp ví dụ gốc: typ/typ0.in.

Ví dụ

Ví dụ 1

Input
3
print
the
poem
Output
20
t
h
e
P
-
-
-
p
o
e
m
P
-
-
-
r
i
n
t
P

Nguồn

IOI 2008.

2. IOI 2008 - Islands

Điểm: 100 (p) Thời gian: 2.0s Bộ nhớ: 128M Input: bàn phím Output: màn hình

Bạn đang tham quan một công viên có \(N\) hòn đảo. Từ mỗi đảo \(i\), người ta đã xây đúng một cây cầu tới một đảo khác; độ dài của cây cầu đó được ký hiệu là \(L_i\). Như vậy, công viên có tổng cộng \(N\) cây cầu. Mặc dù mỗi cây cầu được xây từ một đảo tới một đảo khác, hiện nay tất cả các cây cầu đều có thể đi theo cả hai chiều. Ngoài ra, giữa mỗi cặp đảo có đúng một tuyến phà đi lại theo cả hai chiều.

Bạn thích đi bộ hơn đi phà, nên muốn tối đa hóa tổng độ dài các cây cầu đã đi qua, đồng thời tuân thủ những quy tắc sau:

  • Bạn có thể bắt đầu chuyến tham quan tại một đảo tùy ý.
  • Bạn không được ghé thăm bất kỳ đảo nào quá một lần.
  • Tại một thời điểm bất kỳ, bạn có thể di chuyển từ đảo hiện tại \(S\) tới một đảo \(D\) chưa từng ghé thăm, bằng một trong hai cách:
    • Đi bộ: chỉ thực hiện được khi có một cây cầu nối hai đảo. Độ dài cây cầu được cộng vào tổng quãng đường đã đi bộ.
    • Đi phà: chỉ được chọn cách này nếu không thể đi từ \(S\) tới \(D\) bằng bất kỳ cách kết hợp nào giữa các cây cầu và những tuyến phà đã sử dụng trước đó. Khi kiểm tra khả năng đi tới \(D\), phải xét mọi đường đi, kể cả những đường đi qua các đảo mà bạn đã ghé thăm.

Bạn không bắt buộc phải ghé thăm tất cả các đảo, và cũng có thể không đi qua được tất cả các cây cầu.

Cho thông tin về \(N\) cây cầu và độ dài của chúng, hãy tính tổng quãng đường đi bộ lớn nhất có thể đạt được khi tuân thủ các quy tắc trên.

Dữ liệu vào

Đọc từ đầu vào chuẩn:

  • Dòng đầu tiên chứa số nguyên \(N\), là số đảo trong công viên. Các đảo được đánh số từ \(1\) đến \(N\).
  • Mỗi dòng trong \(N\) dòng tiếp theo mô tả một cây cầu. Dòng thứ \(i\) trong số này mô tả cây cầu được xây từ đảo \(i\), gồm hai số nguyên cách nhau bởi một dấu cách: số thứ nhất là số hiệu đảo ở đầu cầu còn lại, số thứ hai là độ dài \(L_i\) của cây cầu.

Hai đầu của mỗi cây cầu luôn nằm trên hai đảo khác nhau. Có thể có hai cây cầu khác nhau nối cùng một cặp đảo.

Dữ liệu ra

Ghi ra đầu ra chuẩn một dòng chứa một số nguyên: tổng quãng đường đi bộ lớn nhất có thể đạt được.

Kết quả của một số bộ kiểm thử không biểu diễn được bằng số nguyên \(32\) bit. Để xử lý đầy đủ các trường hợp, có thể cần dùng int64 trong Pascal hoặc long long trong C/C++. Các giá trị đọc từ đầu vào đều nằm trong phạm vi số nguyên \(32\) bit.

Ràng buộc

  • \(2 \le N \le 1\,000\,000\).
  • \(1 \le L_i \le 100\,000\,000\) với mọi \(1 \le i \le N\).
  • Đảo ở đầu cầu còn lại có số hiệu trong đoạn \([1,N]\) và khác \(i\).

Chấm điểm trên hệ thống

Lưu ý: Cách chia nhóm và tính điểm dưới đây là bản điều chỉnh để luyện tập trên hệ thống, không khẳng định tương đương cách chấm tại IOI gốc.

Mỗi nhóm được chấm độc lập: chỉ nhận điểm của nhóm khi vượt qua tất cả bộ kiểm thử trong nhóm; nếu có bộ kiểm thử không đạt thì nhóm nhận 0 điểm. Tổng điểm tối đa là 100.

Nhãn nhóm là phần số trong tên tệp dữ liệu gốc. Tất cả tệp cùng nhãn, kể cả các hậu tố chữ và pf, đều thuộc nhóm đó.

Mỗi nhóm có trọng số 1. Có 19 nhóm tính điểm; điểm cuối cùng bằng \(100 \times W / 19\), với \(W\) là tổng trọng số các nhóm đạt. Mỗi nhóm đạt đóng góp chính xác \(100/19\) điểm; không làm tròn riêng từng nhóm.

Nhãn nhóm Điểm Tệp dữ liệu vào gốc
1 \(100/19\) isl/isl1.in
2 \(100/19\) isl/isl2.in
3 \(100/19\) isl/isl3.in
4 \(100/19\) isl/isl4.in
5 \(100/19\) isl/isl5.in
6 \(100/19\) isl/isl6.in
7 \(100/19\) isl/isl7.in
8 \(100/19\) isl/isl8.in
9 \(100/19\) isl/isl9.in
10 \(100/19\) isl/isl10.in
11 \(100/19\) isl/isl11.in
12 \(100/19\) isl/isl12a.in, isl/isl12b.in
13 \(100/19\) isl/isl13a.in, isl/isl13b.in
14 \(100/19\) isl/isl14a.in, isl/isl14b.in, isl/isl14c.in, isl/isl14d.in
15 \(100/19\) isl/isl15a.in, isl/isl15b.in
16 \(100/19\) isl/isl16a.in, isl/isl16b.in, isl/isl16c.in
17 \(100/19\) isl/isl17a.in, isl/isl17b.in, isl/isl17c.in, isl/isl17d.in
18 \(100/19\) isl/isl18a.in, isl/isl18b.in, isl/isl18c.in, isl/isl18d.in, isl/isl18e.in, isl/isl18f.in, isl/isl18g.in
19 \(100/19\) isl/isl19a.in, isl/isl19b.in, isl/isl19c.in, isl/isl19d.in, isl/isl19e.in, isl/isl19f.in, isl/isl19g.in

Các ví dụ trong đề không tính điểm. Các tệp ví dụ gốc có nhãn 0 được giữ lại riêng và có trọng số 0.

Tệp ví dụ gốc: isl/isl0.in.

Ví dụ

Ví dụ 1

Input
7
3 8
7 2
4 2
1 4
1 9
3 4
2 3
Output
24
Note

\(N=7\) cây cầu trong ví dụ lần lượt nối các cặp đảo \((1,3)\), \((2,7)\), \((3,4)\), \((4,1)\), \((5,1)\), \((6,3)\)\((7,2)\). Chú ý rằng có hai cây cầu khác nhau nối đảo \(2\) với đảo \(7\).

Một cách đạt tổng quãng đường đi bộ lớn nhất là:

  1. Bắt đầu tại đảo \(5\).
  2. Đi qua cây cầu dài \(9\) để tới đảo \(1\).
  3. Đi qua cây cầu dài \(8\) để tới đảo \(3\).
  4. Đi qua cây cầu dài \(4\) để tới đảo \(6\).
  5. Đi phà từ đảo \(6\) tới đảo \(7\).
  6. Đi qua cây cầu dài \(3\) để tới đảo \(2\).

Kết thúc chuyến đi, bạn ở đảo \(2\) và tổng quãng đường đã đi bộ là \(9+8+4+3=24\).

Đảo duy nhất chưa được ghé thăm là đảo \(4\). Tuy nhiên, khi chuyến đi trên kết thúc, bạn không thể ghé thăm đảo này nữa:

  • Không thể đi bộ tới đảo \(4\), vì không có cây cầu nào nối đảo \(2\), nơi bạn đang đứng, với đảo \(4\).
  • Không thể đi phà tới đảo \(4\), vì đảo \(4\) có thể tới được từ đảo \(2\) bằng các cây cầu và tuyến phà đã sử dụng: đi qua cầu \((2,7)\), dùng lại tuyến phà từ đảo \(7\) tới đảo \(6\), rồi đi qua cầu \((6,3)\) và cuối cùng là cầu \((3,4)\).

Nguồn

IOI 2008.

3. IOI 2008 - Fish

Điểm: 100 (p) Thời gian: 3.0s Bộ nhớ: 64M Input: bàn phím Output: màn hình

Scheherazade kể rằng ở một nơi xa xôi giữa sa mạc có một hồ nước. Ban đầu, hồ có \(F\) con cá. Người ta chọn ra \(K\) loại đá quý trong số những loại quý giá nhất trên Trái Đất và cho mỗi con cá nuốt đúng một viên đá quý. Vì \(K\) có thể nhỏ hơn \(F\), hai hoặc nhiều con cá có thể nuốt đá quý cùng loại.

Theo thời gian, một số con cá đã ăn những con cá khác. Một con cá có thể ăn một con khác khi và chỉ khi chiều dài của nó ít nhất gấp đôi chiều dài con kia: cá \(A\) có thể ăn cá \(B\) khi và chỉ khi \(L_A \ge 2L_B\). Không có quy định về thời điểm cá quyết định ăn. Một con cá có thể lần lượt ăn nhiều con cá nhỏ hơn, trong khi một số con có thể không ăn con nào dù có khả năng ăn. Khi một con cá ăn một con nhỏ hơn, chiều dài của nó không thay đổi, nhưng tất cả đá quý trong bụng con cá nhỏ hơn được chuyển nguyên vẹn vào bụng nó.

Scheherazade nói rằng nếu tìm được hồ, bạn sẽ được bắt đúng một con cá và giữ lại tất cả đá quý trong bụng nó. Bạn muốn thử vận may, nhưng trước khi lên đường, bạn muốn biết có bao nhiêu tổ hợp đá quý khác nhau có thể thu được khi bắt một con cá.

Cho chiều dài mỗi con cá và loại đá quý mà nó nuốt ban đầu, hãy tính số tổ hợp đá quý khác nhau có thể xuất hiện trong bụng một con cá bất kỳ, lấy phần dư khi chia cho số nguyên \(M\) đã cho. Một tổ hợp chỉ được xác định bởi số lượng đá quý thuộc từng loại trong \(K\) loại. Thứ tự các viên đá không có ý nghĩa, và hai viên đá cùng loại không thể phân biệt với nhau.

Dữ liệu vào

Đọc từ đầu vào chuẩn:

  • Dòng thứ nhất chứa số nguyên \(F\), là số cá ban đầu trong hồ.
  • Dòng thứ hai chứa số nguyên \(K\), là số loại đá quý. Các loại đá quý được đánh số từ \(1\) đến \(K\).
  • Dòng thứ ba chứa số nguyên \(M\).
  • Mỗi dòng trong \(F\) dòng tiếp theo mô tả một con cá bằng hai số nguyên cách nhau bởi một dấu cách: chiều dài của con cá, tiếp theo là loại đá quý mà nó nuốt ban đầu.

Dữ liệu bảo đảm ban đầu có ít nhất một viên đá quý thuộc mỗi loại trong \(K\) loại.

Dữ liệu ra

Ghi ra đầu ra chuẩn một dòng chứa một số nguyên trong đoạn \([0,M-1]\): phần dư khi chia số tổ hợp đá quý khác nhau có thể thu được cho \(M\).

Giá trị \(M\) chỉ được dùng để đơn giản hóa việc tính toán bằng cách lấy phần dư; nó không ảnh hưởng đến những tổ hợp nào có thể thu được.

Ràng buộc

  • \(1 \le F \le 500\,000\).
  • \(1 \le K \le F\).
  • \(2 \le M \le 30\,000\).
  • \(1 \le L_X \le 1\,000\,000\,000\) với mỗi con cá \(X\).
  • Loại đá quý ban đầu của mỗi con cá thuộc đoạn \([1,K]\), và mỗi loại xuất hiện ít nhất một lần.

Chấm điểm trên hệ thống

Lưu ý: Cách chia nhóm và tính điểm dưới đây là bản điều chỉnh để luyện tập trên hệ thống, không khẳng định tương đương cách chấm tại IOI gốc.

Mỗi nhóm được chấm độc lập: chỉ nhận điểm của nhóm khi vượt qua tất cả bộ kiểm thử trong nhóm; nếu có bộ kiểm thử không đạt thì nhóm nhận 0 điểm. Tổng điểm tối đa là 100.

Nhãn nhóm là phần số trong tên tệp dữ liệu gốc. Tất cả tệp cùng nhãn, kể cả các hậu tố chữ và pf, đều thuộc nhóm đó.

Nhãn nhóm Điểm Tệp dữ liệu vào gốc
1 5 fsh/fsh1apf.in
2 5 fsh/fsh2a.in
3 5 fsh/fsh3a.in
4 5 fsh/fsh4a.in
5 5 fsh/fsh5a.in, fsh/fsh5b.in
6 5 fsh/fsh6apf.in, fsh/fsh6bpf.in
7 5 fsh/fsh7a.in
8 5 fsh/fsh8a.in
9 6 fsh/fsh9a.in, fsh/fsh9b.in
10 6 fsh/fsh10a.in, fsh/fsh10b.in, fsh/fsh10c.in
11 6 fsh/fsh11apf.in, fsh/fsh11bpf.in, fsh/fsh11cpf.in
12 6 fsh/fsh12a.in, fsh/fsh12b.in
13 6 fsh/fsh13a.in, fsh/fsh13b.in
14 5 fsh/fsh14a.in
15 5 fsh/fsh15a.in
16 5 fsh/fsh16a.in, fsh/fsh16b.in
17 5 fsh/fsh17apf.in, fsh/fsh17bpf.in
18 5 fsh/fsh18a.in, fsh/fsh18b.in, fsh/fsh18c.in, fsh/fsh18d.in
19 5 fsh/fsh19a.in, fsh/fsh19b.in, fsh/fsh19c.in, fsh/fsh19d.in

Các ví dụ trong đề không tính điểm. Các tệp ví dụ gốc có nhãn 0 được giữ lại riêng và có trọng số 0.

Tệp ví dụ gốc: fsh/fsh0.in.

Ví dụ

Ví dụ 1

Input
5
3
7
2 2
5 1
8 3
4 1
2 3
Output
4
Note

\(11\) tổ hợp có thể thu được, nên cần in \(11 \bmod 7=4\).

Các tổ hợp đó là \([1]\), \([1,2]\), \([1,2,3]\), \([1,2,3,3]\), \([1,3]\), \([1,3,3]\), \([2]\), \([2,3]\), \([2,3,3]\), \([3]\)\([3,3]\).

Với mỗi tổ hợp, danh sách ghi các loại đá quý có trong tổ hợp đó. Chẳng hạn, \([2,3,3]\) gồm một viên đá loại \(2\) và hai viên đá loại \(3\).

Đánh số các con cá theo thứ tự xuất hiện trong dữ liệu vào. Có thể thu được các tổ hợp trên như sau:

  • \([1]\): bắt con cá thứ hai hoặc thứ tư trước khi nó ăn bất kỳ con cá nào khác.
  • \([1,2]\): con cá thứ hai ăn con thứ nhất. Khi đó nó có một viên đá loại \(1\) đã nuốt ban đầu và một viên đá loại \(2\) lấy từ bụng con thứ nhất; bắt con thứ hai.
  • \([1,2,3]\): con thứ tư ăn con thứ nhất, rồi con thứ ba ăn con thứ tư. Bắt con thứ ba, trong bụng nó sẽ có một viên đá thuộc mỗi loại.
  • \([1,2,3,3]\): con thứ tư ăn con thứ nhất, con thứ ba ăn con thứ tư, rồi con thứ ba ăn con thứ năm; bắt con thứ ba.
  • \([1,3]\): con thứ ba ăn con thứ tư; bắt con thứ ba.
  • \([1,3,3]\): con thứ ba ăn con thứ năm, rồi ăn con thứ tư; bắt con thứ ba.
  • \([2]\): bắt con thứ nhất.
  • \([2,3]\): con thứ ba ăn con thứ nhất; bắt con thứ ba.
  • \([2,3,3]\): con thứ ba ăn con thứ nhất, rồi ăn con thứ năm; bắt con thứ ba.
  • \([3]\): bắt con thứ ba.
  • \([3,3]\): con thứ ba ăn con thứ năm; bắt con thứ ba.

Nguồn

IOI 2008.