DHLOCK - Khóa số

Tags: math, brute-force, greedy

Problem

https://vn.spoj.com/problems/DHLOCK

https://oj.vnoi.info/problem/DHLOCK

Bạn nhận được một hộp quà với một khóa số ở bên ngoài. Thông tin hiển thị trên khóa là một dãy n số nguyên a1, a2, ..., an các số nằm trong phạm vi từ 0 đến k.

n+2 phím dùng để thay đổi giá trị các số, một phím nằm bên trái khóa, một phím nằm bên phải khóa, dưới mỗi số có một phím. Bạn nhanh chóng nhận ra rằng:

  • Khi bấm vào phím nằm bên trái khóa thì giá trị tất cả các số trên khóa tăng lên 1, nếu số nào đang có giá trị là k thì sau khi bấm nó nhận giá trị 0. Ví dụ, nếu dãy là (10, 9, 0)k = 10, khi bấm vào phím nằm bên trái khóa thì trạng thái mới của dãy là (0, 10, 1).

  • Khi bấm vào phím nằm bên phải khóa thì tất cả các số dịch chuyển đi sang bên phải, trừ số cuối cùng, số cuối cùng trở thành số đầu tiên. Ví dụ, nếu dãy là (10, 9, 0)k = 10, khi bấm vào phím nằm bên phải khóa thì trạng thái mới của dãy là (0, 10, 9).

  • Khi bấm vào phím nằm bên dưới số thứ i (i = 1, 2,..., n) thì giá trị số thứ i trên khóa tăng lên 1, nếu số đang có giá trị là k thì sau khi bấm nó nhận giá trị 0. Ví dụ, nếu dãy là (10, 9, 0)k = 10, khi bấm vào phím nằm bên dưới số thứ 2 thì trạng thái mới của dãy là (10, 10, 0).

Trên tờ bưu thiếp gửi kèm chiếc hộp có ghi một dãy n số nguyên b1, b2, ..., bn chính là mật mã để mở được chiếc hộp. Chiếc hộp sẽ được mở nếu thông tin hiển thị trên khóa số là dãy b1, b2, ..., bn.

Yêu cầu: Cho hai dãy số nguyên a1, a2, ..., an, b1, b2, ..., bn và số nguyên dương k, hãy tìm cách bấm ít lần nhất để mở được chiếc hộp.

Input

  • Dòng đầu chứa hai số nguyên dương n, k;
  • Dòng thứ hai chứa n số nguyên không âm a1, a2, ..., an (an ≤ k)
  • Dòng thứ ba chứa n số nguyên không âm b1, b2, ..., bn (bn ≤ k)

Output

Một số nguyên là số lần bấm ít lần nhất để mở được chiếc hộp

Example

Input
3 10
10 9 0
1 0 0

Output
3

Ghi chú:

  • Có 20% số test ứng với 20% số điểm có n = 3k ≤ 10
  • Có 40% số test ứng với 40% số điểm có n ≤ 30k ≤ 1000
  • Có 40% số test còn lại ứng với 40% số điểm có n ≤ 300k ≤ 10^6

Tutorial

Nhận xét:

  • không dùng quá n-1 lần đẩy sang phải.
  • nếu đã dùng tăng toàn bộ ít nhất 1 lần thì chắc chắn phải tăng đến một số nào đó trong mã khóa b[], tức là sau khi tăng thì tồn tại ít nhất một khóa không phải tăng cá nhân nữa:

Ví dụ ban đầu a1 a2 a3 a4 a5 ... an, giả sử tăng lên d được dãy c[]: c1 c2 c3 c4 c5 ... cn. Khi đó, giả sử tất cả cần phải tăng lên mới được dãy b[] b1 b2 b3 b4 b5 ... bn , thì gọi x là min trong các giá trị cần tăng thì ta thực hiện tăng toàn bộ lên x lần thì số bước sẽ nhỏ hơn.

Do đó dựa vào 2 nhận xét trên và N <= 300, ta có một thuật toán O(N^3)


Submission

DHLOCK.cpp