trang chủ / đề bài / voi16_doncay

Đốn cây

Đề bài

Mô tả

Hùng đang làm việc trong Công ty cao su X. Công ty có rừng cao su rất rộng, với những hàng cây cao su trồng cách đều thẳng tắp. Theo định kỳ, người ta thường phải chặt hạ cả hàng cây cao su đã hết hạn khai thác để trồng thay thế bằng hàng cây mới.

Hùng phát hiện ra một bài toán tin học liên quan đến vấn đề này: Một nhóm công nhân được giao nhiệm vụ chặt hạ hàng cây gồm n cây được trồng dọc theo một đường thẳng với khoảng cách cố định giữa hai cây liên tiếp. Nếu các công nhân cưa đổ một cây, họ có thể cho nó đổ về phía bên trái hoặc bên phải dọc theo hàng cây. Một cây khi đổ có thể lật đổ cây khác bị nó rơi vào và có thể làm đổ nhiều cây khác, theo hiệu ứng lan truyền domino. Sau khi khảo sát kỹ, Hùng đã mô tả được hiệu ứng lan truyền domino như sau: Giả sử các cây trên hàng cây được đánh số từ 1 đến n, từ trái qua phải và chiều cao của cây i là hi (1≤i≤n).

  • Nếu cây i đổ về bên trái thì tất cả các cây j với i−hi<j<i cũng sẽ đổ (về bên trái);
  • Nếu cây i đổ về bên phải thì tất cả các cây j với i<j<i+hi cũng sẽ đổ (về bên phải);
  • Mỗi cây chỉ đổ một lần về bên trái hoặc bên phải.

Do đó bài toán đặt ra đối với Hùng là: Xác định số lượng nhỏ nhất các cây mà các công nhân cần cưa đổ đảm bảo hạ đổ toàn bộ hàng cây.

Yêu cầu: Giúp Hùng giải quyết bài toán đặt ra.

Dữ liệu vào

  • Dòng đầu tiên ghi số nguyên dương n;
  • Dòng thứ hai chứa n số nguyên dương h1,h2,…,hn được ghi cách nhau bởi dấu cách, mỗi số không vượt quá 106.

Dữ liệu ra

  • Dòng đầu tiên ghi số nguyên dương k là số lượng cây mà các công nhân cần cưa đổ;
  • Dòng thứ hai ghi dãy số nguyên c1,c2,…,ck, trong đó |cj| (1≤j≤k) là dãy chỉ số của các cây theo thứ tự các công nhân phải lần lượt cưa đổ, cj là số dương nếu cây cần cho đổ về bên phải và là số âm nếu cây cần cho đổ về bên trái.

Không được cưa một cây đã đổ. Nếu có nhiều cách thì chỉ cần đưa ra một cách tùy ý.

Ràng buộc

  • 1≤n≤4·106;
  • 1≤hi≤106.

Subtasks

  • Subtask 1 (40% số test, 40% số điểm): 1≤n≤104;
  • Subtask 2 (40% số test, 40% số điểm): 1≤n≤105;
  • Subtask 3 (20% số test, 20% số điểm): 1≤n≤4·106.

Ví dụ

Input Output Giải thích
5
1 2 3 1 1
2
1 2
Cưa cây 1 đổ sang phải (chỉ đổ cây 1), cưa cây 2 đổ sang phải làm đổ cây 3, cây 3 làm đổ cây 4 và 5. Một cách khác: cưa cây 2 đổ sang phải rồi cây 1 đổ sang trái (2 -1).
8
1 1 4 2 4 1 2 1
2
-3 4
Cây 3 đổ sang trái làm đổ cây 1, 2. Cây 4 đổ sang phải làm đổ cây 5, cây 5 làm đổ cây 6, 7, 8.

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