JOI 2016 Final Camp - Ngày 2

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 JOI 2016 - Employment 100 (p) 5.0s 512M
2 JOI 2016 - Sandwich 100 (p) 5.0s 256M
3 JOI 2016 - Toilets 100 (p) 1.0s 256M

1. JOI 2016 - Employment

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

Bạn có biết công ty Just Odd Inventions không? Công việc của công ty này là tạo ra “những phát minh kỳ lạ” (just odd inventions). Sau đây, ta gọi tắt công ty này là JOI.

Để mở rộng hoạt động kinh doanh, công ty JOI quyết định tuyển thêm nhân viên.

\(N\) ứng viên, được đánh số từ \(1\) đến \(N\). Mỗi ứng viên có một số nguyên gọi là điểm đánh giá.

Trong đợt tuyển dụng này, công ty sẽ tuyển tất cả các ứng viên có điểm đánh giá không nhỏ hơn một ngưỡng nhất định. Những nhân viên mới được tuyển sẽ được chia thành các nhóm sao cho thỏa mãn điều kiện sau:

  • Nếu cả ứng viên \(a\) và ứng viên \(b\), với \(a < b\), đều được tuyển, thì họ thuộc cùng một nhóm khi và chỉ khi mọi ứng viên \(c\) với \(a \le c \le b\) đều được tuyển.

Là người phụ trách nhân sự của công ty JOI, bạn cần ước tính số nhóm được tạo ra trong đợt tuyển dụng này bằng cách xử lý lần lượt \(M\) truy vấn. Truy vấn thứ \(j\) thuộc một trong hai loại sau:

  • Tìm số nhóm được tạo ra nếu tuyển tất cả các ứng viên có điểm đánh giá không nhỏ hơn \(B_j\). Loại truy vấn này được gọi là truy vấn hỏi.
  • Cập nhật điểm đánh giá của ứng viên \(C_j\) thành \(D_j\). Loại truy vấn này được gọi là truy vấn cập nhật.

Yêu cầu

Cho thông tin về \(M\) truy vấn, hãy viết chương trình tìm số nhóm ứng với mỗi truy vấn hỏi.

Dữ liệu vào

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

  • Dòng đầu tiên chứa hai số nguyên \(N, M\), cách nhau bởi dấu cách: có \(N\) ứng viên và bạn cần xử lý \(M\) truy vấn.
  • Trong \(N\) dòng tiếp theo, dòng thứ \(i\) (\(1 \le i \le N\)) chứa số nguyên \(A_i\), là điểm đánh giá của ứng viên \(i\) trước khi xử lý các truy vấn.
  • Trong \(M\) dòng tiếp theo, dòng thứ \(j\) (\(1 \le j \le M\)) chứa hai hoặc ba số nguyên, cách nhau bởi dấu cách. Gọi số nguyên đầu tiên là \(T_j\). Nội dung dòng này là một trong hai dạng:
  • Nếu \(T_j = 1\), dòng chứa hai số nguyên \(T_j, B_j\). Đây là truy vấn hỏi số nhóm được tạo ra nếu tuyển tất cả các ứng viên có điểm đánh giá không nhỏ hơn \(B_j\).
  • Nếu \(T_j = 2\), dòng chứa ba số nguyên \(T_j, C_j, D_j\). Đây là truy vấn cập nhật điểm đánh giá của ứng viên \(C_j\) thành \(D_j\).

Dữ liệu ra

Với mỗi truy vấn hỏi, in ra đầu ra chuẩn số nhóm tương ứng trên một dòng, theo đúng thứ tự các truy vấn.

Ràng buộc

Tất cả dữ liệu vào thỏa mãn các điều kiện sau:

  • \(1 \le N \le 200\,000\).
  • \(1 \le M \le 200\,000\).
  • \(1 \le A_i \le 1\,000\,000\,000\) (\(1 \le i \le N\)).
  • \(1 \le T_j \le 2\) (\(1 \le j \le M\)).
  • \(1 \le B_j \le 1\,000\,000\,000\) (\(1 \le j \le M\)).
  • \(1 \le C_j \le N\) (\(1 \le j \le M\)).
  • \(1 \le D_j \le 1\,000\,000\,000\) (\(1 \le j \le M\)).
  • Có ít nhất một chỉ số \(j\) (\(1 \le j \le M\)) sao cho \(T_j = 1\).

Phân nhóm

  1. 10 điểm: \(N \le 2\,000\)\(M \le 2\,000\).
  2. 30 điểm: \(T_j = 1\) với mọi \(1 \le j \le M\).
  3. 60 điểm: Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
5 4
8
6
3
5
4
1 5
2 4 1
1 5
1 3
Output
2
1
2
Giải thích
  1. Truy vấn thứ nhất là truy vấn hỏi. Những ứng viên có điểm đánh giá không nhỏ hơn \(5\) là các ứng viên \(1, 2, 4\). Khi tuyển họ, có hai nhóm được tạo ra: nhóm gồm các ứng viên \(1, 2\) và nhóm chỉ gồm ứng viên \(4\). Vì vậy, in ra \(2\).
  2. Truy vấn thứ hai là truy vấn cập nhật. Điểm đánh giá của ứng viên \(4\) được cập nhật thành \(1\).
  3. Truy vấn thứ ba là truy vấn hỏi. Những ứng viên có điểm đánh giá không nhỏ hơn \(5\) là các ứng viên \(1, 2\). Khi tuyển họ, chỉ có một nhóm gồm các ứng viên \(1, 2\) được tạo ra. Vì vậy, in ra \(1\).
  4. Truy vấn thứ tư là truy vấn hỏi. Những ứng viên có điểm đánh giá không nhỏ hơn \(3\) là các ứng viên \(1, 2, 3, 5\). Khi tuyển họ, có hai nhóm được tạo ra: nhóm gồm các ứng viên \(1, 2, 3\) và nhóm chỉ gồm ứng viên \(5\). Vì vậy, in ra \(2\).

Ví dụ 2

Input
7 5
13
19
1
15
13
1
19
1 20
1 1
1 6
1 11
1 17
Output
0
1
3
3
2
Giải thích

Dữ liệu vào của ví dụ 2 thỏa mãn các ràng buộc của subtask 2.

Ví dụ 3

Input
10 5
8
10
15
2
2
8
5
12
11
4
1 5
2 8 4
1 12
2 5 11
1 16
Output
2
1
0

2. JOI 2016 - Sandwich

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

JOI đang tham dự buổi giao lưu của IOI. Tại buổi giao lưu, những chiếc bánh sandwich được xếp trên một lưới ô vuông gồm \(R\) hàng và \(C\) cột. Mỗi chiếc bánh có dạng tam giác vuông cân với hai cạnh góc vuông có độ dài bằng cạnh của một ô. Trong mỗi ô có hai chiếc bánh được đặt sao cho hai cạnh huyền tiếp xúc với nhau. Hình dưới đây minh họa một cách xếp bánh.

Hình 1. Ví dụ về cách xếp bánh sandwich.

Không thể lấy một chiếc bánh nếu đồng thời thỏa mãn cả hai điều kiện sau:

  • Cạnh huyền của nó tiếp xúc với một chiếc bánh khác chưa được lấy đi.
  • Ít nhất một trong hai cạnh còn lại của nó tiếp xúc với một chiếc bánh khác chưa được lấy đi.

Mọi chiếc bánh không thỏa mãn đồng thời hai điều kiện trên đều có thể được lấy đi.

Gọi trạng thái chưa có chiếc bánh nào được lấy đi là trạng thái ban đầu. Xuất phát từ trạng thái ban đầu, để lấy một chiếc bánh nào đó, có thể cần phải lấy một số chiếc bánh khác trước. Tùy vào cách xếp bánh, cũng có thể có những chiếc bánh không thể lấy được.

JOI muốn ăn cả hai chiếc bánh nằm trong cùng một ô, nhưng chưa quyết định sẽ chọn ô nào. Cậu muốn biết, xuất phát từ trạng thái ban đầu, số chiếc bánh ít nhất phải lấy để lấy được cả hai chiếc bánh trong một ô nhất định.

Yêu cầu

Cho cách xếp bánh, hãy viết chương trình xác định với mỗi ô xem có thể lấy được cả hai chiếc bánh trong ô đó bằng cách lần lượt lấy một số chiếc bánh từ trạng thái ban đầu hay không. Nếu có thể, hãy tìm số chiếc bánh ít nhất phải lấy. Số lượng này bao gồm cả hai chiếc bánh trong ô cần lấy.

Dữ liệu vào

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

  • Dòng đầu tiên chứa hai số nguyên \(R, C\), cách nhau bởi dấu cách, cho biết bánh được xếp trên một lưới ô vuông gồm \(R\) hàng và \(C\) cột.
  • Trong \(R\) dòng tiếp theo, dòng thứ \(i\) (\(1 \le i \le R\)) chứa một xâu gồm \(C\) ký tự, mỗi ký tự là N hoặc Z. Ký tự thứ \(j\) từ trái sang (\(1 \le j \le C\)) mô tả cách xếp bánh trong ô ở hàng thứ \(i\) từ trên xuống, cột thứ \(j\) từ trái sang. Hai ký tự NZ lần lượt biểu diễn các cách xếp trong hình dưới đây.

Hình 2. Cách xếp bánh sandwich trong mỗi ô: N ở bên trái, Z ở bên phải.

Dữ liệu ra

In ra đầu ra chuẩn \(R\) dòng. Dòng thứ \(i\) (\(1 \le i \le R\)) chứa \(C\) số nguyên, cách nhau bởi dấu cách. Số thứ \(j\) (\(1 \le j \le C\)) là số chiếc bánh ít nhất phải lấy để lấy được cả hai chiếc bánh trong ô ở hàng thứ \(i\) từ trên xuống, cột thứ \(j\) từ trái sang. Nếu không thể lấy được cả hai chiếc bánh trong ô đó, in ra \(-1\).

Ràng buộc

Tất cả dữ liệu vào thỏa mãn các điều kiện sau:

\[ 1 \le R \le 400. \]
\[ 1 \le C \le 400. \]

Phân nhóm

  1. 35 điểm: \(R \le 50\)\(C \le 50\).
  2. 65 điểm: Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
2 3
NZN
ZZN
Output
10 8 2
8 6 4
Giải thích

Cách xếp bánh trong ví dụ 1 tương ứng với Hình 1 trong đề bài.

Chẳng hạn, để lấy cả hai chiếc bánh trong ô ở hàng thứ \(2\) từ trên xuống, cột thứ \(2\) từ trái sang, có thể lấy bánh theo thứ tự sau:

  1. Lấy chiếc bánh ở phía trên bên phải của ô ở hàng \(1\), cột \(3\).
  2. Lấy chiếc bánh ở phía dưới bên trái của ô ở hàng \(1\), cột \(3\).
  3. Lấy chiếc bánh ở phía trên bên phải của ô ở hàng \(2\), cột \(3\).
  4. Lấy chiếc bánh ở phía dưới bên trái của ô ở hàng \(2\), cột \(3\).
  5. Lấy chiếc bánh ở phía dưới bên phải của ô ở hàng \(2\), cột \(2\).
  6. Lấy chiếc bánh ở phía trên bên trái của ô ở hàng \(2\), cột \(2\).

Tổng cộng phải lấy \(6\) chiếc bánh. Đây là số lượng ít nhất, nên kết quả cho ô này là \(6\).

Ví dụ 2

Input
2 2
NZ
ZN
Output
-1 -1
-1 -1
Giải thích

Trong trường hợp này, không thể lấy được bất kỳ chiếc bánh nào.

Ví dụ 3

Input
5 5
NZZZN
NNNZN
NNZNN
NZNNN
NZZZN
Output
10 12 14 16 2
8 -1 -1 -1 4
6 -1 -1 -1 6
4 -1 -1 -1 8
2 16 14 12 10

3. JOI 2016 - Toilets

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

Gần địa điểm thi của Kỳ thi Olympic Tin học Quốc tế tổ chức tại Nhật Bản có hai nhà vệ sinh. Một nhà vệ sinh chỉ dành cho nữ, còn nhà vệ sinh kia dùng chung cho cả nam và nữ. Nữ có thể sử dụng cả hai nhà vệ sinh, còn nam chỉ có thể sử dụng nhà vệ sinh chung.

Sau khi cuộc thi kết thúc, \(2N\) thí sinh xếp thành một hàng để sử dụng nhà vệ sinh. Mỗi thí sinh trong hàng là nam hoặc nữ. Các thí sinh lần lượt sử dụng nhà vệ sinh theo những quy tắc sau:

  • Nếu thí sinh đứng đầu hàng là nữ, người đó vào một nhà vệ sinh đang trống. Nếu cả hai nhà vệ sinh đều trống, người đó vào nhà vệ sinh dành riêng cho nữ.
  • Nếu thí sinh đứng đầu hàng là nam, áp dụng các quy tắc sau:
  • Nếu nhà vệ sinh chung đang trống, người đứng đầu hàng vào nhà vệ sinh chung.
  • Nếu nhà vệ sinh chung không trống nhưng nhà vệ sinh dành riêng cho nữ đang trống, thí sinh nữ đứng gần đầu hàng nhất trong số những người còn đang xếp hàng rời khỏi hàng và vào nhà vệ sinh dành riêng cho nữ.

Mọi thí sinh đều mất \(1\) phút kể từ khi vào đến khi ra khỏi nhà vệ sinh. Có thể bỏ qua thời gian di chuyển đến nhà vệ sinh.

Bạn muốn sắp xếp lại hàng từ trước để đến thời điểm sau \(N\) phút, tất cả các thí sinh đều đã sử dụng xong nhà vệ sinh.

Với một cách sắp xếp lại hàng, mức độ bất mãn của mỗi thí sinh được định nghĩa như sau:

  • Mức độ bất mãn của một thí sinh là số người vốn đứng sau người đó trước khi sắp xếp lại, nhưng lại đứng trước người đó sau khi sắp xếp lại.

Định nghĩa này không tính những thay đổi thứ tự xảy ra khi các thí sinh thực sự vào nhà vệ sinh.

Trong số các cách sắp xếp lại hàng để tất cả thí sinh đều sử dụng xong nhà vệ sinh sau \(N\) phút, bạn muốn làm cho mức độ bất mãn lớn nhất của các thí sinh nhỏ nhất có thể.

Yêu cầu

Cho thông tin về \(2N\) thí sinh đang xếp hàng, hãy viết chương trình xác định xem có thể sắp xếp lại hàng để đến thời điểm sau \(N\) phút, tất cả mọi người đều đã sử dụng xong nhà vệ sinh hay không. Nếu có thể, hãy tìm giá trị nhỏ nhất có thể của mức độ bất mãn lớn nhất.

Dữ liệu vào

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

  • Dòng đầu tiên chứa số nguyên \(N\), cho biết có \(2N\) thí sinh đang xếp hàng.
  • Dòng thứ hai chứa số nguyên \(M\). Giá trị \(M\) và dữ liệu ở \(M\) dòng tiếp theo mô tả các thí sinh trong hàng.
  • Trong \(M\) dòng tiếp theo, dòng thứ \(i\) (\(1 \le i \le M\)) chứa xâu \(S_i\) và số nguyên \(K_i\), cách nhau bởi dấu cách.

Từ dữ liệu này, xác định xâu \(X\) có độ dài \(2N\) biểu diễn hàng thí sinh như sau:

  • \(X\) được tạo thành bằng cách nối lần lượt các xâu \(X_1, \ldots, X_M\) theo thứ tự đó.
  • Xâu \(X_i\) (\(1 \le i \le M\)) được tạo thành bằng cách nối \(K_i\) bản sao của xâu \(S_i\).

Ký tự thứ \(j\) từ trái sang của \(X\) (\(1 \le j \le 2N\)) cho biết giới tính của thí sinh thứ \(j\) tính từ đầu hàng: M là nam và F là nữ.

Dữ liệu ra

In ra đầu ra chuẩn trên một dòng giá trị nhỏ nhất có thể của mức độ bất mãn lớn nhất. Nếu không có cách sắp xếp lại hàng nào để tất cả mọi người đều sử dụng xong nhà vệ sinh sau \(N\) phút, in ra \(-1\).

Ràng buộc

Tất cả dữ liệu vào thỏa mãn các điều kiện sau:

  • \(1 \le N \le 1\,000\,000\,000\,000\,000\,000 = 10^{18}\).
  • \(1 \le M \le 100\,000\).
  • \(1 \le K_i \le 2N \qquad (1 \le i \le M)\).
  • \(1 \le |S_i| \le 2N \qquad (1 \le i \le M)\).

Mỗi ký tự của xâu \(S_i\) (\(1 \le i \le M\)) là M hoặc F.

  • \(|S_1| + |S_2| + \cdots + |S_M| \le 200\,000\).

Xâu \(X\) được xác định từ dữ liệu vào có độ dài bằng \(2N\). Ở đây, \(|S_i|\) là độ dài của xâu \(S_i\).

Phân nhóm

  1. 14 điểm: \(N \le 10\), \(M = 1\)\(K_1 = 1\).
  2. 22 điểm: \(N \le 100\,000\), \(M = 1\)\(K_1 = 1\).
  3. 64 điểm: Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
6
1
FFFMMMMMMFFF 1
Output
2
Giải thích

Trong ví dụ 1, có \(12\) thí sinh đang xếp thành một hàng. Sắp xếp lại hàng như sau:

  1. Di chuyển thí sinh đứng thứ \(4\) từ đầu hàng lên phía trước \(2\) vị trí.
  2. Di chuyển thí sinh đứng thứ \(5\) từ đầu hàng lên phía trước \(2\) vị trí.

Với cách sắp xếp này, mức độ bất mãn lớn nhất là \(2\). Sau khi sắp xếp lại, xâu biểu diễn hàng thí sinh là FMMFFMMMMFFF (M là nam, F là nữ).

Gọi thí sinh đứng thứ \(i\) từ đầu hàng sau khi sắp xếp lại là thí sinh \(i\) (\(1 \le i \le 12\)). Các thí sinh sử dụng nhà vệ sinh như sau:

  1. Thí sinh \(1\) và thí sinh \(2\) sử dụng nhà vệ sinh.
  2. Sau \(1\) phút, thí sinh \(3\) và thí sinh \(4\) sử dụng nhà vệ sinh.
  3. Sau thêm \(1\) phút, thí sinh \(5\) và thí sinh \(6\) sử dụng nhà vệ sinh.
  4. Sau thêm \(1\) phút, thí sinh \(7\) và thí sinh \(10\) sử dụng nhà vệ sinh.
  5. Sau thêm \(1\) phút, thí sinh \(8\) và thí sinh \(11\) sử dụng nhà vệ sinh.
  6. Sau thêm \(1\) phút, thí sinh \(9\) và thí sinh \(12\) sử dụng nhà vệ sinh.

Không có cách sắp xếp lại hàng thỏa mãn yêu cầu mà mức độ bất mãn lớn nhất nhỏ hơn \(2\), nên in ra \(2\).

Ví dụ 2

Input
6
1
MMFFMMMMFFMF 1
Output
-1
Giải thích

Không có cách sắp xếp lại hàng nào để tất cả mọi người đều sử dụng xong nhà vệ sinh sau \(6\) phút.

Ví dụ 3

Input
6
1
MFFFMFMMFFFM 1
Output
0

Ví dụ 4

Input
6
4
M 1
F 2
FM 2
MFFFM 1
Output
0
Giải thích

Trong ví dụ 3 và ví dụ 4, xâu \(X\) được xác định từ dữ liệu vào là như nhau, đều bằng MFFFMFMMFFFM.