Problem
https://vn.spoj.com/problems/QMAX
https://oj.vnoi.info/problem/QMAX
Cho một dãy gồm n
phần tử có giá trị ban đầu bằng 0
.
Cho m
phép biến đổi, mỗi phép có dạng (u, v, k)
: tăng mỗi phần tử từ vị trí u
đến vị trí v
lên k
đơn vị.
Cho q
câu hỏi, mỗi câu có dạng (u, v)
: cho biết phần tử có giá trị lớn nhất thuộc đoạn [u, v]
Giới hạn
n, m, q <= 50,000
k > 0
- Giá trị của một phần tử luôn không vượt quá
2^31 - 1
- Dòng 1:
n
, m
m
dòng tiếp theo, mỗi dòng chứa u, v, k
cho biết một phép biến đổi- Dòng thứ
m+2
: p
p
dòng tiếp theo, mỗi dòng chứa u, v
cho biết một phép biến đổi
Output
- Gồm
p
dòng chứa kết quả tương ứng cho từng câu hỏi.
Example
Input
6 2
1 3 2
4 6 3
1
3 4
Output
3
Tutorial
Bài này có 2 bài toán con cần giải quyết. Thứ nhất là xử lý cái vụ cộng mấy số lên k
lần trên mỗi đoạn truy vấn. Thứ hai là xử lý các truy vấn max. Cái thứ 2 thì đơn giản rồi nếu ta đã có được mảng kết quả của các truy vấn đầu tiên, bằng cách sử dụng segment tree hoặc RMQ để tìm max trên từng đoạn.
Vậy còn bài toán thứ nhất. Ta sử dụng trick như sau: Với đoạn [l,r]
được tăng lên k
đơn vị, ta tăng a[l]
lên k
, sau đó thằng a[r+1]
ta giảm đi k
. Khi đó sau m
truy vấn tăng, ta duyệt mảng rồi cập nhật a[i] += a[i-1]
, khi đó những mỗi giá trị trong đoạn [l,r]
sẽ được cộng đúng như các truy vấn. Do đó ta chỉ cần O(m)
cho các truy vấn cộng.
Submission
Nếu bạn thấy bài viết này hay, hãy share bài viết này cho mọi người nhé 😉.
Share this post →