BOI 2021 - Ngày 2

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 BOI 2021 - The short shank; Redemption 100 (p) 3.0s 512M
2 BOI 2021 - The Collection Game 100 (p) 3.0s 512M
3 BOI 2021 - The Xana coup 100 (p) 2.0s 512M

1. BOI 2021 - The short shank; Redemption

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

Mọi chuyện chẳng diễn ra như kế hoạch: tuy tránh được những người bảo vệ trong bảo tàng, bạn lại không để ý rằng camera giám sát có mặt khắp nơi. Kết quả là màn ra mắt với tư cách một tên trộm tác phẩm nghệ thuật trở thành thảm họa: bạn bị bắt và phải vào tù.

Vì Wi-Fi trong tù quá tệ, bạn muốn vượt ngục. Xem nhiều phim về nhà tù, bạn biết rằng việc đánh lạc hướng là yếu tố then chốt của mọi kế hoạch vượt ngục. Vì vậy, bạn quyết định tổ chức một cuộc nổi loạn để làm mồi nhử.

\(N\) buồng giam nằm dọc theo một hành lang. Buồng ngoài cùng bên trái mang số \(1\), buồng ngay bên phải mang số \(2\), và cứ thế tiếp tục. Không phải mọi bạn tù đều tham gia nổi loạn đúng như kế hoạch, nhưng bạn đã bảo đảm rằng người tù ở buồng \(i\) dự định bắt đầu nổi loạn vào thời điểm \(t_i\), tức đúng \(t_i\) giây kể từ bây giờ. Ngoài ra, mỗi khi nghe thấy người tù ngay bên trái nổi loạn, một người tù cũng sẽ bắt đầu nổi loạn chỉ sau một giây, trừ khi người đó đã nổi loạn rồi. Một khi đã bắt đầu, người tù sẽ không ngừng nổi loạn.

Vào thời điểm \(T\), đại diện địa phương của F.R.U.IT.T.Ar.T. — Cơ quan Đăng ký Liên bang dành cho những chuyên gia công nghệ thông tin bất mãn chuyển nghề sang trộm tác phẩm nghệ thuật — sẽ đến thanh tra. Bạn cho rằng đây là thời điểm hoàn hảo để trốn thoát. Tuy nhiên, các quản giáo không muốn có nổi loạn trong lúc thanh tra. Bạn lo rằng họ sẽ dùng \(D\) tấm đệm cách âm có thể lắp giữa các buồng giam. Nếu đặt một tấm đệm giữa buồng \(i-1\) và buồng \(i\), người tù ở buồng \(i\) sẽ không bắt đầu nổi loạn trước thời điểm \(t_i\), bất kể hành động của người tù ở buồng \(i-1\) hay bất kỳ người tù nào khác.

Hãy viết chương trình giúp bạn ước lượng khả năng thành công: tính số người tù ít nhất đang nổi loạn tại thời điểm \(T\) nếu các quản giáo đặt đệm một cách tối ưu.

Dữ liệu vào

Dòng đầu chứa ba số nguyên \(N\), \(D\)\(T\): số buồng giam, số tấm đệm và thời điểm đại diện đến thanh tra.

Dòng thứ hai chứa \(N\) số nguyên \(t_i\), trong đó \(t_i\) là thời điểm người tù ở buồng \(i\) dự định bắt đầu nổi loạn.

Dữ liệu ra

In đúng một số nguyên trên một dòng: số người tù ít nhất đang nổi loạn tại thời điểm \(T\).

Ràng buộc

  • \(1\le N,D\le2\,000\,000\).
  • \(D<N\) trong mọi bộ dữ liệu.
  • \(1\le T\le10^9\).
  • \(1\le t_i\le10^9\) với mọi \(i=1,\ldots,N\).

Phân nhóm

  1. \(15\) điểm: \(N\le500\).
  2. \(10\) điểm: \(N\le500\,000\), \(D=1\).
  3. \(20\) điểm: \(N\le4\,000\).
  4. \(10\) điểm: \(N\le75\,000\), \(D\le15\).
  5. \(25\) điểm: \(N\le75\,000\).
  6. \(20\) điểm: không có ràng buộc thêm.

