CEOI 2025 - Boardgame Expo

Xem PDF



Dạng bài
Ngôn ngữ cho phép
C++
Điểm: 2600 (p) Thời gian: 2.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Đề bài

Hằng năm, một triển lãm trò chơi bàn lớn được tổ chức tại Cluj-Napoca, giới thiệu nhiều trò chơi mới. Điểm nhấn chính của năm nay là trò chơi BoardOina.

\(n\) người chơi đứng thành một hàng để chờ chơi thử. Họ được đánh số từ \(0\) đến \(n-1\) theo thứ tự trong hàng; người chơi \(0\) đứng đầu hàng và người chơi \(n-1\) đứng cuối hàng.

\(m\) quan hệ bạn bè phân biệt giữa \(m\) cặp người chơi. Với mỗi \(i\) từ \(0\) đến \(m-1\), người chơi \(X[i]\) và người chơi \(Y[i]\) là bạn, trong đó \(0\le X[i]<Y[i]<n\). Quan hệ bạn bè có tính đối xứng.

Xét \(k\) người liên tiếp bắt đầu từ người chơi \(s\), với \(0\le s<n\)\(1\le k\le n-s\). Dãy người chơi này tạo thành một nhóm bạn kích thước \(k\) nếu mọi cặp người trong nhóm đều được nối với nhau bởi một dãy quan hệ bạn bè chỉ đi qua những người thuộc nhóm. Cụ thể, các người chơi \(s,s+1,\ldots,s+k-1\) tạo thành một nhóm bạn nếu với mọi \(u,v\) thỏa mãn \(s\le u<v<s+k\), tồn tại một dãy người chơi \(p[0],\ldots,p[l-1]\) sao cho:

  • \(l\ge2\);
  • \(s\le p[j]<s+k\) với mọi \(0\le j<l\);
  • \(p[0]=u\)\(p[l-1]=v\);
  • \(p[j]\)\(p[j+1]\) là bạn với mọi \(0\le j<l-1\).

Khi \(k=1\), riêng người chơi \(s\) cũng tạo thành một nhóm bạn kích thước \(1\).

BoardOina có thể được chơi bởi bất kỳ số người nào, nhưng để trò chơi hấp dẫn hơn, ban tổ chức chỉ cho các nhóm bạn tham gia.

Mỗi lần chỉ có một nhóm được chơi. Trong mỗi ván, một nhóm bạn bắt đầu tại người đang đứng đầu hàng được lập ra và bắt đầu chơi; sau đó những người trong nhóm này rời khỏi hàng. Quá trình lặp lại cho đến khi hàng trống.

Nói một cách chính thức, hàng người có thể được chia thành \(g\) nhóm bạn nếu tồn tại mảng kích thước nhóm

\[ K=[K[0],K[1],\ldots,K[g-1]] \]

thỏa mãn tất cả các điều kiện sau:

  • \(g>0\)\(K[j]>0\) với mọi \(0\le j<g\);
  • tổng kích thước các nhóm bằng \(n\):
\[ K[0]+K[1]+\cdots+K[g-1]=n; \]
  • với mỗi \(j\) từ \(0\) đến \(g-1\), các người chơi \(s[j],s[j]+1,\ldots,s[j]+K[j]-1\) tạo thành một nhóm bạn kích thước \(K[j]\), trong đó \(s[0]=0\) và, nếu \(j>0\),
\[ s[j]=K[0]+K[1]+\cdots+K[j-1]. \]

Ban tổ chức muốn số nhóm tham gia là nhỏ nhất. Hãy tìm một cách chia hàng thành số nhóm bạn ít nhất và trả về mảng kích thước các nhóm.

Chi tiết cài đặt

Bạn cần cài đặt hàm sau:

C++
std::vector<int> partition_players(
    int n,
    int m,
    std::vector<int> X,
    std::vector<int> Y
);
  • n: số người chơi trong hàng.
  • m: số quan hệ bạn bè.
  • X, Y: hai mảng độ dài \(m\) mô tả các quan hệ bạn bè.
  • Hàm phải trả về mảng kích thước các nhóm, biểu diễn một cách chia hàng thành số nhóm bạn ít nhất.
  • Hàm được gọi đúng một lần cho mỗi bộ kiểm thử.

Nếu có nhiều cách chia đạt số nhóm ít nhất, bạn có thể trả về bất kỳ cách nào trong số đó.

Ràng buộc

  • \(2\le n\le100\,000\).
  • \(0\le m\le200\,000\).
  • \(0\le X[i]<Y[i]<n\) với mọi \(0\le i<m\).
  • Các quan hệ bạn bè đôi một phân biệt: với mọi \(0\le i<j<m\), ta có \(X[i]\ne X[j]\) hoặc \(Y[i]\ne Y[j]\).

Phân nhóm

  • Phân nhóm 1 (5 điểm): \(Y[i]=X[i]+1\) với mọi \(0\le i<m\).
  • Phân nhóm 2 (7 điểm): \(Y[i]\le X[i]+2\) với mọi \(0\le i<m\).
  • Phân nhóm 3 (6 điểm): \(n\le300\)\(m\le600\).
  • Phân nhóm 4 (15 điểm): \(n\le2\,000\)\(m\le4\,000\).
  • Phân nhóm 5 (34 điểm): Không có chu trình quan hệ bạn bè. Cụ thể, với mọi dãy người chơi đôi một phân biệt \(p[0],p[1],\ldots,p[l-1]\)\(l\ge3\), nếu \(p[j]\)\(p[j+1]\) là bạn với mọi \(0\le j<l-1\) thì \(p[0]\)\(p[l-1]\) không phải là bạn.
  • Phân nhóm 6 (33 điểm): Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
partition_players(5, 3, {0, 1, 3}, {1, 4, 4})
Output
{2, 1, 2}
Giải thích

Trong ví dụ này, các cặp người chơi \((0,1)\), \((1,4)\)\((3,4)\) là bạn.

Người chơi \(2\) không có người bạn nào trong hàng nên bắt buộc phải tạo thành một nhóm riêng. Do đó cần ít nhất \(3\) nhóm. Mặt khác, hai người chơi \(0,1\) có thể tạo thành một nhóm kích thước \(2\), và hai người chơi \(3,4\) cũng vậy. Vì thế có thể chia hàng thành ba nhóm kích thước \(2,1,2\).

Ví dụ 2

Input
partition_players(7, 6, {0, 4, 2, 1, 2, 3}, {1, 5, 4, 5, 5, 6})
Output
{2, 1, 1, 2, 1}
Giải thích

Trong ví dụ này, các cặp \((0,1)\), \((4,5)\), \((2,4)\), \((1,5)\), \((2,5)\)\((3,6)\) là bạn.

Người bạn duy nhất của người chơi \(3\) là người chơi \(6\). Vì vậy, một nhóm bạn chứa người chơi \(3\) hoặc chỉ gồm riêng người chơi \(3\), hoặc phải chứa cả người chơi \(6\). Trường hợp thứ hai còn buộc nhóm chứa cả người chơi \(4\)\(5\), nhưng người chơi \(6\) chỉ là bạn với người chơi \(3\), nên \(3\) không thể kết nối với \(4,5\) trong nhóm ấy. Do đó người chơi \(3\) phải ở một nhóm riêng. Tương tự, người chơi \(6\) cũng phải ở một nhóm riêng, nên cần ít nhất \(4\) nhóm.

Ba người chơi \(0,1,2\) không tạo thành một nhóm bạn: trong phạm vi nhóm đó, cả \(0\) lẫn \(1\) đều không kết nối được với \(2\). Nếu người chơi \(5\) cũng nằm trong nhóm thì điều này không còn đúng, nhưng do \(3\)\(4\) chắc chắn thuộc hai nhóm khác nhau nên trường hợp ấy không thể xảy ra. Vì vậy cần ít nhất \(5\) nhóm.

Mặt khác, các cặp người chơi \(0,1\)\(4,5\) lần lượt tạo thành hai nhóm kích thước \(2\). Do đó có thể chia hàng thành năm nhóm kích thước \(2,1,1,2,1\).

Trình chấm mẫu

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

  • Dòng \(1\): n m.
  • Dòng \(2+i\) với \(0\le i<m\): X[i] Y[i].

Gọi mảng do partition_players trả về là \(K[0],K[1],\ldots,K[g-1]\). Trình chấm mẫu in:

  • Dòng \(1\): \(g\).
  • Dòng \(2\): K[0] K[1] ... K[g-1].

Tệp

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: