canuc80k1121·22/50

Đếm Cặp Ngược Thứ Tự

Nộp bài trên LQDOJ

Bài 11 · Divide and Conquer

Cho dãy số nguyên . Một cặp chỉ số được gọi là nghịch thế khi

và .

Dấu so sánh là nghiêm ngặt: nếu thì cặp đó không phải nghịch thế. Hãy đếm tổng số nghịch thế của dãy.

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa số nguyên .

Output

  • In một số nguyên là số nghịch thế của dãy.

Constraints

  • .
  • .
  • Kết quả có thể vượt giới hạn số nguyên bit.

Scoring

  • Subtask ( điểm): .
  • Subtask ( điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

4
3 1 2 1

Output

4

Giải thích: Bốn nghịch thế là và . Hai phần tử có giá trị bằng nhau nên không tạo thêm nghịch thế.

Lời giải tóm tắt
  • Ý tưởng: Mọi nghịch thế thuộc đúng một trong ba nhóm: nằm hoàn toàn trong nửa trái, nằm hoàn toàn trong nửa phải, hoặc đi từ nửa trái sang nửa phải. Hai nhóm đầu được đệ quy xử lý; nhóm chéo được đếm khi gộp.
  • Thuật toán: Sau khi hai nửa đã tăng, dùng hai con trỏ. Nếu phần tử trái không lớn hơn phần tử phải, ghi nó trước. Ngược lại, phần tử phải hiện tại nhỏ hơn toàn bộ phần tử trái chưa dùng, nên cộng ngay số lượng mid-i rồi ghi phần tử phải.
  • Chứng minh tính đúng đắn: Theo quy nạp, hai lời gọi con đếm đúng mọi nghịch thế nội bộ. Trong bước gộp, khi a[i]>a[j], do nửa trái đã tăng nên chính xác các vị trí từ i đến mid-1 đều tạo nghịch thế với a[j]; thuật toán cộng mỗi cặp đúng một lần. Khi a[i]≤a[j], a[i] không thể tạo nghịch thế với a[j] hay phần tử nào đứng sau nó trong nửa phải. Do ba nhóm rời nhau và đầy đủ, tổng nhận được là đúng.
  • Độ phức tạp: Thời gian và bộ nhớ phụ .