Module: Corak dalam Pengaturcaraan Dinamik


Problem

5 /7


Restoran

Theory Click to read/hide

Penafian: Kaedah yang diterangkan di bawah tidak universal, tetapi ia selalunya boleh menyelesaikan masalah atau membantu anda mendapatkan penyelesaian yang betul.

Jika terdapat satu set jurang yang terletak pada beberapa paksi (biasanya paksi masa atau indeks beberapa tatasusunan) dan anda perlu memilih beberapa daripadanya dengan cara yang optimum supaya jurang yang dipilih tidak bersilang, maka anda harus cuba menggunakan pengaturcaraan dinamik .

Skim penyelesaian anggaran:

Pada mulanya, kami mengisih jurang yang tersedia mengikut sempadan kanan. Mari kita mulakan dinamik berikut: dp[i] - jawapan untuk selang i pertama. 
Kami akan mengira semula seperti berikut: pertama, pertimbangkan situasi bahawa selang ini tidak akan digunakan, kemudian hanya dp[i] = dp[i-1]. Ambil perhatian bahawa ini memastikan bahawa nilai dp[i] tidak berkurangan semasa i berkembang. Dan ini adalah logik, kerana. menambah jurang baharu, kita tidak boleh memburukkan lagi jawapan global: sama ada kita hanya mengabaikan jurang baharu itu, atau kita membina varian yang lebih menguntungkan menggunakannya. Sekarang, jika kita ingin menggunakan jurang ke-i, maka kita boleh menggunakan jurang yang sempadan kanannya kurang daripada sempadan kiri jurang semasa, kerana kita mesti memilih satu set jurang tidak bertindih. Untuk melakukan ini, kami mula-mula mengisih jurang mengikut sempadan kanan, supaya kini kami boleh mencari kedudukan yang diperlukan dengan cekap. Ini boleh dilakukan secara analitikal, jika boleh, tetapi dalam kes umum adalah mungkin untuk mencari jurang dengan binsearch, sempadan kanan yang kurang daripada sempadan kiri semasa dan, pada masa yang sama, maksimum yang mungkin. satu. Kami mahu memaksimumkan sempadan yang betul atas alasan tamak, kerana apabila saya membesar, jawapannya hanya boleh meningkat. Sehubungan itu, kami mencari kedudukan p yang diperlukan dan mengira semula dp[i] melalui dp[p] dan selang ke-i.

Problem

Restoran menerima n tempahan untuk jamuan. Setiap pesanan dicirikan oleh dua nilai: masa mula jamuan li dan masa tamat ri (li ≤  r i).

Pihak pengurusan restoran boleh sama ada menerima tempahan atau menolaknya. Berapakah bilangan maksimum pesanan yang boleh diterima?

Tiada dua pesanan yang diterima boleh bersilang, iaitu, tidak sepatutnya ada satu titik masa yang dimiliki oleh dua pesanan yang diterima sekaligus. Jika salah satu pesanan bermula pada masa yang sama dengan yang lain berakhir, maka ia tidak boleh diterima bersama.

Input:
Baris pertama mengandungi integer n (1 ≤ n ≤ 200000) — bilangan pesanan. Setiap baris n seterusnya mengandungi sepasang integer li, ri (0 ≤ li  &le ; ri ≤ 109).

Output:
Cetak bilangan maksimum pesanan yang boleh diterima.

Contoh:
 
Input Output
2
7 11
4 7
1
5
1 2
23
34
4 5
5 6
3
6
48
15
47
25
1 3
68
2