trang chủ / đề bài / voi20_equake

Động đất

Đề bài

Mô tả

Đất nước AZ có n thành phố vừa phải hứng chịu một trận động đất mạnh. Nhiều tòa nhà và các công trình công cộng bị phá hủy, làm tê liệt toàn bộ hệ thống giao thông giữa các thành phố. Sau những nỗ lực của chính phủ, có n−1 con đường hai chiều nối giữa n thành phố được sửa chữa để đảm bảo tính liên thông đi lại giữa n thành phố. Các thành phố được đánh số từ 1 đến n. Con đường thứ k (k=1,2,…,n−1) nối hai thành phố ik và jk có độ dài d(ik,jk) km. Theo dự báo, trong thời gian tới có thể xảy ra một trận động đất nữa, do đó, chính phủ đang lên kế hoạch ứng phó. Theo thông tin thu nhận được, hiện tại thành phố i (i=1,2,…,n) đang có pi nhân viên cứu hộ. Chính phủ muốn điều chỉnh lại số lượng nhân viên cứu hộ ở các thành phố sao cho độ chênh lệch nhân viên cứu hộ giữa các thành phố là nhỏ nhất. Độ chênh lệch nhân viên cứu hộ giữa các thành phố được tính bằng hiệu số nhân viên cứu hộ ở thành phố có nhiều nhân viên nhất với thành phố có ít nhân viên nhất.

Tại mỗi thành phố đều có xe dùng để vận chuyển nhân viên cứu hộ (giả thiết số xe tại mỗi thành phố đủ nhiều để phục vụ vận chuyển), mỗi xe có khả năng vận chuyển không quá c nhân viên cứu hộ. Nếu muốn vận chuyển q nhân viên cứu hộ từ thành phố i sang thành phố j bằng đường nối trực tiếp thì thành phố i sẽ cần ⌈q/c⌉ xe, trong đó ⌈x⌉ là số nguyên nhỏ nhất không nhỏ hơn x và độ dài đường đi mà mỗi xe phải đi là d(i,j). Sau khi đến thành phố j, các nhân viên cứu hộ sẽ ở lại hoặc có thể tiếp tục di chuyển sang thành phố khác bằng xe của thành phố j. Để tiết kiệm chi phí vận chuyển, chính phủ cần xây dựng phương án vận chuyển sao cho tổng độ dài đường đi của các xe dùng để vận chuyển là ngắn nhất mà vẫn thỏa mãn yêu cầu nêu trên.

Yêu cầu: Cho thông tin về n−1 con đường và số nhân viên cứu hộ tại mỗi thành phố. Hãy tìm phương án vận chuyển nhân viên cứu hộ mà tổng độ dài đường đi của các xe dùng vận chuyển là ngắn nhất mà vẫn đảm bảo yêu cầu độ chênh lệch nhân viên cứu hộ giữa các thành phố là nhỏ nhất.

Dữ liệu vào

  • Dòng đầu chứa hai số nguyên dương n và c (c≤106);
  • Dòng thứ hai gồm n số nguyên không âm p1,p2,…,pn (pi≤106);
  • Dòng thứ k trong số n−1 dòng tiếp theo chứa ba số nguyên ik,jk,d(ik,jk) thỏa mãn 1≤ik<jk≤n và 0<d(ik,jk)≤106.

Các số trên cùng một dòng cách nhau bởi dấu cách.

Dữ liệu ra

  • Dòng đầu chứa một số nguyên là tổng độ dài ngắn nhất của các xe dùng để vận chuyển đảm bảo yêu cầu độ chênh lệch nhân viên cứu hộ giữa các thành phố là nhỏ nhất;
  • Dòng thứ hai chứa số nguyên s là số lượng đợt vận chuyển;
  • Dòng thứ h trong s dòng tiếp theo chứa ba số nguyên dương ih,jh,qh, nghĩa là thành phố ih sẽ có các xe vận chuyển qh nhân viên cứu hộ sang thành phố jh (giá trị qh phải nhỏ hơn hoặc bằng số lượng nhân viên của thành phố ih tại thời điểm vận chuyển).

Các đợt vận chuyển được thực hiện lần lượt theo thứ tự in ra; mỗi đợt đi trên một con đường nối trực tiếp ih và jh. Nếu có nhiều phương án tối ưu, in ra phương án bất kỳ.

Ràng buộc

  • 1≤n≤3000; 1≤c≤106;
  • 0≤pi≤106;
  • 1≤ik<jk≤n, 0<d(ik,jk)≤106; các con đường đảm bảo đi lại được giữa hai thành phố bất kỳ.

Subtasks

  • Subtask 1 (20% số test, 20% số điểm): n=3;
  • Subtask 2 (40% số test, 40% số điểm): n≤3000 và mỗi thành phố có không quá 2 đường nối trực tiếp tới thành phố khác;
  • Subtask 3 (40% số test, 40% số điểm): n≤3000.

Đối với mỗi test, nếu đưa ra đúng giá trị tổng độ dài ngắn nhất của các xe dùng để vận chuyển, bạn sẽ được 70% số điểm của test đó, nếu tiếp tục đưa ra được một phương án vận chuyển đúng, bạn sẽ được 30% số điểm còn lại.

Ví dụ

Input Output Giải thích
4 10
12 9 49 51
1 2 1
1 3 1
2 4 2
7
3
3 1 19
4 2 20
1 2 1
Cần hai xe vận chuyển 19 nhân viên cứu hộ từ thành phố 3 về thành phố 1 và hai xe vận chuyển 20 nhân viên cứu hộ từ thành phố 4 về thành phố 2, cuối cùng cần một xe vận chuyển 1 nhân viên từ thành phố 1 sang thành phố 2. Độ chênh lệch nhân viên cứu hộ giữa các thành phố bằng 1 và tổng độ dài đường đi của các xe là 2×1+2×2+1×1=7 (km).
3 3
7 0 1
1 2 2
2 3 5
9
2
1 2 5
2 3 2
Ví dụ thêm (không có trong đề gốc). Tổng số nhân viên là 8 nên độ chênh lệch nhỏ nhất là 1 (số nhân viên cuối cùng là 2,3,3). Thành phố 2 ban đầu không có ai nên phải nhận 5 người từ thành phố 1 (2 xe, 2×2 km) trước khi chuyển 2 người sang thành phố 3 (1 xe, 5 km): tổng 9 km.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0