Submission #1291071

#TimeUsernameProblemLanguageResultExecution timeMemory
1291071kubinsgk8Exhibition (JOI19_ho_t2)C++20
0 / 100
15 ms34092 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...