IOI 2008 - Islands

Xem PDF



Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 2400 (p) Thời gian: 2.0s Bộ nhớ: 128M Input: bàn phím Output: màn hình

Bạn đang tham quan một công viên có \(N\) hòn đảo. Từ mỗi đảo \(i\), người ta đã xây đúng một cây cầu tới một đảo khác; độ dài của cây cầu đó được ký hiệu là \(L_i\). Như vậy, công viên có tổng cộng \(N\) cây cầu. Mặc dù mỗi cây cầu được xây từ một đảo tới một đảo khác, hiện nay tất cả các cây cầu đều có thể đi theo cả hai chiều. Ngoài ra, giữa mỗi cặp đảo có đúng một tuyến phà đi lại theo cả hai chiều.

Bạn thích đi bộ hơn đi phà, nên muốn tối đa hóa tổng độ dài các cây cầu đã đi qua, đồng thời tuân thủ những quy tắc sau:

  • Bạn có thể bắt đầu chuyến tham quan tại một đảo tùy ý.
  • Bạn không được ghé thăm bất kỳ đảo nào quá một lần.
  • Tại một thời điểm bất kỳ, bạn có thể di chuyển từ đảo hiện tại \(S\) tới một đảo \(D\) chưa từng ghé thăm, bằng một trong hai cách:
    • Đi bộ: chỉ thực hiện được khi có một cây cầu nối hai đảo. Độ dài cây cầu được cộng vào tổng quãng đường đã đi bộ.
    • Đi phà: chỉ được chọn cách này nếu không thể đi từ \(S\) tới \(D\) bằng bất kỳ cách kết hợp nào giữa các cây cầu và những tuyến phà đã sử dụng trước đó. Khi kiểm tra khả năng đi tới \(D\), phải xét mọi đường đi, kể cả những đường đi qua các đảo mà bạn đã ghé thăm.

Bạn không bắt buộc phải ghé thăm tất cả các đảo, và cũng có thể không đi qua được tất cả các cây cầu.

Cho thông tin về \(N\) cây cầu và độ dài của chúng, hãy tính tổng quãng đường đi bộ lớn nhất có thể đạt được khi tuân thủ các quy tắc trên.

Dữ liệu vào

Đọc từ đầu vào chuẩn:

  • Dòng đầu tiên chứa số nguyên \(N\), là số đảo trong công viên. Các đảo được đánh số từ \(1\) đến \(N\).
  • Mỗi dòng trong \(N\) dòng tiếp theo mô tả một cây cầu. Dòng thứ \(i\) trong số này mô tả cây cầu được xây từ đảo \(i\), gồm hai số nguyên cách nhau bởi một dấu cách: số thứ nhất là số hiệu đảo ở đầu cầu còn lại, số thứ hai là độ dài \(L_i\) của cây cầu.

Hai đầu của mỗi cây cầu luôn nằm trên hai đảo khác nhau. Có thể có hai cây cầu khác nhau nối cùng một cặp đảo.

Dữ liệu ra

Ghi ra đầu ra chuẩn một dòng chứa một số nguyên: tổng quãng đường đi bộ lớn nhất có thể đạt được.

Kết quả của một số bộ kiểm thử không biểu diễn được bằng số nguyên \(32\) bit. Để xử lý đầy đủ các trường hợp, có thể cần dùng int64 trong Pascal hoặc long long trong C/C++. Các giá trị đọc từ đầu vào đều nằm trong phạm vi số nguyên \(32\) bit.

Ràng buộc

  • \(2 \le N \le 1\,000\,000\).
  • \(1 \le L_i \le 100\,000\,000\) với mọi \(1 \le i \le N\).
  • Đảo ở đầu cầu còn lại có số hiệu trong đoạn \([1,N]\) và khác \(i\).

Chấm điểm trên hệ thống

Lưu ý: Cách chia nhóm và tính điểm dưới đây là bản điều chỉnh để luyện tập trên hệ thống, không khẳng định tương đương cách chấm tại IOI gốc.

Mỗi nhóm được chấm độc lập: chỉ nhận điểm của nhóm khi vượt qua tất cả bộ kiểm thử trong nhóm; nếu có bộ kiểm thử không đạt thì nhóm nhận 0 điểm. Tổng điểm tối đa là 100.

