Submission #1148646

#TimeUsernameProblemLanguageResultExecution timeMemory
1148646dostsExhibition (JOI19_ho_t2)C++20
100 / 100
44 ms9032 KiB
#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3,unroll-loops")
using namespace std;
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " <<    
#define all(cont) cont.begin(),cont.end()
#define vi vector<int>

const int inf = 1e18,N = 3e5+1,MOD = 998244353,B = 250;
vi val(N);

struct ST {
    vi t;
    void build(int node,int l,int r) {
        if (l == r) {
            t[node]= val[l];
            return;
        }
        int m = (l+r) >> 1;
        build(2*node,l,m),build(2*node+1,m+1,r);
        t[node] = min(t[2*node],t[2*node+1]);
    }
    ST(int nn) {
        t.resize(4*nn+1,0);
        build(1,1,nn);
    }
    int query(int node,int l,int r,int v) {
        if (t[node] > v) return 0;
        if (l == r) return l;
        int m = (l+r) >> 1;
        int q = query(2*node+1,m+1,r,v);
        if (!q) return query(2*node,l,m,v);
        return q;
    }
    int walk(int node,int l,int r,int L,int R,int v) {
        if (l > R || r < L) return 0;
        if (t[node] > v) return 0;
        if (l >= L && r <= R) return query(node,l,r,v);
        int m = (l+r) >> 1;
        int w = walk(2*node+1,m+1,r,L,R,v);
        if (!w) return walk(2*node,l,m,L,R,v);
        return w;
    }
};
void solve() { 
    int n,m;
    cin >> n >> m;
    vi s(n+1),v(n+1);
    for (int i=1;i<=n;i++) cin >> s[i] >> v[i];
    vi frame(m+1);
    for (int i=1;i<=m;i++) cin >> frame[i];
    sort(frame.begin()+1,frame.end());
    vi pics(n+1);
    iota(all(pics),0ll);
    sort(pics.begin()+1,pics.end(),[&](int x,int y) {
        if (v[x] != v[y]) return v[x] < v[y];
        return s[x] < s[y];
    });
    for (int i=1;i<=n;i++) val[i] = s[pics[i]];
    int ans = 0;
    int cur = m,allow = n;
    ST st(n);
    while (cur >= 1 && allow >= 1) {
        int frst = st.walk(1,1,n,1,allow,frame[cur]);
        if (frst == 0) break;
        allow = frst-1;
        ans++;
        cur--;
    }   
    cout << ans << '\n';
}

int32_t main() { 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...