Submission #1316497

#TimeUsernameProblemLanguageResultExecution timeMemory
1316497khanhphucscratchExhibition (JOI19_ho_t2)C++20
0 / 100
0 ms332 KiB
#include<bits/stdc++.h>
using namespace std;
int st[400020];
void update(int node, int l, int r, int p, int v)
{
    if(l > p || r < p) return;
    if(l == p && r == p) st[node] = max(st[node], v);
    else{
        update(node*2, l, (l+r)/2, p, v);
        update(node*2+1, (l+r)/2+1, r, p, v);
        st[node] = max(st[node*2], st[node*2+1]);
    }
}
int query(int node, int l, int r, int tl, int tr)
{
    if(l > tr || r < tl) return 0;
    if(l >= tl && r <= tr) return st[node];
    else return max(query(node*2, l, (l+r)/2, tl, tr), query(node*2+1, (l+r)/2+1, r, tl, tr));
}
pair<int, int> a[100005];
int b[100005], c[100005], dp[100005];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n, m; cin>>n>>m;
    for(int i = 1; i <= n; i++){
        cin>>a[i].first>>a[i].second;
        swap(a[i].first, a[i].second);
    }
    for(int i = 1; i <= m; i++) cin>>c[i];
    for(int i = 1; i <= n; i++){
        a[i].second *= -1; a[i].first *= -1;
    }
    for(int i = 1; i <= m; i++) c[i] *= -1;
    sort(a+1, a+n+1); sort(c+1, c+m+1);
    vector<int> vec;
    for(int i = 1; i <= n; i++) vec.push_back(a[i].second);
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());
    for(int i = 1; i <= n; i++) b[i] = upper_bound(vec.begin(), vec.end(), a[i].second) - vec.begin();

    int ans = 0;
    for(int i = 1; i <= n; i++){
        int p1 = upper_bound(c+1, c+m+1, a[i].second) - c - 1;
        int p2 = query(1, 1, n, 1, b[i])+1;
        dp[i] = min(p1, p2); ans = max(ans, dp[i]);
        update(1, 1, n, b[i], dp[i]);
    }
    cout<<ans;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...