Wooden Sticks
Xem dạng PDF
Gửi bài giải
Điểm:
0,22 (OI)
Giới hạn thời gian:
1.0s
Giới hạn bộ nhớ:
256M
Input:
stdin
Output:
stdout
Nguồn bài:
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch
Có ~N~ đoạn gỗ. Để xử lý chúng cần thời gian để chuẩn bị :
- Thời gian chuẩn bị cho đoạn gỗ đầu tiên là ~1~ phút.
- Sau khi xử lý xong đoạn gỗ có chiều dài ~l~ và trọng lượng ~w~, không mất thời gian xử lý nếu đoạn gỗ tiếp theo có độ dài ~l'~ và trọng lượng ~w'~ thỏa ~l \leq l'~ and ~w \leq w'~. Ngược lại mất ~1~ phút để chuẩn bị.
Tìm thời gian chuẩn bị ít nhất cho ~N~ đoạn gỗ.
Ví dụ có ~5~ đoạn ~( 9 , 4 ) , ( 2 , 5 ) , ( 1 , 2 ) , ( 5 , 3 )~ và ~( 4 , 1 )~, thì thời gian ít nhất là ~2~ vì có thể xử lý theo thứ tự như sau ~( 4 , 1 ) , ( 5 , 3 ) , ( 9 , 4 ) , ( 1 , 2 ) , ( 2 , 5 ) .~
Input
Dòng đầu là số lượng test, ~T \leq 100~. Mỗi test gồm:
- Dòng đầu là số nguyên dương ~N \leq 5000~.
- Sau đó là ~N~ dòng gồm ~N~ cặp số nguyên dương ~(l_1,w_1),(l_2,w_2),\ldots,(l_N,w_N)~, ~l_i,w_i \leq 10000~, là độ dài và trọng lượng của các khối gỗ.
Output
In ra ~T~ dòng, mỗi dòng là thời gian ít nhất để chuẩn bị các đoạn gỗ của test đó.
Sample Input
3
5
4 9
5 2
2 1
3 5
1 4
3
2 2
1 1
2 2
3
1 3
2 2
3 1
Sample Output
2
1
3
Bình luận
Đây là logic của bài toán: +) ta nhận thấy rằng, ta luôn phải so sánh 2 giá trị với nhau nếu L<=L" và R<=R" thì không mất thời gian và ngược lai. để giải quyết vấn đề này :ta đi sort thằng L trước. và bài toán ta chỉ so sánh R.
+)Sau khi sort theo L tăng dần, bài toán chỉ còn lại việc so sánh theo R.
code:
include <bits/stdc++.h>
using namespace std;
define ll long long
void solve() { ll n ;cin >> n; vector< pair< ll, ll>> a(n+1); for(int i=1; i<=n;i ++) { cin >> a[i].first >> a[i].second;
}
sort(a.begin() + 1, a.begin() + n + 1); vector < ll > ans; for(int i =1; i<=n; i++) { auto idx = lowerbound(ans.begin(), ans.end(),-a[i].second); if ( idx == ans.end()) { ans.pushback(-a[i].second); } else{ *idx = -a[i].second; } } cout << ans.size() << endl; } int main() { int t; cin >> t; while (t--) { solve(); }
} thanks mọi người
sắp sếp các li tăng dần, bằng thì wi tăng dần, ta cần chia nhóm tăng dần tối thiểu để tiết kiệm thời gian và đáp án nằm ở số nhóm, số nhóm dãy con tăng tối thiểu để phân chia một dãy bằng độ dài dãy giảm dài nhất với wi, LDS tối ưu với tìm kiếm nhị phân
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.
mình làm bằng chặt nhị phân trên segment tree, mà khá chậm không biết mn làm như nào=))