Nhãn nhóm là phần số trong tên tệp dữ liệu gốc. Tất cả tệp cùng nhãn, kể cả các hậu tố chữ và pf, đều thuộc nhóm đó.

Mỗi nhóm có trọng số 1. Có 19 nhóm tính điểm; điểm cuối cùng bằng \(100 \times W / 19\), với \(W\) là tổng trọng số các nhóm đạt. Mỗi nhóm đạt đóng góp chính xác \(100/19\) điểm; không làm tròn riêng từng nhóm.

Nhãn nhóm Điểm Tệp dữ liệu vào gốc
1 \(100/19\) isl/isl1.in
2 \(100/19\) isl/isl2.in
3 \(100/19\) isl/isl3.in
4 \(100/19\) isl/isl4.in
5 \(100/19\) isl/isl5.in
6 \(100/19\) isl/isl6.in
7 \(100/19\) isl/isl7.in
8 \(100/19\) isl/isl8.in
9 \(100/19\) isl/isl9.in
10 \(100/19\) isl/isl10.in
11 \(100/19\) isl/isl11.in
12 \(100/19\) isl/isl12a.in, isl/isl12b.in
13 \(100/19\) isl/isl13a.in, isl/isl13b.in
14 \(100/19\) isl/isl14a.in, isl/isl14b.in, isl/isl14c.in, isl/isl14d.in
15 \(100/19\) isl/isl15a.in, isl/isl15b.in
16 \(100/19\) isl/isl16a.in, isl/isl16b.in, isl/isl16c.in
17 \(100/19\) isl/isl17a.in, isl/isl17b.in, isl/isl17c.in, isl/isl17d.in
18 \(100/19\) isl/isl18a.in, isl/isl18b.in, isl/isl18c.in, isl/isl18d.in, isl/isl18e.in, isl/isl18f.in, isl/isl18g.in
19 \(100/19\) isl/isl19a.in, isl/isl19b.in, isl/isl19c.in, isl/isl19d.in, isl/isl19e.in, isl/isl19f.in, isl/isl19g.in

Các ví dụ trong đề không tính điểm. Các tệp ví dụ gốc có nhãn 0 được giữ lại riêng và có trọng số 0.

Tệp ví dụ gốc: isl/isl0.in.

Ví dụ

Ví dụ 1

Input
7
3 8
7 2
4 2
1 4
1 9
3 4
2 3
Output
24
Note

\(N=7\) cây cầu trong ví dụ lần lượt nối các cặp đảo \((1,3)\), \((2,7)\), \((3,4)\), \((4,1)\), \((5,1)\), \((6,3)\)\((7,2)\). Chú ý rằng có hai cây cầu khác nhau nối đảo \(2\) với đảo \(7\).

Một cách đạt tổng quãng đường đi bộ lớn nhất là:

  1. Bắt đầu tại đảo \(5\).
  2. Đi qua cây cầu dài \(9\) để tới đảo \(1\).
  3. Đi qua cây cầu dài \(8\) để tới đảo \(3\).
  4. Đi qua cây cầu dài \(4\) để tới đảo \(6\).
  5. Đi phà từ đảo \(6\) tới đảo \(7\).
  6. Đi qua cây cầu dài \(3\) để tới đảo \(2\).

Kết thúc chuyến đi, bạn ở đảo \(2\) và tổng quãng đường đã đi bộ là \(9+8+4+3=24\).

Đảo duy nhất chưa được ghé thăm là đảo \(4\). Tuy nhiên, khi chuyến đi trên kết thúc, bạn không thể ghé thăm đảo này nữa:

  • Không thể đi bộ tới đảo \(4\), vì không có cây cầu nào nối đảo \(2\), nơi bạn đang đứng, với đảo \(4\).
  • Không thể đi phà tới đảo \(4\), vì đảo \(4\) có thể tới được từ đảo \(2\) bằng các cây cầu và tuyến phà đã sử dụng: đi qua cầu \((2,7)\), dùng lại tuyến phà từ đảo \(7\) tới đảo \(6\), rồi đi qua cầu \((6,3)\) và cuối cùng là cầu \((3,4)\).

Nguồn

IOI 2008.

Tệp

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: