Gửi bài giải


Điểm: 0,10 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 512M
Input: stdin
Output: stdout

Nguồn bài:
VNOI Marathon '08 - Practice RoundSource: Russian Winter Training Camp 2004
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Cho dãy số nguyên a1, a2, ..., an (~1 \leq n \leq 100000~), mỗi số không vượt quá 10000. Dãy số này được viết trên một vòng tròn. Nghĩa là, khi cắt vòng tròn tại vị trí j, ta thu được:

~a_{j}~, ~a_{j+1}~,..., ~a_{n}~, ~a_1~, ~a_2~, ..., ~a_{j-1}~

Vị trí j được gọi là vị trí tốt, nếu các điều kiện sau đây được thỏa mãn:

  • ~a_{j}~ ~>~ 0
  • ~a_{j}~ + ~a_{j+1}~ ~>~ 0
  • ....
  • ~a_{j}~ + ~a_{j+1}~ + ... + ~a_{n}~ ~>~ 0
  • ~a_{j}~ + ~a_{j+1}~ + ... + ~a_{n}~ + ~a_1~ ~>~ 0
  • ...
  • ~a_{j}~ + ~a_{j+1}~ + ... + ~a_{n}~ + ~a_1~ + ~a_2~ + ... + ~a_{j─2}~ ~>~ 0
  • ~a_{j}~ + ~a_{j+1}~ + ... + ~a_{n}~ + ~a_1~ + ~a_2~ + ... + ~a_{j─2}~ + ~a_{j─1}~ ~>~ 0

Yêu cầu: hãy đếm số vị trí tốt.

Input

  • Dòng đầu tiên chứa số nguyên n.
  • Dòng thứ 2 chứa dãy số ~a_1~, ~a_2~,...,~a_{n}~.

Output

  • In ra 1 số nguyên duy nhất là số vị trí tốt.

Sample Input

5
0 1 -2 10 3

Sample Output

2

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • -1
    ngoccaidu2008  đã bình luận lúc 12, Tháng 12, 2025, 15:33

    trước từ đề bài dễ thấy ta cần kéo mảng có độ dài n thành 2*n . Sau đó tính cái prefix sum như bình thường thôi.

    như vậy tại 1 vị trí j ta cần điều kiện a[j]+a[j+1]+a[j+2]+...+a[k]>0 (j<=k<=j+n-1)

    Gọi S[k]=a[j]+a[j+1]+a[j+2]+...+a[k], vị trí j được gọi là tốt nhất khi và chỉ khi min(S[k])>0 với (j<=k<=j+n-1)

    hay min(S[k]-S[j-1])>0 (j<=k<=j+n-1)

    => min(S[k])>S[j-1]

    từ hướng này thì ta sẽ có 2 cách xử lí: có thể dùng cây phân đoạn như seg hay fenwick hoặc dùng deque. Vì trong bình luận chưa ai dùng deque thì mình sẽ làm theo hướng deque

    Ta dùng deque để tìm giá trị min trong đoạn từ [j,j+n-1]. Các bạn có thể tham khảo code tìm min ở đây: Tại đây

    sau đó chỉ cần với mỗi vị trí j chỉ cần xem min(S[k]) (j<=k<j+n-1) > S[j-1] hay không? nếu được thì thỏa mãn

    code tham khảo: ideone


  • 0
    BarmyHawk  đã bình luận lúc 6, Tháng 12, 2025, 5:33

    Mảng cộng dồn + multiset vị trí j thỏa mãn nếu: với mọi vị trí i (j <= i <= n) f[i] - f[j - 1] > 0. Điều này có nghĩa là không tồn tại vị trí i nào thỏa mãn f[i] - f[j - 1] <= 0 -> f[i] <= f[j - 1] Vậy ta cần 1 multiset duy trì các f[i] nằm bên phải j sau đó tìm phần tử lớn nhất <= f[j - 1] nếu không tìm được tức là thỏa mãn tương tự với 1 <= i <= j thỏa mãn: f[n] - f[j - 1] + f[i] > 0


  • 12
    kuriyama_san  đã bình luận lúc 15, Tháng 10, 2024, 17:24 chỉnh sửa

    Bạn nào dùng Segment Tree + prefixSum nhưng cứ bị sai test 2, 11, 15, 16, 18, 19, 20, 21 thì là do Segment Tree của bạn khởi tạo bị thiếu phần tử nhé. Do mảng A cũng như mảng PrefixSum độ dài 2 * MaxN. Vậy Segment Tree phải có độ dài 4 * 2 * MaxN mới đủ chứa mảng F


  • 47
    hieuhfgr  đã bình luận lúc 17, Tháng 6, 2024, 6:44 chỉnh sửa

    Hint

    kéo độ dài mảng ~n~ phần tử ra thành ~2*n~ phần tử. Giả sử có mảng ~pre_i~ ~(1 \le i \le 2*n)~, khi xét dãy con độ dài ~n~ trong dãy ~pre~ thì có tính chất gì?

    Solution:

    kéo dài mảng ~a~ thành mảng độ dài ~2*n~ bằng cách gán ~a[n+i] = a[i]~. Gọi ~pre_i~ là tổng tiền tố từ 1 đến ~i~. Ta cho ~i~ chạy từ ~1->n~ và xét mảng dãy có độ dài ~n~ bắt đầu từ ~i~:

    • Để thỏa mãn điều kiện thì cần không tồn tài một vị trí ~j~ ~(i \le j \le i+n-1)~ mà ~pre_j-pre_i \le 0~
    • đến bước này thì ta có thể xài segment tri để lấy ~val = min(pre[i], pre[i+1], pre[i+2],...,pre[i+n-1])~ và kiểm tra xem ~val-pre[i-1] > 0~ hay không

    lần đầu viết sol mong mọi ng đừng downvote T_T


    • -12
      hieuz08  đã bình luận lúc 17, Tháng 10, 2024, 15:10

      Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


    • -12
      kakacoder  đã bình luận lúc 20, Tháng 6, 2024, 14:28

      Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -8
    hienduy  đã bình luận lúc 27, Tháng 2, 2024, 8:36

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -42
    hathaictb  đã bình luận lúc 22, Tháng 6, 2021, 10:11

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


    • -25
      nictysine1  đã bình luận lúc 28, Tháng 2, 2022, 8:59

      Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.