JOI 2019 - Trại huấn luyện, ngày 4

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 JOI 2019 - Cake 3 100 (p) 4.0s 256M
2 JOI 2019 - Mergers 100 (p) 3.0s 256M
3 JOI 2019 - Minerals 100 (p) 2.0s 256M

1. JOI 2019 - Cake 3

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

Hôm nay là sinh nhật của IOI-chan. Anh trai của cô bé, JOI-kun, đã đặt trước một chiếc bánh để chúc mừng. Tuy nhiên, cậu đặt nhầm \(N\) miếng bánh thay vì một chiếc bánh nguyên vẹn. Các miếng bánh được đánh số từ \(1\) đến \(N\). Miếng bánh thứ \(i\) có giá trị \(V_i\) và độ đậm màu \(C_i\).

JOI-kun quyết định chọn \(M\) miếng bánh khác nhau trong số \(N\) miếng và xếp chúng thành một vòng tròn. Gọi \(k_1, k_2, \ldots, k_M\) là chỉ số của các miếng bánh theo thứ tự trên vòng tròn, và đặt \(k_{M+1}=k_1\). Vẻ đẹp của cách sắp xếp được định nghĩa là

\[ \sum_{j=1}^{M} V_{k_j} - \sum_{j=1}^{M} \left|C_{k_j}-C_{k_{j+1}}\right|. \]

Hãy tính vẻ đẹp lớn nhất có thể đạt được bằng cách chọn và sắp xếp \(M\) miếng bánh.

Dữ liệu vào

Đọc từ đầu vào chuẩn theo định dạng:

N M
V_1 C_1
...
V_N C_N

Dữ liệu ra

In ra một dòng chứa một số nguyên: vẻ đẹp lớn nhất có thể đạt được.

Ràng buộc

  • \(3 \le N \le 200\,000\).
  • \(3 \le M \le N\).
  • \(1 \le V_i \le 1\,000\,000\,000\) với \(1 \le i \le N\).
  • \(1 \le C_i \le 1\,000\,000\,000\) với \(1 \le i \le N\).
  • Mọi giá trị trong dữ liệu vào đều là số nguyên.

Phân nhóm

  1. \(5\) điểm: \(N \le 100\).
  2. \(19\) điểm: \(N \le 2\,000\).
  3. \(76\) điểm: Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
5 3
2 1
4 2
6 4
8 8
10 16
Output
6
Giải thích

Chọn các miếng bánh \(1,3,2\) và xếp theo thứ tự đó trên vòng tròn. Tổng giá trị là \(2+6+4=12\), còn tổng chênh lệch độ đậm màu giữa các miếng kề nhau là \(|1-4|+|4-2|+|2-1|=6\). Vì vậy, vẻ đẹp là \(12-6=6\).

Chọn các miếng bánh \(2,3,4\) và xếp theo thứ tự đó cũng cho vẻ đẹp bằng \(6\). Không có cách nào cho vẻ đẹp lớn hơn, nên đáp án là \(6\).

Ví dụ 2

Input
8 4
112103441 501365808
659752417 137957977
86280801 257419447
902409188 565237611
965602301 689654312
104535476 646977261
945132881 114821749
198700181 915994879
Output
2323231661

Nguồn

JOI 2018/2019, trại huấn luyện mùa xuân, ngày thi thứ 4 (23/03/2019). Bản dịch tiếng Việt từ đề tiếng Anh chính thức của Ủy ban Olympic Tin học Nhật Bản. Trang công bố cấp phép nội dung theo CC BY-SA 4.0; bản dịch giữ cùng giấy phép.

2. JOI 2019 - Mergers

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

Hợp chúng quốc JOI có \(N\) thành phố, được đánh số từ \(1\) đến \(N\), và \(N-1\) đường cao tốc hai chiều, được đánh số từ \(1\) đến \(N-1\). Đường cao tốc thứ \(i\) nối hai thành phố \(A_i\)\(B_i\). Có thể đi từ một thành phố bất kỳ đến bất kỳ thành phố nào khác bằng các đường cao tốc.

