Submission #1150529

#TimeUsernameProblemLanguageResultExecution timeMemory
1150529koukirocksExhibition (JOI19_ho_t2)C++20
100 / 100
66 ms1872 KiB
#include<bits/stdc++.h>
#define speed ios_base::sync_with_stdio(0); cin.tie(0)
#define all(x) x.begin()+1, x.end()
#define F first
#define S second

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

struct BIT {
    int n;
    vector<int> a;
    BIT(int _n):n(_n) {
        a.resize(n+1);
    }
    void update(int x,int v) {
        while (x<=n) {
            a[x]=max(a[x],v);
            x+=(-x&x);
        }
    }
    int query(int x) {
        // cout<<x<<" x\n"<<flush;
        int ans=0;
        while (x) {
            ans=max(ans,a[x]);
            x-=(-x&x);
        }
        return ans;
    }
};

int main() {
    speed;
    int n,m;
    cin>>n>>m;
    vector<pii> pt(n+1);
    vector<int> fm(m+1);
    for (int i=1;i<=n;i++) {
        cin>>pt[i].S>>pt[i].F;
    }
    sort(all(pt));
    for (int i=1;i<=m;i++) {
        cin>>fm[i];
    }
    sort(all(fm));
    for (int i=1;i<=n;i++) {
        pt[i].S=lower_bound(all(fm),pt[i].S)-fm.begin();
        pt[i].S=m-pt[i].S+1;
        // cout<<pt[i].S<<" pt\n"<<flush;
    }
    BIT b(m);
    for (int i=n;i>=1;i--) {
        if (pt[i].S==0) continue;
        int mx=b.query(pt[i].S-1);
        int l=0,r=pt[i].S-1;
        while (l<r) {
            int mid=l+r>>1;
            if (b.query(mid)==mx) r=mid;
            else l=mid+1;
        }
        b.update(l+1,mx+1);
    }
    cout<<b.query(m)<<"\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...