BOI 2024 - Ngày 1

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 BOI 2024 - Jobs 100 (p) 2.0s 512M
2 BOI 2024 - Portal 100 (p) 1.0s 512M
3 BOI 2024 - Trains 100 (p) 2.0s 512M

1. BOI 2024 - Jobs

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

Bạn đang điều hành một doanh nghiệp thành công, kiếm tiền bằng cách hoàn thành công việc cho khách hàng. Hiện có \(N\) công việc mà bạn có thể lựa chọn, được đánh số từ \(1\) đến \(N\). Mỗi công việc chỉ có thể thực hiện một lần.

Hoàn thành công việc \(i\) mang lại lợi nhuận \(x_i\) euro. Lợi nhuận cũng có thể âm, tức là \(x_i<0\).

Một số công việc phụ thuộc vào một công việc khác: có thể có công việc mang số hiệu \(p_i\) phải được hoàn thành trước khi bắt đầu công việc \(i\). Vì thế, một công việc có lợi nhuận lớn có thể không hấp dẫn như vẻ ngoài nếu nó phụ thuộc vào một công việc có lợi nhuận âm. Nếu \(p_i=0\), công việc \(i\) không phụ thuộc vào công việc nào.

Hiện bạn có \(s\) euro. Bạn được quyết định những công việc sẽ thực hiện và thứ tự thực hiện chúng, miễn là tuân thủ các quan hệ phụ thuộc. Ngoài ra, số tiền bạn có không được âm tại bất kỳ thời điểm nào.

Hãy tính lợi nhuận lớn nhất có thể thu được khi chọn thực hiện một số công việc trong \(N\) công việc theo một thứ tự do bạn quyết định. Bạn cũng có thể không thực hiện công việc nào.

Dữ liệu vào

Dòng đầu tiên chứa hai số nguyên \(N\)\(s\), lần lượt là số công việc và số tiền ban đầu bạn có.

Tiếp theo là \(N\) dòng. Dòng thứ \(i\) chứa hai số nguyên \(x_i\)\(p_i\), lần lượt là lợi nhuận và số hiệu công việc phải hoàn thành trước công việc \(i\). Nếu \(p_i=0\), công việc \(i\) không phụ thuộc vào công việc nào.

Dữ liệu ra

In ra một số nguyên duy nhất là lợi nhuận lớn nhất bạn có thể thu được.

Ràng buộc

  • \(1\le N\le 3\cdot 10^5\).
  • \(0\le s\le 10^{18}\).
  • \(-10^9\le x_i\le 10^9\) với mọi \(1\le i\le N\).
  • \(0\le p_i<i\) với mọi \(1\le i\le N\).

Phân nhóm

  1. \(11\) điểm: \(s=10^{18}\).
  2. \(14\) điểm: \(N\le 2000\) và với mọi \(1\le i\le N\), \(p_i=0\) hoặc \(p_i=i-1\).
  3. \(15\) điểm: với mọi \(1\le i\le N\), \(p_i=0\) hoặc \(p_i=i-1\).
  4. \(29\) điểm: \(N\le 2000\).
  5. \(31\) điểm: không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
6 1
3 0
-3 1
-5 0
2 1
6 3
-4 5
Output
6
Giải thích

Để thu được lợi nhuận lớn nhất, bạn nên thực hiện các công việc theo thứ tự \(1,4,3,5\):

  • Công việc \(1\): số tiền thay đổi từ \(1\) thành \(4\).
  • Công việc \(4\) (công việc tiên quyết \(1\) đã hoàn thành): số tiền thay đổi từ \(4\) thành \(6\).
  • Công việc \(3\): số tiền thay đổi từ \(6\) thành \(1\).
  • Công việc \(5\) (công việc tiên quyết \(3\) đã hoàn thành): số tiền thay đổi từ \(1\) thành \(7\).

Tổng lợi nhuận là \(7-1=6\), bằng số tiền cuối cùng trừ đi số tiền ban đầu.

2. BOI 2024 - Portal

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

Bạn nghĩ rằng đặt người bạn thân của mình vào ô \((0,0)\) trên một lưới vô hạn gồm các ô được tô màu sẽ là một trò đùa thú vị. Người bạn sau đó di chuyển trên lưới mãi mãi, mỗi lần đi một bước sang một trong bốn ô kề cạnh.

\(N\) ô trên lưới chứa cổng dịch chuyển. Khi người bạn bước vào một ô có cổng, người ấy lập tức được dịch chuyển đến một cổng ngẫu nhiên, có thể là chính cổng vừa bước vào hoặc một cổng khác. Nếu ô \((0,0)\) có cổng, người bạn cũng được dịch chuyển ngay khi được đặt lên lưới lúc bắt đầu.

Bạn muốn đánh lừa để người bạn không nhận ra sự tồn tại của các cổng. Điều duy nhất người ấy nhìn thấy là màu của ô đang đứng, vì vậy bạn phải bảo đảm rằng, theo cảm nhận của người ấy, màu của các ô không bao giờ thay đổi. Cụ thể, nếu người ấy nghĩ rằng mình đã đi vào một ô nhiều lần, chẳng hạn bằng cách đi sang trái rồi lập tức đi sang phải, màu nhìn thấy phải giống như lần đầu tiên người ấy nghĩ rằng mình đã đi vào ô đó.

Lưu ý rằng khi bước vào một cổng, người bạn nhìn thấy cả màu của ô vừa bước vào lẫn màu của ô được dịch chuyển đến. Vì thế, bạn phải tô tất cả các ô có cổng cùng một màu để việc dịch chuyển không bị phát hiện ngay lập tức.

Một cách đơn giản là tô tất cả các ô cùng một màu. Nhưng màu sắc rất đẹp! Vì thế, bạn muốn dùng càng nhiều màu càng tốt.

Hãy tính số màu lớn nhất có thể dùng mà vẫn bảo đảm người bạn không nhận ra sự tồn tại của các cổng.

Dữ liệu vào

Dòng đầu tiên chứa số nguyên \(N\) là số cổng dịch chuyển.

Tiếp theo là \(N\) dòng, mỗi dòng chứa hai số nguyên. Dòng thứ \(i\) chứa \(x_i\)\(y_i\), cho biết có một cổng tại ô \((x_i,y_i)\).

Dữ liệu ra

In ra một số nguyên duy nhất là số màu lớn nhất có thể dùng mà người bạn không nhận ra các cổng, hoặc \(-1\) nếu có thể dùng vô hạn màu.

Ràng buộc

  • \(1\le N\le 10^5\).
  • \(-10^6\le x_i,y_i\le 10^6\) với mọi \(1\le i\le N\).
  • Không có hai cổng có cùng tọa độ.

Phân nhóm

  1. \(1\) điểm: \(N\le 2\).
  2. \(10\) điểm: \(N\le 3\).
  3. \(10\) điểm: với mọi số nguyên \(x_1,x_2,y_1,y_2\), nếu có cổng tại \((x_1,y_1)\)\((x_2,y_2)\) thì cũng có cổng tại \((x_1,y_2)\).
  4. \(29\) điểm: \(N\le 100\)\(-100\le x_i,y_i\le 100\) với mọi \(1\le i\le N\).
  5. \(15\) điểm: \(N\le 2000\).
  6. \(35\) điểm: không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
3
1 1
1 3
3 2
Output
4
Giải thích

Các cổng nằm tại \((1,1)\), \((1,3)\)\((3,2)\). Giả sử người bạn thực hiện lần lượt các bước: lên, phải, xuống, trái.

Năm khung hình lần lượt mô tả trạng thái sau \(0\), \(1\), \(2\), \(3\)\(4\) bước. Ô màu xanh dương biểu thị nơi người bạn nghĩ mình đang đứng; ô màu xanh nhạt biểu thị những vị trí khác mà người ấy có thể đang đứng; chấm đỏ biểu thị ô có cổng dịch chuyển.

  • Sau \(0\) bước: người bạn ở vị trí ban đầu và nhìn thấy màu của ô \((0,0)\) lần đầu tiên.
  • Sau \(1\) bước: đi lên ô \((0,1)\).
  • Sau \(2\) bước: đi sang phải vào ô \((1,1)\) và dịch chuyển đến bất kỳ cổng nào trong ba cổng.
  • Sau \(3\) bước: đi xuống.
  • Sau \(4\) bước: đi sang trái. Người bạn nghĩ mình đã trở lại điểm xuất phát, nhưng có thể đang ở bất kỳ vị trí được tô màu nào trong khung hình này.

Sau chuỗi bước đi, người bạn nghĩ mình đã trở lại ô xuất phát \((0,0)\), nhưng thực tế cũng có thể kết thúc tại \((0,2)\) hoặc \((2,1)\). Người ấy đã nhìn thấy màu của ô \((0,0)\) lúc bắt đầu, nên nếu bây giờ nhìn thấy màu khác, người ấy sẽ nhận ra phải có các cổng dịch chuyển. Vì không muốn điều đó xảy ra, bạn phải tô ba ô này cùng một màu.

Không có chuỗi bước đi nào khiến người bạn nghĩ mình kết thúc tại \((0,0)\) trong khi thực tế kết thúc tại \((1,0)\), nên có thể tô hai ô này bằng hai màu khác nhau mà không làm lộ các cổng.

Hình dưới đây minh họa một cách tô bằng \(4\) màu. Không thể dùng nhiều hơn \(4\) màu trong ví dụ này.

Ví dụ 2

Input
5
0 0
1 0
-1 0
0 1
0 -1
Output
1
Giải thích

Các cổng nằm tại \((0,0)\), \((0,1)\), \((1,0)\), \((0,-1)\)\((-1,0)\). Giả sử người bạn muốn đến ô \((1,3)\) bằng cách đi sang phải một lần rồi đi lên ba lần. Có khả năng người ấy kết thúc tại \((0,0)\) nếu bị dịch chuyển về đó lúc bắt đầu và sau mỗi bước đi.

Nếu sau đó người ấy quay lại nơi mình nghĩ là ô \((0,0)\) bằng cách đi xuống ba lần rồi sang trái một lần, và trong quá trình này không bị dịch chuyển ra khỏi ô vừa bước vào, người ấy sẽ kết thúc tại \((-1,-3)\). Người ấy nghĩ rằng mình đang ở ô \((0,0)\) lần thứ hai và mong đợi nhìn thấy cùng một màu. Vì vậy, bạn phải tô \((-1,-3)\)\((0,0)\) cùng một màu.

Việc ban đầu chọn ô \((1,3)\) không có gì đặc biệt. Bằng lập luận tương tự, có thể chứng minh rằng những ô khác cũng phải có cùng màu với \((0,0)\).

Ví dụ 3

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

Người bạn chỉ có thể được “dịch chuyển” về chính ô chứa cổng. Vì vậy, người ấy không thể nhận ra sự tồn tại của cổng ngay cả khi mỗi ô được tô bằng một màu khác nhau.

3. BOI 2024 - Trains

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

Bạn vừa đến Vilnius và muốn ghé thăm các thành phố khác nhau ở Litva.

Các thành phố ở Litva nằm trên một đường thẳng và được đánh số lần lượt từ \(1\) đến \(N\). Vilnius mang số \(1\).

Mỗi thành phố có một nhà ga với đúng một tuyến tàu xuất phát từ đó. Bạn chỉ có thể lên tàu ở ga đầu của tuyến, nhưng có thể xuống tại bất kỳ điểm dừng nào của tàu. Tàu xuất phát từ thành phố \(i\) dừng lại sau mỗi \(d_i\) thành phố và có \(x_i\) điểm dừng trên tuyến, không tính thành phố xuất phát. Nếu \(d_i=0\), tàu xuất phát từ thành phố \(i\) hiện không hoạt động và bạn không thể lên tàu đó.

Cụ thể, nếu lên tàu tại thành phố \(i\), bạn có thể xuống tại bất kỳ thành phố nào mang số \(i+t\cdot d_i\), với \(1\le t\le x_i\). Vì chỉ muốn ghé thăm các thành phố ở Litva, bạn sẽ không đi quá thành phố \(N\), ngay cả khi tuyến tàu còn những điểm dừng phía sau.

Bạn dự định ghé thăm một số thành phố và dùng tàu để di chuyển giữa chúng. Khi lập kế hoạch, bạn muốn biết có bao nhiêu hành trình khác nhau bắt đầu tại Vilnius. Hai hành trình khác nhau nếu dãy thành phố mà bạn dừng lại trong hai hành trình khác nhau.

Hãy tính số hành trình này và in ra kết quả lấy modulo \(10^9+7\).

Dữ liệu vào

Dòng đầu tiên chứa một số nguyên \(N\) là số thành phố.

Tiếp theo là \(N\) dòng. Dòng thứ \(i\) chứa hai số nguyên \(d_i\)\(x_i\) mô tả tuyến tàu xuất phát từ thành phố \(i\).

Dữ liệu ra

In ra một số nguyên duy nhất là số cách ghé thăm một số trong \(N\) thành phố, lấy modulo \(10^9+7\).

Ràng buộc

  • \(1\le N\le 10^5\).
  • \(0\le d_i\le 10^9\) với mọi \(1\le i\le N\).
  • \(0\le x_i\le 10^9\) với mọi \(1\le i\le N\).

Phân nhóm

  1. \(8\) điểm: \(N\le 15\).
  2. \(13\) điểm: \(N\le 10^4\).
  3. \(16\) điểm: \(d_i=1\) với mọi \(1\le i\le N\).
  4. \(34\) điểm: \(x_i=10^9\) với mọi \(1\le i\le N\).
  5. \(29\) điểm: không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
5
1 3
2 1
1 3
0 10
3 5
Output
7
Giải thích

\(7\) hành trình có thể thực hiện:

  • \(1\).
  • \(1\to 2\).
  • \(1\to 2\to 4\).
  • \(1\to 3\).
  • \(1\to 3\to 4\).
  • \(1\to 3\to 5\).
  • \(1\to 4\).