Đất nước có \(K\) bang, được đánh số từ \(1\) đến \(K\). Thành phố thứ \(j\) thuộc bang \(S_j\). Mỗi bang có ít nhất một thành phố.

Đất nước được gọi là có thể chia tách nếu có thể chia toàn bộ các thành phố thành hai nhóm \(X\)\(Y\) thỏa mãn tất cả các điều kiện sau:

  1. Mỗi thành phố thuộc đúng một trong hai nhóm \(X\)\(Y\).
  2. Nhóm \(X\) có ít nhất một thành phố.
  3. Nhóm \(Y\) có ít nhất một thành phố.
  4. Với mỗi bang, tất cả các thành phố của bang đó thuộc cùng một nhóm.
  5. Có thể đi giữa hai thành phố bất kỳ của nhóm \(X\) bằng các đường cao tốc mà chỉ đi qua các thành phố thuộc nhóm \(X\).
  6. Có thể đi giữa hai thành phố bất kỳ của nhóm \(Y\) bằng các đường cao tốc mà chỉ đi qua các thành phố thuộc nhóm \(Y\).

Tổng thống K muốn làm cho đất nước không thể chia tách. Để thực hiện điều này, ông có thể tiến hành sáp nhập các bang. Trong một lần sáp nhập, ông chọn hai bang và gộp tất cả các thành phố của hai bang đó thành một bang.

Hãy tính số lần sáp nhập ít nhất để đất nước không thể chia tách. Lưu ý rằng một đất nước chỉ có một bang thì không thể chia tách.

Dữ liệu vào

Đọc từ đầu vào chuẩn theo định dạng:

N K
A_1 B_1
...
A_{N-1} B_{N-1}
S_1
...
S_N

Dữ liệu ra

In ra một dòng chứa một số nguyên: số lần sáp nhập ít nhất để đất nước không thể chia tách.

Ràng buộc

  • \(1 \le N \le 500\,000\).
  • \(1 \le K \le N\).
  • \(1 \le A_i,B_i \le N\) với \(1 \le i \le N-1\).
  • Có thể đi giữa hai thành phố bất kỳ bằng các đường cao tốc.
  • \(1 \le S_j \le K\) với \(1 \le j \le N\).
  • Với mỗi \(k\) thỏa mãn \(1 \le k \le K\), tồn tại ít nhất một \(j\) sao cho \(S_j=k\).
  • Mọi giá trị trong dữ liệu vào đều là số nguyên.

Phân nhóm

  1. \(10\) điểm: \(N \le 100\), \(K \le 7\).
  2. \(24\) điểm: \(N \le 3\,000\).
  3. \(14\) điểm: \(N \le 100\,000\), \(K \le 50\).
  4. \(22\) điểm: \(N \le 100\,000\). Ban đầu, có thể đi giữa hai thành phố bất kỳ thuộc cùng một bang bằng một đường đi sử dụng không quá \(100\) đường cao tốc.
  5. \(30\) điểm: Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
5 4
1 2
2 3
3 4
3 5
1
2
1
3
4
Output
1
Giải thích

Ban đầu, đất nước có thể chia tách. Chẳng hạn, có thể chọn nhóm \(X\) gồm các thành phố \(1,2,3,4\) và nhóm \(Y\) chỉ gồm thành phố \(5\).

Sau khi sáp nhập bang \(3\) và bang \(4\), đất nước không thể chia tách. Vì vậy, đáp án là \(1\).

Ví dụ 2

Input
5 4
1 2
2 3
3 4
4 5
1
2
3
4
1
Output
0
Giải thích

Ban đầu, đất nước đã không thể chia tách, nên đáp án là \(0\).

Ví dụ 3

Input
2 2
1 2
1
2
Output
1

Nguồn

JOI 2018/2019, trại huấn luyện mùa xuân, ngày thi thứ 4 (23/03/2019). Bản dịch tiếng Việt từ đề tiếng Anh chính thức của Ủy ban Olympic Tin học Nhật Bản. Trang công bố cấp phép nội dung theo CC BY-SA 4.0; bản dịch giữ cùng giấy phép.

3. JOI 2019 - Minerals

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

Phòng thí nghiệm của giáo sư JOI đang nghiên cứu \(N\) loại khoáng vật. Mỗi loại có hai lát mẫu, tổng cộng có \(2N\) lát mẫu được đánh số từ \(1\) đến \(2N\).

Một hôm, trợ lý Bitaro làm rơi chiếc hộp đựng các lát mẫu. Cậu không còn biết những lát mẫu nào thuộc cùng một loại khoáng vật.

Phòng thí nghiệm có một thiết bị đo các bước sóng mà khoáng vật hấp thụ, qua đó đếm được số loại khoáng vật khác nhau trong số các lát mẫu đang đặt trong thiết bị. Bitaro muốn xác định \(N\) cặp lát mẫu cùng loại. Ban đầu, thiết bị không chứa lát mẫu nào. Cậu có thể thực hiện các thao tác sau:

  • Đưa một lát mẫu vào thiết bị và biết được số loại khoáng vật khác nhau đang có trong thiết bị.
  • Lấy một lát mẫu ra khỏi thiết bị và biết được số loại khoáng vật khác nhau đang có trong thiết bị.

Để giáo sư JOI không phát hiện ra sự cố, Bitaro chỉ có thể thực hiện tổng cộng không quá \(1\,000\,000\) thao tác.

Hãy viết chương trình nhận số loại khoáng vật và sử dụng thiết bị để xác định tất cả các cặp lát mẫu cùng loại.

Chi tiết cài đặt

Bạn cần nộp một tệp minerals.cpp, khai báo #include "minerals.h" và cài đặt hàm sau:

C++
void Solve(int N);

Hàm này được gọi đúng một lần cho mỗi bộ dữ liệu. Tham số N là số loại khoáng vật.

Chương trình của bạn có thể gọi các hàm sau do trình chấm cung cấp:

C++
int Query(int x);

Hàm này lấy lát mẫu x ra khỏi thiết bị nếu nó đang ở trong thiết bị; ngược lại, đưa lát mẫu đó vào thiết bị. Sau thao tác, hàm trả về số loại khoáng vật khác nhau đang có trong thiết bị.

  • Phải có \(1 \le x \le 2N\). Nếu không, chương trình bị đánh giá Wrong Answer [1].
  • Không được gọi Query quá \(1\,000\,000\) lần. Nếu vi phạm, chương trình bị đánh giá Wrong Answer [2].
C++
void Answer(int a, int b);

Hàm này thông báo rằng lát mẫu a và lát mẫu b thuộc cùng một loại khoáng vật.

  • Phải có \(1 \le a \le 2N\)\(1 \le b \le 2N\). Nếu không, chương trình bị đánh giá Wrong Answer [3].
  • Trong toàn bộ các đối số ab của tất cả các lần gọi, không giá trị nào được xuất hiện quá một lần. Nếu vi phạm, chương trình bị đánh giá Wrong Answer [4].
  • Nếu hai lát mẫu được chỉ định khác loại, chương trình bị đánh giá Wrong Answer [5].
  • Phải gọi Answer đúng \(N\) lần. Nếu khi Solve kết thúc mà số lần gọi không bằng \(N\), chương trình bị đánh giá Wrong Answer [6].

Lưu ý quan trọng

Bạn có thể cài đặt thêm các hàm dùng nội bộ hoặc sử dụng biến toàn cục.

Chương trình của bạn không được sử dụng đầu vào chuẩn, đầu ra chuẩn hoặc giao tiếp với các tệp khác bằng bất kỳ cách nào. Tuy nhiên, bạn có thể ghi thông tin gỡ lỗi ra đầu ra lỗi chuẩn.

Biên dịch và chạy thử

Gói chương trình mẫu gồm trình chấm thử grader.cpp, tệp khai báo minerals.htệp mã nguồn mẫu minerals.cpp. Để chạy thử, đặt ba tệp trong cùng một thư mục và biên dịch grader.cpp cùng với minerals.cpp thành chương trình grader.

Trình chấm thử

Trình chấm thật khác với trình chấm thử. Trình chấm thử chạy trong một tiến trình, đọc dữ liệu từ đầu vào chuẩn và ghi kết quả ra đầu ra chuẩn.

Dữ liệu vào của trình chấm thử

Trình chấm thử đọc dữ liệu theo định dạng:

N
X_1 Y_1
...
X_N Y_N

Với mỗi \(i\) từ \(1\) đến \(N\), lát mẫu \(X_i\) và lát mẫu \(Y_i\) thuộc cùng một loại khoáng vật.

Dữ liệu ra của trình chấm thử

Khi chương trình kết thúc, trình chấm thử ghi thông tin sau ra đầu ra chuẩn:

  • Nếu chương trình của bạn được đánh giá đúng, trình chấm thử ghi số lần gọi Query, chẳng hạn Accepted: 100.
  • Nếu chương trình của bạn bị đánh giá sai, trình chấm thử ghi loại lỗi, chẳng hạn Wrong Answer [1].

Nếu chương trình vi phạm nhiều loại lỗi, trình chấm thử chỉ thông báo một loại.

Ràng buộc

Các giá trị \(X_i,Y_i\) được định nghĩa trong phần dữ liệu vào của trình chấm thử.

  • \(1 \le N \le 43\,000\).
  • \(1 \le X_i \le 2N\) với \(1 \le i \le N\).
  • \(1 \le Y_i \le 2N\) với \(1 \le i \le N\).
  • \(X_i \ne X_j\) với \(1 \le i < j \le N\).
  • \(Y_i \ne Y_j\) với \(1 \le i < j \le N\).
  • \(X_i \ne Y_j\) với \(1 \le i \le N\)\(1 \le j \le N\).

Phân nhóm

  1. \(6\) điểm: \(N \le 100\).
  2. \(25\) điểm: \(N \le 15\,000\); \(1 \le X_i \le N\)\(N+1 \le Y_i \le 2N\) với mọi \(1 \le i \le N\).
  3. \(9\) điểm: \(N \le 15\,000\).
  4. \(30\) điểm: \(N \le 38\,000\).
  5. \(5\) điểm: \(N \le 39\,000\).
  6. \(5\) điểm: \(N \le 40\,000\).
  7. \(5\) điểm: \(N \le 41\,000\).
  8. \(5\) điểm: \(N \le 42\,000\).
  9. \(10\) điểm: Không có ràng buộc bổ sung.

Ví dụ giao tiếp

Dưới đây là một dữ liệu vào của trình chấm thử và các lời gọi hàm tương ứng.

4
1 5
2 6
3 4
7 8
Trình chấm gọi Chương trình của bạn gọi Giá trị trả về
Solve(4)
Query(1) \(1\)
Query(2) \(2\)
Query(5) \(2\)
Query(2) \(1\)
Answer(3, 4) Không có.
Answer(5, 1) Không có.
Answer(8, 7) Không có.
Answer(2, 6) Không có.

Nguồn

JOI 2018/2019, trại huấn luyện mùa xuân, ngày thi thứ 4 (23/03/2019). Bản dịch tiếng Việt từ đề tiếng Anh chính thức của Ủy ban Olympic Tin học Nhật Bản. Trang công bố cấp phép nội dung theo CC BY-SA 4.0; bản dịch giữ cùng giấy phép.