IOI 2007 - Ngày 2

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 IOI 2007 - Miners 100 (p) 1.5s 16M
2 IOI 2007 - Pairs 100 (p) 4.0s 150M
3 IOI 2007 - Trainings 100 (p) 0.3s 64M

1. IOI 2007 - Miners

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

Có hai mỏ than, mỗi mỏ có một nhóm thợ mỏ làm việc. Khai thác than là công việc nặng nhọc, vì vậy các thợ mỏ cần được cung cấp thức ăn để tiếp tục làm việc. Mỗi khi một chuyến hàng thực phẩm đến mỏ, các thợ mỏ sẽ khai thác được một lượng than. Có ba loại chuyến hàng: thịt, cá và bánh mì.

Các thợ mỏ thích chế độ ăn đa dạng và sẽ làm việc hiệu quả hơn nếu thực phẩm được cung cấp phong phú. Cụ thể, mỗi khi nhận được một chuyến hàng mới, họ xét chuyến hàng này cùng hai chuyến hàng trước đó mà mỏ của họ đã nhận được (hoặc ít hơn nếu chưa nhận đủ hai chuyến). Khi đó:

  • Nếu tất cả các chuyến hàng được xét đều cùng loại, họ khai thác được \(1\) đơn vị than.
  • Nếu có đúng hai loại thực phẩm trong các chuyến hàng được xét, họ khai thác được \(2\) đơn vị than.
  • Nếu có cả ba loại thực phẩm, họ khai thác được \(3\) đơn vị than.

Ta biết trước loại thực phẩm của từng chuyến hàng và thứ tự các chuyến hàng sẽ được gửi đi. Bằng cách quyết định chuyến hàng nào được gửi đến mỏ nào, ta có thể ảnh hưởng đến lượng than được khai thác. Không được chia nhỏ một chuyến hàng: toàn bộ chuyến hàng phải được gửi đến một trong hai mỏ.

Hai mỏ không nhất thiết phải nhận cùng số chuyến hàng; thậm chí có thể gửi tất cả các chuyến hàng đến một mỏ.

Cho các loại chuyến hàng theo đúng thứ tự gửi đi, hãy xác định tổng lượng than lớn nhất mà cả hai mỏ có thể khai thác bằng cách lựa chọn mỏ nhận từng chuyến hàng.

Dữ liệu vào

  • Dòng thứ nhất chứa số nguyên \(N\), là số chuyến hàng thực phẩm.
  • Dòng thứ hai chứa một xâu gồm \(N\) ký tự, mô tả loại thực phẩm của các chuyến hàng theo thứ tự phân phối. Mỗi ký tự là một trong ba chữ cái in hoa: M (thịt), F (cá) hoặc B (bánh mì).

Dữ liệu ra

Ghi một số nguyên duy nhất: tổng lượng than lớn nhất có thể khai thác.

Ràng buộc

  • \(1 \le N \le 100\,000\).

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 8 miners/miners.in.1
2 8 miners/miners.in.2
3 8 miners/miners.in.3
4 8 miners/miners.in.4
5 8 miners/miners.in.5
6 8 miners/miners.in.6
7 8 miners/miners.in.7
8 8 miners/miners.in.8
9 9 miners/miners.in.9
10 9 miners/miners.in.10
11 9 miners/miners.in.11
12 9 miners/miners.in.12

Các ví dụ trong đề không tính điểm.

Ví dụ

Ví dụ 1

Input
6
MBMFFB
Output
12
Note

Nếu lần lượt gửi các chuyến hàng đến mỏ \(1\), mỏ \(1\), mỏ \(2\), mỏ \(2\), mỏ \(1\), mỏ \(2\), thì lượng than khai thác được sau từng chuyến lần lượt là \(1\), \(2\), \(1\), \(2\), \(3\)\(3\), tổng cộng \(12\) đơn vị. Cũng có những cách phân phối khác đạt được lượng than lớn nhất này.

Ví dụ 2

Input
16
MMBMBBBBMMMMMBMB
Output
29

Nguồn

IOI 2007, ngày thi thứ hai: Miners.

2. IOI 2007 - Pairs

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

Mirko và Slavko đang chơi với những con thú đồ chơi. Trước tiên, họ chọn một trong ba bàn chơi trong hình dưới đây. Mỗi bàn gồm các ô (được vẽ bằng những vòng tròn trong hình), sắp xếp thành một lưới một chiều, hai chiều hoặc ba chiều.

Sau đó, Mirko đặt \(N\) con thú đồ chơi vào các ô.

Khoảng cách giữa hai ô là số bước ít nhất mà một con thú cần thực hiện để đi từ ô này đến ô kia. Trong một bước, con thú có thể đi sang một ô kề với ô hiện tại; các ô kề nhau được nối bằng những đoạn thẳng trong hình.

Hai con thú nghe thấy nhau nếu khoảng cách giữa hai ô của chúng không vượt quá \(D\). Nhiệm vụ của Slavko là tính số cặp con thú nghe thấy nhau.

