#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 2;
struct Picture {
long long size, value, val_idx;
};
long long n, m;
Picture pics[N];
long long frames[N];
bool compareByValue(Picture a, Picture b) {
return a.value < b.value;
}
bool compareBySize(Picture a, Picture b) {
return a.size < b.size;
}
namespace sub2 {
const int MAX = 1002;
long long segtree[MAX][4 * MAX];
bool check() {
return n <= 1000 && m <= 1000;
}
void update(int frame, int node, int l, int r, int idx, long long val) {
if (l == r) {
segtree[frame][node] = max(segtree[frame][node], val);
return;
}
int mid = (l + r) / 2;
if (idx <= mid)
update(frame, node * 2, l, mid, idx, val);
else
update(frame, node * 2 + 1, mid + 1, r, idx, val);
segtree[frame][node] = max(segtree[frame][node * 2], segtree[frame][node * 2 + 1]);
}
long long query(int frame, int node, int l, int r, int ql, int qr) {
if (ql > qr) return 0;
if (l > qr || r < ql) return 0;
if (ql <= l && r <= qr) return segtree[frame][node];
int mid = (l + r) / 2;
return max(query(frame, node * 2, l, mid, ql, qr),
query(frame, node * 2 + 1, mid + 1, r, ql, qr));
}
void solve() {
memset(segtree, 0, sizeof segtree);
// Create a copy sorted by value for processing
Picture byValue[N];
for (int i = 1; i <= n; i++) byValue[i] = pics[i];
sort(byValue + 1, byValue + n + 1, compareByValue);
// Map each picture to its value index
map<pair<long long, long long>, int> val_idx_map;
for (int i = 1; i <= n; i++) {
val_idx_map[{byValue[i].size, byValue[i].value}] = i;
}
// Assign value indices to original pictures
for (int i = 1; i <= n; i++) {
pics[i].val_idx = val_idx_map[{pics[i].size, pics[i].value}];
}
long long ans = 0;
// Process pictures in SIZE order (as before)
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (pics[i].size <= frames[j]) {
long long best_prev = 0;
// Look in ALL previous frames (0 to j) for pictures with smaller value index
for (int k = 0; k <= j; k++) {
if (pics[i].val_idx > 1) {
best_prev = max(best_prev, query(k, 1, 1, n, 1, pics[i].val_idx - 1));
}
}
long long new_val = best_prev + 1;
update(j, 1, 1, n, pics[i].val_idx, new_val);
ans = max(ans, new_val);
}
}
}
cout << ans;
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> pics[i].size >> pics[i].value;
}
for (int i = 1; i <= m; i++) {
cin >> frames[i];
}
sort(frames + 1, frames + m + 1);
sort(pics + 1, pics + n + 1, compareBySize);
if (sub2::check()) {
sub2::solve();
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |