JOI 2023 - Kỳ thi mở

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 JOI 2023 - Ancient Machine 2 100 (p) 2.0s 1G
2 JOI 2023 - Cell Automaton 100 (p) 6.0s 2G
3 JOI 2023 - Garden 100 (p) 2.0s 1G

1. JOI 2023 - Ancient Machine 2

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

Bitaro và Bibako là hai nhà khảo cổ khai quật và nghiên cứu tàn tích của Vương quốc JOI. Trong tàn tích, Bitaro tìm thấy một phiến đá cổ, còn Bibako tìm thấy một cỗ máy cổ.

Qua nghiên cứu, Bitaro biết rằng trên phiến đá có một xâu \(S\) độ dài \(N\), mỗi ký tự là 0 hoặc 1. Tuy nhiên, anh chưa biết các ký tự của \(S\).

Bibako đã tìm ra cách sử dụng cỗ máy. Để đặt một câu hỏi, họ đặt phiến đá lên máy và nhập một số nguyên \(m\) cùng hai dãy số nguyên \(a,b\), thỏa mãn:

  • \(1 \le m \le 1002\).
  • Cả hai dãy \(a,b\) đều có độ dài \(m\).
  • Mỗi phần tử của \(a,b\) nằm trong đoạn từ \(0\) đến \(m-1\).

Máy xử lý một câu hỏi và hiển thị một số nguyên như sau:

  1. Máy đặt giá trị \(0\) vào vùng nhớ.
  2. Máy thực hiện \(N\) thao tác. Ở thao tác thứ \(i+1\) (\(0 \le i \le N-1\)), gọi \(x\) là giá trị hiện tại trong vùng nhớ. Máy đọc ký tự \(S_i\), với các ký tự của \(S\) được đánh số từ \(0\). Nếu \(S_i\)0, máy thay giá trị trong vùng nhớ bằng \(a_x\); nếu \(S_i\)1, máy thay giá trị đó bằng \(b_x\). Các phần tử của \(a,b\) cũng được đánh số từ \(0\).
  3. Máy hiển thị giá trị cuối cùng trong vùng nhớ.

Bitaro muốn dùng máy để xác định xâu trên phiến đá. Vì máy rất dễ hỏng, số câu hỏi không được vượt quá \(1000\). Ngoài ra, giá trị lớn nhất của \(m\) trong các câu hỏi cần nhỏ nhất có thể.

Hãy viết chương trình dùng cỗ máy để xác định xâu trên phiến đá.

Chi tiết cài đặt

Bạn cần nộp một tệp ancient2.cpp, dùng chỉ thị #include để khai báo tệp ancient2.h, và cài đặt hàm:

C++
std::string Solve(int N);

Hàm này được gọi đúng một lần cho mỗi bộ kiểm thử. Tham số N là độ dài của xâu \(S\) trên phiến đá. Hàm phải trả về chính xâu \(S\):

  • Xâu trả về phải có độ dài \(N\). Nếu không, chương trình bị chấm Wrong Answer [1].
  • Mỗi ký tự của xâu trả về phải là 0 hoặc 1. Nếu không, chương trình bị chấm Wrong Answer [2].
  • Xâu trả về phải trùng với \(S\). Nếu không, chương trình bị chấm Wrong Answer [3].

Chương trình có thể gọi hàm sau để đặt câu hỏi:

C++
int Query(int m, std::vector<int> a, std::vector<int> b);

m, a, b là số nguyên và hai dãy được nhập vào máy. Hàm trả về số nguyên mà máy hiển thị sau khi đặt phiến đá lên máy và xử lý câu hỏi với các tham số này.

  • m phải nằm trong đoạn từ \(1\) đến \(1002\). Nếu không, chương trình bị chấm Wrong Answer [4].
  • Độ dài của cả ab phải bằng m. Nếu không, chương trình bị chấm Wrong Answer [5].
  • Mỗi phần tử của ab phải nằm trong đoạn từ \(0\) đến \(m-1\). Nếu không, chương trình bị chấm Wrong Answer [6].
  • Không được gọi Query quá \(1000\) lần. Nếu vượt quá, chương trình bị chấm Wrong Answer [7].

Bạn có thể cài đặt các hàm phụ và sử dụng biến toàn cục. Chương trình không được sử dụng đầu vào chuẩn, đầu ra chuẩn, hay giao tiếp với tệp khác bằng bất kỳ cách nào. Tuy nhiê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 tệp hỗ trợ được đề gốc cung cấp qua trang kỳ thi chứa chương trình chấm mẫu và mã nguồn mẫu của chương trình cần nộp. Chương trình chấm mẫu là grader.cpp. Để thử chương trình, đặt grader.cpp, ancient2.cpp, ancient2.h trong cùng một thư mục và biên dịch bằng lệnh sau, hoặc chạy compile.sh trong gói hỗ trợ:

g++ -std=gnu++17 -O2 -o grader grader.cpp ancient2.cpp

Sau khi biên dịch thành công, tệp thực thi grader được tạo ra. Chương trình chấm thật khác chương trình chấm mẫu. Chương trình chấm mẫu chạy trong một tiến trình, đọc đầu vào chuẩn và ghi kết quả ra đầu ra chuẩn.

Dữ liệu vào

Chương trình chấm mẫu đọc dữ liệu từ đầu vào chuẩn theo định dạng:

N
S

Dữ liệu ra

Chương trình chấm mẫu ghi ra đầu ra chuẩn:

  • Nếu chương trình trả lời đúng, ghi giá trị lớn nhất của tham số m trong các lần gọi Query, chẳng hạn Accepted: 22. Nếu trả lời đúng mà không gọi Query, ghi Accepted: 0.
  • Nếu chương trình bị chấm Wrong Answer, ghi loại lỗi, chẳng hạn Wrong Answer [4].

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

Ràng buộc

  • \(N = 1000\).
  • \(S\) là xâu độ dài \(N\).
  • Mỗi ký tự của \(S\)0 hoặc 1.

Trong mỗi bộ kiểm thử, chương trình chấm thật không thích nghi: đáp án đã được cố định ngay từ đầu.

Phân nhóm

Nếu chương trình bị chấm Wrong Answer ở bất kỳ bộ kiểm thử nào, điểm của toàn bộ bài là \(0\).

Nếu chương trình trả lời đúng ở tất cả các bộ kiểm thử, gọi \(M\) là giá trị lớn nhất của tham số m trong mọi lần gọi Query trên tất cả các bộ kiểm thử. Nếu chương trình trả lời đúng mà không gọi Query trong bất kỳ bộ kiểm thử nào, đặt \(M=0\).

  • Nếu \(103 \le M \le 1002\), điểm của bài là \(10+\left\lfloor\dfrac{(1002-M)^2}{9000}\right\rfloor\).
  • Nếu \(0 \le M \le 102\), điểm của bài là \(100\).

Ở đây, \(\lfloor x\rfloor\) là số nguyên lớn nhất không vượt quá \(x\).

Ví dụ giao tiếp

Ví dụ 1

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

3
110

Giải thích

Bảng sau minh họa các lời gọi hàm tương ứng với đầu vào của chương trình chấm mẫu:

Lời gọi Solve Giá trị trả về của Solve Lời gọi Query Giá trị trả về của Query
Solve(3)
Query(4, [3, 3, 2, 2], [2, 2, 1, 0]) 3
Query(2, [0, 1], [1, 0]) 0
Query(1, [0], [0]) 0
Query(3, [1, 1, 1], [1, 1, 1]) 1
"110"

Giả sử xâu trên phiến đá là 110. Khi nhập \((m,a,b)=(4,[3,3,2,2],[2,2,1,0])\), máy hoạt động như sau:

  1. Đặt \(0\) vào vùng nhớ.
  2. Ở thao tác đầu tiên, \(S_0\)1, nên đặt \(b_0=2\) vào vùng nhớ.
  3. Ở thao tác thứ hai, \(S_1\)1, nên đặt \(b_2=1\) vào vùng nhớ.
  4. Ở thao tác thứ ba, \(S_2\)0, nên đặt \(a_1=3\) vào vùng nhớ.
  5. Giá trị cuối cùng trong vùng nhớ là \(3\), nên máy hiển thị \(3\).

Lưu ý rằng ví dụ này không thỏa mãn ràng buộc \(N=1000\). Trong các tệp mà đề gốc cung cấp qua trang kỳ thi, sample-02.txt thỏa mãn ràng buộc đó.

Nguồn

JOI Open Contest 2023 - Ancient Machine 2. Tác giả: Tomohito Hoshii. Đơn vị công bố: JCIOI (Ủy ban Nhật Bản về Olympic Tin học Quốc tế). Giấy phép: CC BY-SA 4.0.

2. JOI 2023 - Cell Automaton

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

Ta có một lưới hai chiều đủ lớn gồm các ô vuông, trải theo cả chiều ngang và chiều dọc. Chọn một ô làm gốc tọa độ. Ô \((x,y)\) là ô đến được khi đi từ gốc sang phải \(x\) ô và lên trên \(y\) ô. Đi sang trái \(a\) ô tương ứng với đi sang phải \(-a\) ô; đi xuống dưới \(a\) ô tương ứng với đi lên trên \(-a\) ô.

Tại thời điểm \(0\), các ô \((X_1,Y_1),(X_2,Y_2),\ldots,(X_N,Y_N)\) có màu đen, và tất cả các ô còn lại có màu trắng.

Với \(t=0,1,2,\ldots\), màu của các ô tại thời điểm \(t+1\) được xác định từ màu tại thời điểm \(t\) như sau:

  • Một ô màu đen tại thời điểm \(t\) chuyển thành màu xám tại thời điểm \(t+1\).
  • Một ô màu xám tại thời điểm \(t\) chuyển thành màu trắng tại thời điểm \(t+1\).
  • Một ô màu trắng tại thời điểm \(t\) chuyển thành màu đen tại thời điểm \(t+1\) nếu ít nhất một trong bốn ô kề cạnh với nó có màu đen tại thời điểm \(t\). Nếu không, ô đó vẫn có màu trắng.

\(Q\) truy vấn. Với truy vấn thứ \(j\) (\(1 \le j \le Q\)), hãy tìm số ô màu đen tại thời điểm \(T_j\).

Hãy viết chương trình trả lời các truy vấn khi biết màu của các ô tại thời điểm \(0\) và thông tin truy vấn.

Dữ liệu vào

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

N Q
X_1 Y_1
X_2 Y_2
...
X_N Y_N
T_1
T_2
...
T_Q

Dữ liệu ra

Ghi \(Q\) dòng ra đầu ra chuẩn. Dòng thứ \(j\) chứa số ô màu đen tại thời điểm \(T_j\).

Ràng buộc

  • \(1 \le N \le 100000\).
  • \(1 \le Q \le 500000\).
  • \(|X_i| \le 10^9\) (\(1 \le i \le N\)).
  • \(|Y_i| \le 10^9\) (\(1 \le i \le N\)).
  • \((X_i,Y_i) \ne (X_j,Y_j)\) (\(1 \le i < j \le N\)).
  • \(0 \le T_j \le 10^9\) (\(1 \le j \le Q\)).
  • \(T_j < T_{j+1}\) (\(1 \le j \le Q-1\)).
  • Tất cả các giá trị đầu vào đều là số nguyên.

Phân nhóm

  1. \(4\) điểm: \(\lvert X_i\rvert \le 50\), \(\lvert Y_i\rvert \le 50\) với mọi \(1 \le i \le N\); \(T_j \le 50\) với mọi \(1 \le j \le Q\).
  2. \(12\) điểm: \(\lvert X_i\rvert \le 1000\), \(\lvert Y_i\rvert \le 1000\) với mọi \(1 \le i \le N\); \(T_j \le 1000\) với mọi \(1 \le j \le Q\).
  3. \(8\) điểm: \(X_i=Y_i\) với mọi \(1 \le i \le N\); \(Q=1\).
  4. \(8\) điểm: \(X_i=Y_i\) với mọi \(1 \le i \le N\).
  5. \(17\) điểm: \(N \le 2000\); \(Q=1\).
  6. \(25\) điểm: \(N \le 2000\).
  7. \(26\) điểm: Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
2 3
0 2
1 0
0
1
2
Output
2
8
12
Giải thích

Hình dưới đây thể hiện màu các ô tại thời điểm \(0\). Có \(2\) ô màu đen, nên đáp án của truy vấn thứ nhất là \(2\).

Hình dưới đây thể hiện màu các ô tại thời điểm \(1\). Có \(8\) ô màu đen, nên đáp án của truy vấn thứ hai là \(8\).

Hình dưới đây thể hiện màu các ô tại thời điểm \(2\). Có \(12\) ô màu đen, nên đáp án của truy vấn thứ ba là \(12\).

Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,6,7\).

Ví dụ 2

Input
3 5
0 0
2 2
5 5
0
1
2
3
4
Output
3
12
21
24
26
Giải thích

Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,4,6,7\).

Ví dụ 3

Input
4 10
-3 -3
3 3
-4 4
4 -4
0
1
2
3
4
5
6
7
8
9
Output
4
16
32
48
56
56
55
56
60
64
Giải thích

Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,2,6,7\).

Nguồn

JOI Open Contest 2023 - Cell Automaton. Tác giả: Akihito Yoneyama. Đơn vị công bố: JCIOI (Ủy ban Nhật Bản về Olympic Tin học Quốc tế). Giấy phép: CC BY-SA 4.0.

3. JOI 2023 - Garden

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

Vương quốc JOI là một vương quốc bí ẩn có lãnh thổ rộng vô tận. Vua JOI-kun định dành một phần lãnh thổ để làm khu vườn của mình.

Lãnh thổ được xem như một lưới hai chiều đủ lớn gồm các ô vuông, trải theo cả chiều ngang và chiều dọc. Chọn một ô làm gốc tọa độ. Ô \((x,y)\) là ô đến được khi đi từ gốc sang phải \(x\) ô và lên trên \(y\) ô. Đi sang trái \(a\) ô tương ứng với đi sang phải \(-a\) ô; đi xuống dưới \(a\) ô tương ứng với đi lên trên \(-a\) ô.

Trên lãnh thổ có các tác phẩm nghệ thuật, được chia thành hai loại A và B theo cách bố trí:

  • \(N\) kiểu tác phẩm loại A. Với kiểu thứ \(i\) (\(1 \le i \le N\)), một tác phẩm được đặt ở mỗi ô có dạng \((P_i+kD,Q_i+lD)\), trong đó \(k,l\) là các số nguyên.
  • \(M\) kiểu tác phẩm loại B. Với kiểu thứ \(j\) (\(1 \le j \le M\)), một tác phẩm được đặt ở mỗi ô có dạng \((R_j+kD,y)\) với \(k,y\) nguyên, hoặc có dạng \((x,S_j+lD)\) với \(l,x\) nguyên.

Một ô có thể chứa nhiều tác phẩm thuộc các kiểu khác nhau.

JOI-kun sẽ chọn một vùng hình chữ nhật trên lưới làm vườn. Cụ thể, ông chọn bốn số nguyên \(a,b,c,d\); khu vườn gồm các ô \((x,y)\) với \(x,y\) nguyên thỏa mãn \(a \le x \le b\), \(c \le y \le d\).

Vì thích ngắm nhiều kiểu tác phẩm, JOI-kun muốn khu vườn chứa ít nhất một tác phẩm của mỗi kiểu trong \(N+M\) kiểu. Tuy nhiên, người dân sẽ tức giận nếu khu vườn quá lớn, nên ông muốn số ô trong vườn nhỏ nhất có thể mà vẫn thỏa mãn điều kiện trên.

Hãy viết chương trình tính số ô nhỏ nhất trong khu vườn của JOI-kun khi biết thông tin về các tác phẩm.

Dữ liệu vào

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

N M D
P_1 Q_1
P_2 Q_2
...
P_N Q_N
R_1 S_1
R_2 S_2
...
R_M S_M

Dữ liệu ra

Ghi một dòng ra đầu ra chuẩn, chứa số ô nhỏ nhất có thể trong khu vườn của JOI-kun.

Ràng buộc

  • \(N \ge 1\).
  • \(M \ge 1\).
  • \(N+M \le 500000\).
  • \(1 \le D \le 5000\).
  • \(0 \le P_i < D\) (\(1 \le i \le N\)).
  • \(0 \le Q_i < D\) (\(1 \le i \le N\)).
  • \(0 \le R_j < D\) (\(1 \le j \le M\)).
  • \(0 \le S_j < D\) (\(1 \le j \le M\)).
  • Tất cả các giá trị đầu vào đều là số nguyên.

Phân nhóm

  1. \(15\) điểm: \(M \le 8\).
  2. \(6\) điểm: \(D \le 10\); \(N+M \le 5000\).
  3. \(8\) điểm: \(D \le 50\); \(N+M \le 5000\).
  4. \(16\) điểm: \(D \le 100\); \(N+M \le 5000\).
  5. \(30\) điểm: \(N+M \le 5000\).
  6. \(25\) điểm: Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

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

Hình dưới đây biểu diễn các ô \((x,y)\) với \(x,y\) nguyên thỏa mãn \(0 \le x < 10\), \(0 \le y < 10\) trong lãnh thổ Vương quốc JOI.

Hình tròn và hình thoi lần lượt biểu diễn tác phẩm loại A và B. Số bên trong hình cho biết kiểu tác phẩm. Nếu chọn \(a=1,b=2,c=2,d=5\), khu vườn là vùng hình chữ nhật tô đen trong hình. Khi đó, vườn chứa ít nhất một tác phẩm của mỗi kiểu trong ba kiểu và có \(8\) ô. Không có khu vườn nào thỏa mãn điều kiện mà có ít ô hơn, nên xuất \(8\).

Ví dụ này thỏa mãn ràng buộc của tất cả các nhóm.

Ví dụ 2

Input
3 4 100
20 26
81 56
20 3
58 71
74 82
95 61
95 61
Output
2840
Giải thích

Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,4,5,6\).

Ví dụ 3

Input
5 7 5000
1046 365
4122 1166
4009 2896
1815 4065
4372 1651
2382 123
1475 836
3313 4005
2579 568
4300 4867
1050 3214
3589 4653
Output
10543092
Giải thích

Ví dụ này thỏa mãn ràng buộc của các nhóm \(1,5,6\).

Nguồn

JOI Open Contest 2023 - Garden. Tác giả: Yuto Watanabe. Đơn vị công bố: JCIOI (Ủy ban Nhật Bản về Olympic Tin học Quốc tế). Giấy phép: CC BY-SA 4.0.