Beginner Free Contest 45 - MAXGRID
Xem dạng PDF
Gửi bài giải
Điểm:
0,20 (OI)
Giới hạn thời gian:
1.0s
Giới hạn bộ nhớ:
512M
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch
Trong trường hợp đề bài hiển thị không chính xác, bạn có thể tải đề bài tại đây: Đề bài
Lưu ý: các bạn không nhập, xuất dữ liệu bằng file kể cả khi đề bài có yêu cầu. Đọc, ghi dữ liệu được thực hiện ở stdin và stdout.
Bình luận
Nhận xét 1: Bản chất của phép thuật
Mỗi lần phép thuật cho phép đổi dấu đồng thời hai ô kề nhau (chung cạnh). Do đó, trong mỗi thao tác:
Đây là ràng buộc duy nhất của bài toán.
Nhận xét 2: Trạng thái “lý tưởng”
Với mỗi ô có giá trị (x), đóng góp lớn nhất của nó vào tổng là (|x|). Nếu không có ràng buộc nào, tổng lớn nhất có thể đạt được là:
S =
sum(|A_{i,j}|)Nhận xét 3: Khả năng đạt trạng thái lý tưởng
Xét hai trường hợp:
🔹 Trường hợp 1: Số phần tử âm ban đầu là chẵn
Do tính chẵn lẻ là bất biến, ta có thể thực hiện các phép đổi dấu để triệt tiêu toàn bộ số âm. Khi đó, tất cả các ô đều không âm và đạt trạng thái lý tưởng.
Đáp án =
S🔹 Trường hợp 2: Số phần tử âm ban đầu là lẻ
Khi đó, bắt buộc phải tồn tại ít nhất một ô mang giá trị âm ở trạng thái cuối cùng.
Giả sử ô này có giá trị (-k) với (k > 0). So với trạng thái lý tưởng (đóng góp (+k)), ô này chỉ đóng góp (-k).
→ Mức suy giảm của tổng là:
(+k) - (-k) = 2kĐể tổng cuối cùng là lớn nhất, ta cần giảm thiệt hại này xuống nhỏ nhất, tức là chọn ô có trị tuyệt đối nhỏ nhất.
Gọi: mn =
min(A_{i,j})Khi đó: Đáp án =
S - 2 * mnNhận xét 4: Điều kiện “kề nhau” không làm mất tính tổng quát
Mặc dù mỗi phép thuật chỉ áp dụng cho hai ô kề nhau, nhưng:
Do đó, ta có thể chọn bất kỳ ô nào để giữ dấu âm, miễn là tôn trọng tính chẵn lẻ.
Thuật toán
Duyệt toàn bộ bảng:
sum(|A_{i,j}))cntNegmn = min |A_{i,j}|cntNegchẵn → inSS - 2 * mnĐộ phức tạp
Phù hợp với ràng buộc (N \cdot M \le 10^6).
Code C++ (tham khảo)
Kết luận
xin ắp vốt