C11CAVE - Hang động

Tags: dp

Problem

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

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

Một con đom đóm bay vào một cái hang đầy những chướng ngại vật gồm: măng đá (nhô lên từ mặt đất) và nhũ đá (đâm xuống từ trần hang). Hang này dài N đơn vị (N chẵn) và cao H đơn vị. Khi vào hang, vật cản đầu tiên là măng đá, sau đó là nhũ đã, rồi lại đến măng đá, … cứ thế thay phiên nhau.

Đây là một ví dụ về một hang dài 14 đơn vị và cao 5 đơn vị.

Con đom đóm này không phải là loài có thể bay quanh các chướng ngại vật. Thay vào đó, nó sẽ chọn một mức chiều cao bắt đầu rồi bay từ đầu đến cuối hang, phá hết tất cả các chướng ngại vật trên đường bay của nó.

Theo ví dụ trên, nếu chọn mức 4, con đom đóm sẽ phá tất cả là 8 chướng ngại vật.

Đây không phải là lựa chọn tốt nhất vì con đom đóm sẽ ít mệt hơn nếu chọn mức 1 hoặc mức 5, lúc này nó chỉ cần phá 7 chướng ngại vật.

Bạn được cho chiều dài, chiều cao và kích thước của tất cả các chướng ngại vật. Hãy xác định số chướng ngại vật tối thiểu mà con đom đóm cần phá để thoát khỏi hang, và có bao nhiêu cách chọn khác nhau đưa đến kết quả đó.

Dữ liệu

  • Dòng 1: Hai số nguyên N và H (1 ≤ N ≤ 2.10^5 và 1 ≤ H ≤ 5.10^5) là chiều dài và chiều cao của hang.
  • Mỗi dòng trong N dòng tiếp theo là một số nguyên dương - kích thước của chướng ngại vật. Tất cả các kích thước đều nhỏ hơn H.

Kết quả

Gồm 2 số nguyên cách nhau là số chướng ngại vật ít nhất cần phá và số cách chọn khác nhau để có được kết quả đó.

Giới hạn

Trong tối đa là 1/3 số test, N * H không vượt quá 10^6.

Ví dụ

Input 1
6 7  
1  
5  
3  
3  
5  
1

Output 1
2 3 

Input 2
14 5  
1  
3  
4  
2  
2  
4  
3  
4  
3  
3  
3  
2  
3  
3

Output 2
7 2

Tutorial

Bài toán có thể đưa về đơn giản như sau: Cho đoạn 1..h, cho n truy vấn, mỗi truy vấn tăng đoạn l..r lên một đơn vị. Yêu cầu tim ra đoạn i..i có tổng nhỏ nhất và đếm số lượng này. Bài này có thể dùng Segment Tree trong O(NlogN). Nhưng thực tế chỉ cần O(N) với nhận xét sau:

Gọi F[i] là giá trị tại đoạn i..i. Khi có truy vấn l..r, ta tăng F[l] lên 1 và giảm F[r+1] đi 1. Khi hết truy vấn, ta duyệt từ 1..h và cộng F[i] thêm F[i-1]. Khi đó với mỗi đoạn l..r của truy vấn F[i](l<i<=r+1) sẽ tăng lên 1, với F[r+1] ban đầu ta đã trừ nên không có sự thay đổi. Vì thể chỉ thực hiện trong O(N).


Submission

C11CAVE.cpp