| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2015 - Inheritance | 100 (p) | 1.0s | 256M |
| 2 | JOI 2015 - Limited Memory | 100 (p) | 5.0s | 256M |
| 3 | JOI 2015 - Walls | 100 (p) | 3.0s | 256M |
Ông JOI, một đại gia sở hữu toàn bộ đường sắt của quốc gia IOI, đã qua đời. Các tuyến đường sắt sẽ được chia thừa kế theo di chúc của ông.
Quốc gia IOI có \(N\) thành phố và \(M\) tuyến đường sắt. Các thành phố được đánh số từ \(1\) đến \(N\), các tuyến đường sắt được đánh số từ \(1\) đến \(M\). Tuyến \(i\) nối hai chiều thành phố \(A_i\) và \(B_i\), đồng thời mang lại doanh thu \(C_i\) yên mỗi năm. Vì lượng hành khách và giá vé khác nhau, các giá trị \(C_1,\ldots,C_M\) đôi một khác nhau. Có thể có nhiều tuyến nối cùng một cặp thành phố.
Di chúc quy định cách chia thừa kế như sau:
Giống cha mình, mỗi người con đều tham lam và chọn phần thừa kế sao cho tổng doanh thu hằng năm lớn nhất có thể. Có thể chứng minh rằng đối với mỗi người, cách chọn đạt tổng doanh thu lớn nhất là duy nhất.
Hãy xác định người thừa kế của từng tuyến đường sắt.
In ra \(M\) dòng. Dòng thứ \(i\) chứa số hiệu người con thừa kế tuyến \(i\); nếu tuyến đó được hiến tặng cho quốc gia IOI, in ra 0.
Ví dụ 1
3 5 2
1 2 3
1 2 1
2 3 4
2 3 6
1 3 2
1
0
2
1
2
Ví dụ 2
3 6 5
1 2 1
1 2 2
2 3 3
2 3 4
3 1 5
3 1 6
4
3
2
1
2
1
Số tuyến được thừa kế có thể khác nhau giữa các người con. Có thể có người không thừa kế tuyến nào.
JOI-chan được chọn vào đội tuyển Nhật Bản dự thi Olympic Tin học Quốc tế. Để nâng cao kỹ năng xử lý thông tin của cô, chủ tịch K của Ủy ban Olympic Tin học Nhật Bản giao cho cô bài toán sau.
Chủ tịch K bí mật viết một chuỗi \(S\) vào sổ. Chuỗi chỉ gồm bốn ký tự <, >, [, ]. Ông đưa cho JOI-chan một tờ giấy ghi nội dung bài toán và độ dài của \(S\).
JOI-chan phải xác định \(S\) có phải một chuỗi tốt hay không. Chuỗi tốt được định nghĩa như sau:
<x> là chuỗi tốt.[x] là chuỗi tốt.Ví dụ, <>[] và [<>]<> là chuỗi tốt; >< và [<]> không phải chuỗi tốt.
Mỗi ngày vào buổi trưa, JOI-chan được gọi cho chủ tịch K nhiều nhất một lần. Trong cuộc gọi, cô chỉ định một số nguyên \(I\) và được biết ký tự thứ \(I\) của \(S\).
JOI-chan không được ghi chép. Mỗi tối cô đi ngủ lúc 22 giờ và thức dậy lúc 6 giờ; qua giấc ngủ cô chỉ có thể ghi nhớ \(22\) bit thông tin. Chính xác hơn, trước khi ngủ cô có thể ghi nhớ một số nguyên từ \(0\) đến \(2^{22}-1\), và ngày hôm sau chỉ được dựa vào số đã nhớ. Cô luôn có thể xem độ dài \(S\) trên tờ giấy.
Thay vì ghi nhớ một số trước khi ngủ, JOI-chan có thể gửi email trả lời rằng \(S\) là hoặc không phải là chuỗi tốt; khi đó bài toán kết thúc. Nếu không gửi câu trả lời trong vòng \(15\,000\) ngày kể từ khi bắt đầu, cô bị chấm sai.
Cài đặt chiến lược của JOI-chan để luôn trả lời đúng.
Nộp một tệp C++ cài đặt hàm sau:
#include "Memory_lib.h"
int Memory(int N, int M);
Hệ thống cung cấp:
char Get(int I);
Memoryint Memory(int N, int M);
Hàm mô tả hành động của JOI-chan trong một ngày:
N là độ dài chuỗi \(S\).M là số được ghi nhớ từ đêm trước. Khi bắt đầu bài toán, M = 0.Memory, được gọi Get nhiều nhất một lần.-1, hoặc bằng -2. Trả giá trị khác gây Wrong Answer [1].-1 nghĩa là kết luận \(S\) là chuỗi tốt.-2 nghĩa là kết luận \(S\) không phải chuỗi tốt.Hành vi của Memory phải chỉ phụ thuộc vào N, M và giá trị trả về của Get nếu hàm này được gọi. Trong chấm chính thức, Memory được gọi tổng cộng \(2^{22}\cdot 4\) lần ở giai đoạn dựng bảng chuyển trạng thái.
Getchar Get(int I);
Memory; gọi từ hai lần trở lên gây Wrong Answer [2].Mỗi tệp chấm chứa nhiều testcase có cùng độ dài \(N\). Nếu phát hiện lỗi, việc chấm dừng ngay.
Với mỗi \(M\) thỏa \(0 \le M \le 2^{22}-1\), bộ chấm thực hiện:
<, >, [, ], gọi Memory(N,M). Nếu Memory gọi Get, bộ chấm cho Get trả về \(c\). Gọi giá trị Memory trả về là \(m(M,c)\).Get hay không phải giống nhau. Nếu có gọi, cả bốn lần phải gọi với cùng chỉ số \(I\). Nếu không gọi, cả bốn lần phải trả cùng một giá trị. Vi phạm gây Wrong Answer [4]. Gọi chỉ số đó là \(i(M)\); nếu không gọi Get, quy ước \(i(M)=1\).Với mỗi testcase \(S\):
Nếu tất cả testcase đều hợp lệ, bài nộp được chấp nhận.
Chỉ giai đoạn dựng bảng hành vi được tính thời gian và bộ nhớ trong cách chấm chính thức. Tất cả \(2^{22}\cdot4\) lần gọi Memory ở giai đoạn này phải tránh Wrong Answer [1], [2], [3] và lỗi thực thi.
{<, >, [, ]}.< hoặc >Ví dụ 1
4 1
<>[]
-1
Đầu vào tương ứng của bộ chấm đơn giản là:
Với testcase \(S=\texttt{<>[]}\) có \(N=4\), bộ chấm đơn giản có thể thực hiện các lời gọi sau:
| Lời gọi | Lời gọi Get và giá trị trả về |
Giá trị Memory trả về |
|---|---|---|
Memory(4, 0) |
Get(1) trả < |
2015 |
Memory(4, 2015) |
Get(3) trả [ |
3 |
Memory(4, 3) |
Get(2) trả > |
23 |
Memory(4, 23) |
Get(4) trả ] |
4194303 |
Memory(4, 4194303) |
Get(3) trả [ |
-1 |
Với chuỗi lời gọi trên, bộ chấm đơn giản in:
Bạn vừa mua một trò chơi điện tử do công ty JOI phát hành. Một ngày nọ, màn chơi được gọi là "Laser" xuất hiện. Màn này cực kỳ khó, ngay cả người chơi giỏi cũng chỉ có xác suất rất nhỏ vượt qua. Sau nhiều lần thử, bạn nhận ra rằng có thể thắng nếu đưa ra quyết định đủ nhanh và nghĩ đến việc viết chương trình hỗ trợ.
Màn chơi có \(N\) bức tường chắn. Sân chơi là một hình chữ nhật chia thành các ô vuông \(1\times1\). Mỗi ô được biểu diễn bởi cặp số nguyên không âm \((x,y)\). Ô \((0,0)\) nằm ở góc dưới bên trái; ô \((x,y)\) cách đó \(x\) ô sang phải và \(y\) ô lên trên.
Khi màn chơi bắt đầu, kẻ địch thực hiện lần lượt \(M\) đợt tấn công. Trong đợt thứ \(j\), kẻ địch bắn một tia laser thẳng từ ô \((P_j,N+1)\) đến ô \((P_j,0)\).
Mỗi bức tường chiếm một số ô liên tiếp có cùng tọa độ \(y\). Tường \(i\) có chiều ngang \(B_i-A_i+1\), chiều dọc \(1\) và ban đầu chiếm các ô từ \((A_i,i)\) đến \((B_i,i)\). Ngay trước đợt tấn công đầu tiên và giữa hai đợt tấn công liên tiếp, bạn có thể di chuyển các bức tường sang trái hoặc phải bao nhiêu lần tùy ý. Mỗi lần di chuyển, bạn chọn một bức tường và dịch nó đúng một ô sang trái hoặc sang phải.
Laser yếu đi khi va vào tường. Bạn muốn di chuyển các tường sao cho mọi tia laser đều va vào tất cả \(N\) bức tường, đồng thời giảm số lần di chuyển.
Với từng bức tường, hãy tìm số lần di chuyển nhỏ nhất của riêng bức tường đó để mọi tia laser đều va vào nó.
In ra \(N\) dòng. Dòng thứ \(i\) chứa số lần di chuyển nhỏ nhất của tường \(i\).
Ví dụ 1
4 4
0 3
4 4
2 7
8 11
6
4
3
8
5
10
1
7
Một cách di chuyển tối ưu là:
Tổng số lần di chuyển của bốn bức tường lần lượt là \(5,10,1,7\).
Ví dụ 2
7 11
12 39
22 23
5 38
6 47
10 43
0 50
18 46
38
19
15
1
12
29
29
0
6
40
6
34
178
13
6
18
0
36