USACO 2017 - US Open - Hạng Bạch Kim

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 USACO 2017 - Modern Art 100 (p) 4.0s 512M
2 USACO 2017 - Switch Grass 100 (p) 4.0s 512M
3 USACO 2017 - COWBASIC 100 (p) 4.0s 512M

1. USACO 2017 - Modern Art

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

Giới phê bình nghệ thuật trên toàn thế giới chỉ mới bắt đầu công nhận thiên tài sáng tạo của Picowso, nữ họa sĩ bò vĩ đại.

Picowso vẽ tranh theo một cách rất đặc biệt. Cô bắt đầu với một bức vẽ trống kích thước \(N \times N\), được biểu diễn bởi một lưới \(N \times N\) chứa toàn số \(0\), trong đó số \(0\) biểu thị một ô còn trống trên bức vẽ. Sau đó, cô vẽ \(N^2\) hình chữ nhật lên bức vẽ, mỗi hình bằng một trong \(N^2\) màu (được đánh số tiện lợi từ \(1 \ldots N^2\)). Chẳng hạn, cô có thể bắt đầu bằng cách tô một hình chữ nhật màu \(2\), tạo ra bức vẽ trung gian sau:

2 2 2 0
2 2 2 0
2 2 2 0
0 0 0 0

Tiếp theo, cô có thể tô một hình chữ nhật màu \(7\):

2 2 2 0
2 7 7 7
2 7 7 7
0 0 0 0

Rồi cô có thể tô một hình chữ nhật nhỏ màu \(3\):

2 2 3 0
2 7 3 7
2 7 7 7
0 0 0 0

Các cạnh của mỗi hình chữ nhật song song với các cạnh của bức vẽ; một hình chữ nhật có thể lớn bằng toàn bộ bức vẽ hoặc nhỏ chỉ bằng một ô. Mỗi màu từ \(1 \ldots N^2\) được dùng đúng một lần, mặc dù các màu được tô sau có thể che phủ hoàn toàn một số màu được tô trước.

Cho trạng thái cuối cùng của bức vẽ, hãy đếm xem có bao nhiêu trong số \(N^2\) màu có thể đã được tô đầu tiên.

Dữ liệu vào

Dòng đầu tiên chứa \(N\), kích thước của bức vẽ (\(1 \leq N \leq 1\,000\)). \(N\) dòng tiếp theo mô tả bức tranh cuối cùng, mỗi dòng chứa \(N\) số nguyên trong khoảng \(0 \ldots N^2\). Dữ liệu vào được đảm bảo là đã được vẽ theo cách mô tả ở trên, bằng cách lần lượt tô các hình chữ nhật với những màu khác nhau.

Dữ liệu ra

In số màu có thể đã được tô đầu tiên.

Ví dụ

Ví dụ 1

Input
4
2 2 3 0
2 7 3 7
2 7 7 7
0 0 0 0
Output
14
Giải thích

Trong ví dụ này, màu \(2\) có thể đã được tô đầu tiên. Rõ ràng màu \(3\) phải được tô sau màu \(7\), và màu \(7\) phải được tô sau màu \(2\). Vì không nhìn thấy các màu còn lại, ta suy ra chúng cũng có thể đã được tô đầu tiên.

Nguồn

USACO 2017 US Open Contest, Platinum — Modern Art. Tác giả đề: Brian Dean.

https://usaco.org/index.php?page=viewproblem2&cpid=744

2. USACO 2017 - Switch Grass

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

Gần đây, Farmer John đang thử nghiệm trồng các loại cỏ khác nhau trên trang trại vì nhận ra rằng những loại bò khác nhau thích những loại cỏ khác nhau. Tuy nhiên, ông phải cẩn thận để đảm bảo các loại cỏ khác nhau được trồng đủ xa nhau, tránh cho chúng bị trộn lẫn đến mức không thể tách rời.

Trang trại của FJ gồm \(N\) cánh đồng (\(1 \leq N \leq 200\,000\)), trong đó \(M\) cặp cánh đồng được nối với nhau bằng các đường đi hai chiều (\(1 \leq M \leq 200\,000\)). Có thể đi từ một cánh đồng bất kỳ đến mọi cánh đồng khác bằng các đường đi này. Mỗi đường đi có độ dài nguyên trong khoảng \(1 \ldots 1\,000\,000\). Mỗi cặp cánh đồng được nối trực tiếp bởi nhiều nhất một đường đi.

Ban đầu, FJ trồng một trong \(K\) loại cỏ trên mỗi cánh đồng (\(1 \leq K \leq N\)). Tuy nhiên, theo thời gian, ông có thể quyết định đổi loại cỏ trên một cánh đồng nào đó sang loại khác. Ông gọi đây là một thao tác "cập nhật". Ông có thể thực hiện nhiều lần cập nhật theo thời gian, và tất cả các cập nhật đều có hiệu lực tích lũy.

Sau mỗi lần cập nhật, FJ muốn biết độ dài đường đi ngắn nhất giữa hai cánh đồng trồng hai loại cỏ khác nhau. Nói cách khác, trong tất cả các cặp cánh đồng có loại cỏ khác nhau, ông muốn biết hai cánh đồng gần nhau nhất. Lý tưởng nhất là giá trị này lớn, nhờ đó ông có thể ngăn cỏ thuộc loại này trộn lẫn với cỏ thuộc loại khác. Dữ liệu được đảm bảo rằng trang trại luôn có ít nhất hai cánh đồng trồng hai loại cỏ khác nhau.

Phân nhóm

  • Trong \(30\%\) số bộ dữ liệu, mỗi cánh đồng được nối trực tiếp với nhiều nhất \(10\) đường đi.

Dữ liệu vào

Dòng đầu tiên chứa bốn số nguyên \(N\), \(M\), \(K\)\(Q\), trong đó \(Q\) là số lần cập nhật (\(1 \leq Q \leq 200\,000\)).

\(M\) dòng tiếp theo mô tả các đường đi; mỗi dòng chứa ba số nguyên \(A\), \(B\)\(L\), cho biết có một đường đi độ dài \(L\) từ cánh đồng \(A\) đến cánh đồng \(B\) (cả \(A\)\(B\) đều nằm trong khoảng \(1 \ldots N\)).

Dòng tiếp theo chứa loại cỏ ban đầu được trồng trên mỗi cánh đồng (\(N\) số nguyên trong khoảng \(1 \ldots K\)).

Cuối cùng, \(Q\) dòng cuối, mỗi dòng mô tả một lần cập nhật bằng hai số nguyên \(A\)\(B\), nghĩa là cỏ trên cánh đồng \(A\) được đổi thành loại \(B\).

Dữ liệu ra

Với mỗi lần cập nhật, sau khi áp dụng cập nhật đó, hãy in độ dài đường đi ngắn nhất giữa hai cánh đồng trồng hai loại cỏ khác nhau.

Ví dụ

Ví dụ 1

Input
3 2 3 4
1 2 3
2 3 1
1 1 2
3 3
2 3
1 2
2 2
Output
1
3
3
1

Nguồn

USACO 2017 US Open Contest, Platinum — Switch Grass. Tác giả đề: Lewin Gan.

https://usaco.org/index.php?page=viewproblem2&cpid=745

3. USACO 2017 - COWBASIC

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

Bessie đã phát minh ra một ngôn ngữ lập trình mới, nhưng vì chưa có trình biên dịch nên cô cần bạn giúp thực sự chạy các chương trình của mình.

COWBASIC là một ngôn ngữ đơn giản và tao nhã. Nó có hai tính năng chính: phép cộng và vòng lặp MOO. Bessie đã nghĩ ra một giải pháp thông minh cho vấn đề tràn số: mọi phép cộng đều được thực hiện theo modulo \(10^9+7\). Nhưng thành tựu thực sự của Bessie là vòng lặp MOO, dùng để chạy một khối mã với số lần cố định. Dĩ nhiên, các vòng lặp MOO và phép cộng có thể được lồng nhau.

Cho một chương trình COWBASIC, hãy giúp Bessie xác định số mà chương trình trả về.

Dữ liệu vào

Bạn được cho một chương trình COWBASIC dài không quá \(100\) dòng, mỗi dòng dài không quá \(350\) ký tự. Một chương trình COWBASIC là một danh sách các câu lệnh.

Có ba loại câu lệnh:

<variable> = <expression>

<literal> MOO {
  <list of statements>
}

RETURN <variable>

Có ba loại biểu thức:

<literal>

<variable>

( <expression> ) + ( <expression> )

Một <literal> là một số nguyên dương không lớn hơn \(100\,000\).

Một <variable> là một chuỗi gồm không quá \(10\) chữ cái tiếng Anh viết thường.

Dữ liệu được đảm bảo rằng không biến nào được sử dụng hoặc RETURN trước khi được định nghĩa. RETURN được đảm bảo xuất hiện đúng một lần ở dòng cuối cùng của chương trình.

Dữ liệu ra

In một số nguyên dương duy nhất là giá trị của biến được RETURN.

Phân nhóm

  • Trong \(20\%\) số bộ test, các vòng lặp MOO không được lồng nhau.
  • Trong \(20\%\) số bộ test khác, chương trình chỉ có \(1\) biến; các vòng lặp MOO có thể được lồng nhau.
  • Trong các bộ test còn lại, không có thêm ràng buộc nào.

Ví dụ

Ví dụ 1

Input
x = 1
10 MOO {
  x = ( x ) + ( x )
}
RETURN x
Output
1024
Giải thích

Chương trình COWBASIC này tính \(2^{10}\).

Ví dụ 2

Input
n = 1
nsq = 1
100000 MOO {
  100000 MOO {
    nsq = ( nsq ) + ( ( n ) + ( ( n ) + ( 1 ) ) )
    n = ( n ) + ( 1 )
  }
}
RETURN nsq
Output
4761
Giải thích

Chương trình COWBASIC này tính \((10^5*10^5+1)^2\) (theo modulo \(10^9+7\)).

Nguồn

USACO 2017 US Open Contest, Platinum — COWBASIC. Tác giả đề: Jonathan Paulson.

https://usaco.org/index.php?page=viewproblem2&cpid=746