Cho loại bàn chơi, vị trí của tất cả các con thú và số \(D\), hãy tính số cặp cần tìm.

Dữ liệu vào

Dòng thứ nhất chứa bốn số nguyên theo thứ tự:

  • \(B\): loại bàn chơi.
  • \(N\): số con thú.
  • \(D\): khoảng cách lớn nhất mà hai con thú còn nghe thấy nhau.
  • \(M\): kích thước bàn chơi, tức là giá trị tọa độ lớn nhất được phép xuất hiện trong dữ liệu vào.

Mỗi dòng trong \(N\) dòng tiếp theo chứa \(B\) số nguyên, cách nhau bởi dấu cách, là các tọa độ của một con thú. Mỗi tọa độ nằm trong đoạn từ \(1\) đến \(M\), kể cả hai đầu.

Có thể có nhiều con thú cùng nằm trong một ô.

Dữ liệu ra

Ghi một số nguyên duy nhất: số cặp con thú nghe thấy nhau.

Lưu ý: hãy dùng kiểu số nguyên \(64\) bit để tính toán và in kết quả (long long trong C/C++, int64 trong Pascal).

Ràng buộc

  • \(1 \le B \le 3\).
  • \(1 \le N \le 100\,000\).
  • \(1 \le D \le 100\,000\,000\).
  • Khi \(B=1\), \(1 \le M \le 75\,000\,000\).
  • Khi \(B=2\), \(1 \le M \le 75\,000\).
  • Khi \(B=3\), \(1 \le M \le 75\).

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 pairs/pairs.in.1a, pairs/pairs.in.1b
2 5 pairs/pairs.in.2a
3 7 pairs/pairs.in.3a, pairs/pairs.in.3b
4 8 pairs/pairs.in.4a, pairs/pairs.in.4b
5 8 pairs/pairs.in.5a, pairs/pairs.in.5b, pairs/pairs.in.5c
6 10 pairs/pairs.in.6a, pairs/pairs.in.6b
7 8 pairs/pairs.in.7a, pairs/pairs.in.7b
8 8 pairs/pairs.in.8a, pairs/pairs.in.8b, pairs/pairs.in.8c, pairs/pairs.in.8d
9 8 pairs/pairs.in.9a, pairs/pairs.in.9b, pairs/pairs.in.9c, pairs/pairs.in.9d
10 10 pairs/pairs.in.10a, pairs/pairs.in.10b
11 7 pairs/pairs.in.11a, pairs/pairs.in.11b, pairs/pairs.in.11c
12 8 pairs/pairs.in.12a, pairs/pairs.in.12b, pairs/pairs.in.12c
13 8 pairs/pairs.in.13a, pairs/pairs.in.13b, pairs/pairs.in.13c

Các ví dụ trong đề không tính điểm.

Ví dụ

Ví dụ 1

Input
1 6 5 100
25
50
50
10
20
23
Output
4
Note

Đánh số các con thú từ \(1\) đến \(6\) theo thứ tự xuất hiện trong dữ liệu vào. Bốn cặp nghe thấy nhau là:

  • \(1\)\(5\): khoảng cách \(5\).
  • \(1\)\(6\): khoảng cách \(2\).
  • \(2\)\(3\): khoảng cách \(0\).
  • \(5\)\(6\): khoảng cách \(3\).

Ví dụ 2

Input
2 5 4 10
5 2
7 2
8 4
6 5
4 4
Output
8
Note

Đánh số các con thú theo thứ tự xuất hiện trong dữ liệu vào. Tám cặp nghe thấy nhau là:

  • \(1\)\(2\): khoảng cách \(2\).
  • \(1\)\(4\): khoảng cách \(4\).
  • \(1\)\(5\): khoảng cách \(3\).
  • \(2\)\(3\): khoảng cách \(3\).
  • \(2\)\(4\): khoảng cách \(4\).
  • \(3\)\(4\): khoảng cách \(3\).
  • \(3\)\(5\): khoảng cách \(4\).
  • \(4\)\(5\): khoảng cách \(3\).

Ví dụ 3

Input
3 8 10 20
10 10 10
10 10 20
10 20 10
10 20 20
20 10 10
20 10 20
20 20 10
20 20 20
Output
12

Nguồn

IOI 2007, ngày thi thứ hai: Pairs.

3. IOI 2007 - Trainings

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

Mirko và Slavko đang tích cực tập luyện cho cuộc đua marathon xe đạp đôi hằng năm tại Croatia. Họ cần chọn một lộ trình để tập luyện.

Đất nước của họ có \(N\) thành phố và \(M\) con đường. Mỗi con đường nối hai thành phố và có thể đi theo cả hai chiều. Đúng \(N-1\) con đường được trải nhựa; các con đường còn lại là đường mòn chưa trải nhựa. Mạng lưới đường được thiết kế sao cho giữa hai thành phố bất kỳ luôn có một đường đi chỉ gồm các đường đã trải nhựa. Nói cách khác, \(N\) thành phố cùng \(N-1\) đường trải nhựa tạo thành một cây.

Ngoài ra, mỗi thành phố là đầu mút của không quá \(10\) con đường, tính cả đường trải nhựa lẫn đường chưa trải nhựa.

Một lộ trình tập luyện bắt đầu tại một thành phố, đi qua một số con đường rồi quay về thành phố xuất phát. Mirko và Slavko thích đến những nơi mới, nên ngoài việc quay lại thành phố xuất phát để kết thúc lộ trình, họ không được đi qua một thành phố hai lần hoặc đi trên cùng một con đường hai lần. Có thể xuất phát ở bất kỳ thành phố nào và không bắt buộc phải đi qua tất cả các thành phố.

Người ngồi phía sau đạp nhẹ hơn vì được người phía trước che gió. Vì vậy, Mirko và Slavko đổi chỗ cho nhau tại mỗi thành phố. Để cả hai được tập luyện như nhau, họ phải chọn một lộ trình có số con đường là số chẵn.

Các đối thủ của họ quyết định chặn một số đường chưa trải nhựa để Mirko và Slavko không thể tìm được lộ trình tập luyện thỏa mãn các yêu cầu trên. Mỗi đường chưa trải nhựa có một chi phí chặn là số nguyên dương. Không thể chặn đường đã trải nhựa.

Cho mô tả mạng lưới thành phố và đường, hãy tìm tổng chi phí nhỏ nhất để chặn các đường sao cho không còn lộ trình tập luyện nào thỏa mãn các yêu cầu.

Dữ liệu vào

  • Dòng thứ nhất chứa hai số nguyên \(N\)\(M\), lần lượt là số thành phố và tổng số con đường.
  • Mỗi dòng trong \(M\) dòng tiếp theo chứa ba số nguyên \(A\), \(B\), \(C\), mô tả một con đường nối trực tiếp hai thành phố khác nhau \(A\)\(B\). Nếu \(C=0\), đây là đường trải nhựa. Nếu \(C>0\), đây là đường chưa trải nhựa và \(C\) là chi phí chặn đường đó.

Mỗi thành phố là đầu mút của không quá \(10\) con đường. Giữa một cặp thành phố không bao giờ có nhiều hơn một con đường nối trực tiếp.

Dữ liệu ra

Ghi một số nguyên duy nhất: tổng chi phí chặn đường nhỏ nhất để không còn lộ trình tập luyện hợp lệ.

Ràng buộc

  • \(2 \le N \le 1\,000\).
  • \(N-1 \le M \le 5\,000\).
  • \(1 \le A,B \le N\)\(A \ne B\).
  • \(0 \le C \le 10\,000\).
  • Đúng \(N-1\) đường có \(C=0\), và những đường này nối tất cả các thành phố thành một cây.

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ó 11 nhóm tính điểm; điểm cuối cùng bằng \(100 \times W / 11\), 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/11\) đ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/11\) training/training.in.1a, training/training.in.1b
2 \(100/11\) training/training.in.2a, training/training.in.2b
3 \(100/11\) training/training.in.3a, training/training.in.3b
4 \(100/11\) training/training.in.4a, training/training.in.4b
5 \(100/11\) training/training.in.5a, training/training.in.5b
6 \(100/11\) training/training.in.6a, training/training.in.6b
7 \(100/11\) training/training.in.7a, training/training.in.7b
8 \(100/11\) training/training.in.8a, training/training.in.8b, training/training.in.8c
9 \(100/11\) training/training.in.9a, training/training.in.9b, training/training.in.9c
10 \(100/11\) training/training.in.10a, training/training.in.10b, training/training.in.10c, training/training.in.10d
11 \(100/11\) training/training.in.11a, training/training.in.11b, training/training.in.11c, training/training.in.11d

Các ví dụ trong đề không tính điểm.

Ví dụ

Ví dụ 1

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

Hình dưới biểu diễn các thành phố và con đường trong ví dụ này. Những đường trải nhựa được vẽ đậm.

Có năm lộ trình tập luyện khả dĩ, được minh họa dưới đây.

Nếu chặn các đường \(1\)\(3\), \(3\)\(5\)\(2\)\(5\), Mirko và Slavko không thể sử dụng bất kỳ lộ trình nào trong năm lộ trình. Tổng chi phí chặn ba đường này là \(5\).

Cũng có thể chỉ chặn hai đường \(2\)\(4\)\(2\)\(5\), nhưng khi đó chi phí lớn hơn, bằng \(6\).

Ví dụ 2

Input
9 14
1 2 0
1 3 0
2 3 14
2 6 15
3 4 0
3 5 0
3 6 12
3 7 13
4 6 10
5 6 0
5 7 0
5 8 0
6 9 11
8 9 0
Output
48

Nguồn

IOI 2007, ngày thi thứ hai: Training.