제출 #540748

#제출 시각아이디문제언어결과실행 시간메모리
540748status_codingExhibition (JOI19_ho_t2)C++14
50 / 100
1073 ms4740 KiB
#include <bits/stdc++.h>

using namespace std;

struct pos
{
    int val, s;

    bool operator<(pos b)
    {
        if(val != b.val)
            return val<b.val;
        return s < b.s;
    }
};

int n,m;
pos v[100005];
int s[100005];

int dp[100005];

int cbDp(int val)
{
    for(int i=n;i>=0;i--)
        if(dp[i] <= val)
            return i;

    return n+1;
    /*
    int st=0, dr=n, mij, last=n+1;

    while(st <= dr)
    {
        mij = (st+dr)/2;

        if(dp[mij] <= val)
        {
            last=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }

    return last;
    */
}

int cbS(int val)
{
    for(int i=1;i<=m;i++)
        if(s[i] >= val)
            return i;

    return m+1;

    /*
    int st=1, dr=m, mij, last=m+1;

    while(st <= dr)
    {
        mij=(st+dr)/2;

        if(s[mij] <= val)
        {
            last=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }

    return last;
    */
}

int main()
{
    cin>>n>>m;

    for(int i=1;i<=n;i++)
        cin>>v[i].s>>v[i].val;
    sort(v+1, v+n+1);

    for(int i=1;i<=m;i++)
        cin>>s[i];
    sort(s+1, s+m+1);

    for(int i=1;i<=n;i++)
        dp[i] = 1e9;

    for(int i=1;i<=n;i++)
    {
        if(v[i].s > s[m])
            continue;

        for(int j=n-1;j>=0;j--)
        {
            int sId = max(dp[j]+1, cbS(v[i].s));

            if(sId <= m)
                dp[j+1] = min(dp[j+1], sId);
        }

        /*
        for(int j=0;j<=n;j++)
            cout<<dp[j]<<' ';
        cout<<'\n';
        */
    }

    int ans=0;
    for(int i=1;i<=n;i++)
        if(dp[i] != 1e9)
            ans = max(ans, i);

    cout<<ans;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...