Ví dụ

Ví dụ 1

Input
5 1 42
13 37 47 11 42
Output
4
Giải thích

Một cách đặt tối ưu là đặt một tấm đệm giữa buồng thứ hai và buồng thứ ba. Khi đó, những người tù thứ nhất, thứ hai, thứ tư và thứ năm sẽ nổi loạn tại thời điểm \(T\).

Ví dụ 2

Input
5 2 5
1 9 4 6 7
Output
2

Giới hạn

Thời gian: \(1{,}5\) giây. Bộ nhớ: \(512\) MiB.

2. BOI 2021 - The Collection Game

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

Phù! Sau màn ra mắt thảm họa với tư cách một tên trộm tác phẩm nghệ thuật, bạn vừa thoát khỏi nhà tù trong gang tấc. Có lẽ bước vào giới nghệ thuật bằng con đường hợp pháp vẫn hơn. Vì thế, bạn quyết định làm nhà phê bình nghệ thuật tại chính bảo tàng nơi mình từng bị bắt.

Bạn sẽ đến bảo tàng nhiều lần và viết một bài đánh giá sau mỗi lần ghé thăm. Mỗi bài đánh giá xem xét một số cặp phòng. Với mỗi cặp, bạn so sánh các tác phẩm trong hai phòng trong lần ghé thăm đó và xác định phòng nào trưng bày bộ sưu tập có giá trị thẩm mỹ cao hơn. Tất nhiên, đánh giá nghệ thuật chỉ có tính tương đối: sau mỗi lần ghé thăm, bạn chỉ biết thứ tự tương đối trong từng cặp đã so sánh, chứ không biết thứ tự giữa những phòng thuộc các cặp khác nhau. Cuối cùng, bạn còn muốn tổng kết toàn bộ nghệ thuật trong bảo tàng: dùng tất cả các bài đánh giá để xếp hạng mọi phòng theo giá trị thẩm mỹ giảm dần của bộ sưu tập đang được trưng bày.

Vì việc lên kế hoạch rất quan trọng, trước mỗi lần ghé thăm, bạn quyết định sẵn những cặp phòng sẽ so sánh. Để bảo đảm sự đa dạng, mỗi phòng không được xuất hiện quá một lần trong cùng một bài đánh giá.

Không may, danh tiếng mới của bạn trong giới nghệ thuật lại gây trở ngại. Mỗi khi bạn thông báo rằng sẽ so sánh một cặp phòng cụ thể trong lần ghé thăm tiếp theo, bảo tàng có thể bất ngờ đổi chỗ hai bộ sưu tập của hai phòng đó. Bản tổng kết và thứ hạng cuối cùng phải dựa trên những gì được trưng bày trong từng phòng vào lần ghé thăm cuối cùng của bạn.

Hãy viết chương trình lên lịch không quá \(V\) lần ghé thăm, rồi dựa vào các kết quả so sánh để lập danh sách tất cả các phòng theo giá trị thẩm mỹ giảm dần của bộ sưu tập trong từng phòng tại lần ghé thăm cuối cùng.

Giao tiếp

Đây là bài toán giao tiếp. Bạn phải cài đặt hàm sau:

C++
void solve(int N, int V);

\(N\) là số phòng của bảo tàng, được đánh số từ \(1\) đến \(N\), còn \(V\) là số lần ghé thăm tối đa được phép thực hiện. Với mỗi bộ dữ liệu, hàm này được gọi đúng một lần. Bạn có thể gọi các hàm sau do trình chấm cung cấp:

C++
void schedule(int i, int j);
std::vector<int> visit();
void answer(std::vector<int> r);
  • schedule(i, j) lên lịch so sánh phòng \(i\) và phòng \(j\) trong lần ghé thăm tiếp theo, với \(1\le i,j\le N\)\(i\ne j\). Ngay sau lời gọi này, bảo tàng có thể quyết định đổi chỗ các bộ sưu tập của phòng \(i\) và phòng \(j\).
  • visit() ghé thăm bảo tàng và thực hiện tất cả các phép so sánh đã lên lịch. Hàm trả về một mảng có đúng một phần tử cho mỗi phép so sánh được lên lịch kể từ lần ghé thăm trước, tức là cho mỗi lời gọi schedule kể từ lời gọi visit gần nhất hoặc từ khi chương trình bắt đầu. Phần tử ở chỉ số \(k\) bằng \(1\) nếu bộ sưu tập trong phòng \(i\) có giá trị thẩm mỹ cao hơn trong phòng \(j\), và bằng \(0\) trong trường hợp còn lại; ở đây, \(i,j\) là cặp phòng trong phép so sánh thứ \(k+1\) được lên lịch. Chỉ số mảng bắt đầu từ \(0\).
  • answer(r) công bố danh sách tất cả các phòng theo giá trị thẩm mỹ giảm dần. Mảng \(r\) phải có độ dài \(N\); phần tử ở chỉ số \(i\) là phòng có bộ sưu tập đứng thứ \(i+1\) về giá trị thẩm mỹ trong lần ghé thăm cuối cùng. Bạn phải gọi answer đúng một lần; chương trình tự động kết thúc sau lời gọi này.

Nếu một lời gọi hàm không đúng định dạng trên, nếu một phòng xuất hiện nhiều hơn một lần trong các tham số truyền cho schedule giữa hai lần gọi visit (hoặc từ khi chương trình bắt đầu đến lần gọi visit đầu tiên), hoặc nếu gọi visit quá \(V\) lần, chương trình lập tức bị kết thúc và nhận kết quả Not correct cho bộ dữ liệu đó. Không được ghi bất kỳ thứ gì ra đầu ra chuẩn; nếu vi phạm, bạn có thể nhận kết quả Security violation!.

Nếu dùng C++, mã nguồn phải có #include "swaps.h". Để chạy thử trên máy, bạn có thể liên kết chương trình với sample_grader.cpp, được cung cấp trong phần đính kèm của bài trên CMS chính thức. Phần đính kèm còn có tệp cài đặt mẫu swaps_sample.cpp với các giải thích bổ sung. Nếu dùng Python, tệp mẫu swaps_sample.py trong phần đính kèm mô tả giao diện dành cho bài nộp Python.

Dữ liệu vào

Bài nộp nhận \(N\)\(V\) qua tham số của solve, rồi nhận các kết quả so sánh qua giá trị trả về của visit.

Trình chấm mẫu nhận từ đầu vào chuẩn hai số \(N\), \(V\) cùng một danh sách \(N\) số nguyên là các phòng theo giá trị thẩm mỹ giảm dần ở thời điểm bắt đầu solve. Mỗi khi chương trình gọi schedule(i, j), trình chấm mẫu tiếp tục đọc một số từ đầu vào chuẩn: \(1\) nếu cần đổi chỗ các bộ sưu tập của phòng \(i\) và phòng \(j\) ngay lúc đó, hoặc \(0\) nếu không đổi.

Dữ liệu ra

Bài nộp trả lời bằng answer, không ghi ra đầu ra chuẩn. Trình chấm mẫu ghi nhật ký tất cả các lời gọi hàm ra đầu ra chuẩn và kết thúc bằng một trong các thông báo ở phần “Trình chấm mẫu”.

Ràng buộc

  • \(1\le N\le500\).
  • \(50\le V\le5\,000\).
  • Mỗi phòng xuất hiện nhiều nhất một lần trong các phép so sánh của một lần ghé thăm.

Phân nhóm

  1. \(5\) điểm: \(V=5\,000\) và bảo tàng không bao giờ đổi chỗ các bộ sưu tập.
  2. \(10\) điểm: \(V\ge1\,000\) và bảo tàng không bao giờ đổi chỗ các bộ sưu tập.
  3. \(5\) điểm: \(N\le100\), \(V=5\,000\).
  4. \(15\) điểm: \(V=5\,000\).
  5. \(15\) điểm: \(V\ge500\).
  6. \(35\) điểm: \(V\ge100\).
  7. \(15\) điểm: \(V\ge50\).

