#1671. DÃY CON ĐAN DẤU (MAXALTSUM)

Bộ nhớ: 512 MiB Thời gian: 1000 ms Nhập/xuất từ luồng chuẩn
Kiểu bài: Thông thường Kiểu chấm: So sánh văn bản
Đưa lên bởi: Trùm CUỐI

Đề bài

Cho một dãy số nguyên A gồm n phần tử A_1, A_2, \dots, A_n ( A_i \neq 0 ).

Một dãy con B = (b_1, b_2, \dots, b_k) được gọi là dãy con đan dấu nếu với mọi 1 \le i < k , phần tử b_i b_{i+1} trái dấu nhau (tức là b_i \cdot b_{i+1} < 0 ).

Nhiệm vụ của bạn là tìm một dãy con đan dấu có độ dài k lớn nhất có thể. Trong trường hợp có nhiều dãy con cùng đạt độ dài cực đại, hãy chọn dãy con có tổng các phần tử \sum_{i=1}^{k} b_i là lớn nhất.

Dữ liệu:

  • Dòng đầu tiên chứa số nguyên T ( 1 \le T \le 10^4 ) — số lượng bộ dữ liệu (test cases).
  • Mỗi bộ dữ liệu gồm hai dòng:
    • Dòng thứ nhất chứa số nguyên n ( 1 \le n \le 2 \cdot 10^5 ).
    • Dòng thứ hai chứa n số nguyên A_1, A_2, \dots, A_n ( |A_i| \le 10^9, A_i \neq 0 ).
  • Tổng các giá trị của n trên tất cả các bộ dữ liệu không vượt quá 2 \cdot 10^5 .

Kết quả:

  • Với mỗi bộ dữ liệu, in ra một số nguyên duy nhất là tổng lớn nhất của dãy con đan dấu dài nhất tìm được.

Ví dụ:

Dữ liệu:

4
5
1 2 3 -1 -2
4
-1 -2 -1 -3
10
-2 8 3 8 -4 -1 5 3 3 10
7
1 -10 10 -20 20 -30 30

Kết quả:

2
-1
15
1

Giải thích:

  • Ví dụ 1: Các đoạn cùng dấu là [1, 2, 3] [-1, -2] . Chọn số lớn nhất mỗi đoạn là 3 -1 . Tổng: 3 + (-1) = 2 .
  • Ví dụ 2: Chỉ có một đoạn cùng dấu [-1, -2, -1, -3] . Chọn số lớn nhất là -1 .
  • Ví dụ 3: Các đoạn là [-2] , [8, 3, 8] , [-4, -1] , [5, 3, 3, 10] . Chọn các số lớn nhất mỗi đoạn: -2, 8, -1, 10 . Tổng: -2 + 8 - 1 + 10 = 15 .
  • Ví dụ 4: Các phần tử đã đan dấu sẵn. Tổng các phần tử: 1 + (-10) + 10 + (-20) + 20 + (-30) + 30 = 1 .

Giới hạn:

  • Subtask #1 (15% số điểm): \sum n \le 20 .
  • Subtask #2 (20% số điểm): \sum n \le 2000 .
  • Subtask #3 (10% số điểm): A_i > 0 với mọi i .
  • Subtask #4 (15% số điểm): A_i \cdot A_{i+1} < 0 với mọi 1 \le i < n .
  • Subtask #5 (40% số điểm): Không có ràng buộc bổ sung.