Trong mỗi phân nhóm từ \(3\) đến \(7\), bạn nhận được \(60\%\) số điểm của phân nhóm nếu giải đúng tất cả các bộ dữ liệu mà với mỗi lời gọi schedule(i, j), bảo tàng luôn đặt bộ sưu tập có giá trị thẩm mỹ cao hơn vào phòng \(i\). Trên CMS, các bộ dữ liệu này được hiển thị là “Group 1” của phân nhóm tương ứng.

Ví dụ giao tiếp

Xét một bộ dữ liệu có \(N=4\)\(V=50\), trong đó ban đầu các phòng được xếp theo giá trị thẩm mỹ giảm dần là \(1,2,3,4\). Trình chấm bắt đầu bằng lời gọi solve(4, 50). Một quá trình giao tiếp có thể diễn ra như sau; ký hiệu -> biểu diễn giá trị trả về, không phải dữ liệu bài nộp cần in:

schedule(1, 2)
schedule(3, 4)
visit() -> {1, 0}
schedule(2, 4)
visit() -> {1}
answer({1, 2, 4, 3})

Lời gọi đầu tiên lên lịch so sánh phòng \(1\) và phòng \(2\). Lời gọi thứ hai lên lịch so sánh phòng \(3\) và phòng \(4\); sau lời gọi này, bảo tàng đổi chỗ các bộ sưu tập trong phòng \(3\) và phòng \(4\). Lần gọi visit() đầu tiên thực hiện cả hai phép so sánh: bộ sưu tập trong phòng \(1\) có giá trị thẩm mỹ cao hơn phòng \(2\), còn bộ sưu tập trong phòng \(4\) cao hơn phòng \(3\).

Tiếp theo, bạn lên lịch so sánh phòng \(2\) và phòng \(4\). Lần ghé thăm thứ hai cho biết bộ sưu tập trong phòng \(2\) có giá trị thẩm mỹ cao hơn phòng \(4\). Bạn tin rằng thứ tự giảm dần là \(1,2,4,3\) và trả lời như vậy. Đáp án này đúng và được chấp nhận.

Tuy nhiên, các truy vấn trên chưa đủ để xác định chắc chắn thứ tự các phòng. Chẳng hạn, thứ tự \(2,1,4,3\) cũng phù hợp với mọi giá trị trả về của visit. Thứ tự này có thể xuất hiện nếu ban đầu thứ tự là \(4,1,2,3\) và bảo tàng đổi chỗ các bộ sưu tập trong phòng \(2\) và phòng \(4\) sau lời gọi schedule cuối cùng.

Trình chấm mẫu

Các thông báo kết thúc có ý nghĩa như sau:

  • Invalid input.: dữ liệu đưa vào trình chấm qua đầu vào chuẩn không đúng định dạng đã mô tả.
  • Invalid schedule.: schedule được gọi với tham số không hợp lệ.
  • Out of visits.: visit được gọi quá \(V\) lần.
  • Invalid answer.: answer được gọi với tham số không hợp lệ.
  • Wrong answer.: answer được gọi với một danh sách phòng không đúng.
  • No answer.: solve kết thúc mà không gọi answer.
  • Correct: v visit(s) used.: không xảy ra trường hợp nào ở trên và visit được gọi \(v\) lần.

Trình chấm dùng để đánh giá bài nộp chính thức chỉ đưa ra Not correct khi có lỗi hoặc Correct khi đúng. Cả trình chấm mẫu và trình chấm chính thức đều tự động kết thúc chương trình khi xảy ra một lỗi đã nêu hoặc khi chương trình gọi answer.

Giới hạn

Thời gian: \(1{,}5\) giây. Bộ nhớ: \(512\) MiB.

3. BOI 2021 - The Xana coup

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

Ngày nào cũng đến bảo tàng với tư cách nhà phê bình nghệ thuật, lại còn không được chạm vào hiện vật, cuối cùng đã trở nên quá sức chịu đựng của bạn. Vì thế, bạn quyết định thử lại sự nghiệp trộm tác phẩm nghệ thuật.1 Tuy nhiên, sau màn ra mắt thảm họa, lần này bạn quyết tâm xử lý hệ thống camera giám sát.

Bạn đã dùng kỹ năng công nghệ thông tin để xâm nhập hệ thống điều khiển camera. Không may, chính những chiếc camera lại là một phần của tác phẩm nghệ thuật sắp đặt mới mang tên Xanadu, khiến chúng hoạt động khá kỳ lạ. Có \(N\) camera, được đánh số \(1,\ldots,N\), bố trí khắp bảo tàng; một số có thể đã tắt vì lý do nghệ thuật. Các camera được nối bằng \(N-1\) dây sao cho hai camera bất kỳ đều được nối với nhau trực tiếp hoặc gián tiếp. Hệ thống điều khiển có một nút riêng cho mỗi camera. Tuy nhiên, nhấn một nút không chỉ đảo trạng thái bật/tắt của camera tương ứng mà còn đảo trạng thái của tất cả camera nối trực tiếp với nó.2

Bạn lo việc xâm nhập sẽ bị phát hiện nếu tương tác với hệ thống điều khiển quá nhiều. Hãy tính số lần nhấn nút ít nhất cần thiết để tắt tất cả camera.

Dữ liệu vào

Dòng đầu chứa số nguyên \(N\), là số camera trong bảo tàng.

Mỗi dòng trong \(N-1\) dòng tiếp theo chứa hai số nguyên \(a\)\(b\) (\(1\le a,b\le N\), \(a\ne b\)), cho biết camera \(a\) và camera \(b\) được nối trực tiếp bằng một dây.

Dòng cuối chứa \(N\) số nguyên. Số thứ \(i\) bằng \(1\) nếu camera \(i\) ban đầu đang bật, và bằng \(0\) nếu camera đó ban đầu đang tắt.

Dữ liệu ra

In một dòng chứa một số nguyên là số lần nhấn nút ít nhất để tắt tất cả camera, hoặc chuỗi impossible nếu không thể tắt tất cả camera.

Ràng buộc

  • \(3\le N\le100\,000\).
  • \(N-1\) dây nối tạo thành một mạng liên thông.
  • Mỗi camera ban đầu có trạng thái \(0\) hoặc \(1\).

Phân nhóm

  1. \(5\) điểm: \(N\le20\).
  2. \(15\) điểm: \(N\le40\).
  3. \(10\) điểm: hai camera \(A\)\(B\) nối trực tiếp với nhau khi và chỉ khi \(|A-B|=1\).
  4. \(40\) điểm: mỗi camera nối trực tiếp với nhiều nhất \(3\) camera khác.
  5. \(30\) điểm: không có ràng buộc thêm.

Ví dụ

Ví dụ 1

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

Hình sau minh họa ví dụ thứ nhất:

Một dãy thao tác tối ưu để tắt tất cả camera là lần lượt nhấn các nút ứng với camera \(4\), \(5\), \(3\)\(1\) theo đúng thứ tự này.

Ví dụ 2

Input
5
1 2
2 3
3 4
4 5
0 1 1 1 1
Output
impossible

Giới hạn

Thời gian: \(1\) giây. Bộ nhớ: \(512\) MiB.


  1. Bạn còn nhận ra sự phối hợp tuyệt vời giữa công việc phê bình nghệ thuật ban ngày và hoạt động trộm tác phẩm nghệ thuật ban đêm: chẳng hạn, có thể khảo sát địa điểm mà không gây nghi ngờ, hoặc nâng giá tác phẩm sắp trộm bằng cách đăng những bài đánh giá hết lời ca ngợi trước đó. 

  2. Hiển nhiên, đây là phép ẩn dụ về việc sức khỏe tinh thần và tâm trạng của chúng ta ảnh hưởng đến những người gần gũi nhất.