Submission #155653

# Submission time Handle Problem Language Result Execution time Memory
155653 2019-09-29T14:58:45 Z popovicirobert Exhibition (JOI19_ho_t2) C++14
0 / 100
2 ms 376 KB
#include <bits/stdc++.h>
#define lsb(x) (x & (-x))
#define ll long long
#define ull unsigned long long



#if 0
const int MOD = ;

inline int lgput(int a, int b) {
    int ans = 1;
    while(b > 0) {
        if(b & 1) ans = (1LL * ans * a) % MOD;
        b >>= 1;
        a = (1LL * a * a) % MOD;
    }
    return ans;
}

inline void mod(int &x) {
    if(x >= MOD)
        x -= MOD;
}

inline void add(int &x, int y) {
    x += y;
    mod(x);
}

inline void sub(int &x, int y) {
    x += MOD - y;
    mod(x);
}

inline void mul(int &x, int y) {
    x = (1LL * x * y) % MOD;
}

inline int inv(int x) {
    return lgput(x, MOD - 2);
}
#endif

#if 0
int fact[], invfact[];

inline void prec(int n) {
    fact[0] = 1;
    for(int i = 1; i <= n; i++) {
        fact[i] = (1LL * fact[i - 1] * i) % MOD;
    }
    invfact[n] = lgput(fact[n], MOD - 2);
    for(int i = n - 1; i >= 0; i--) {
        invfact[i] = (1LL * invfact[i + 1] * (i + 1)) % MOD;
    }
}

inline int comb(int n, int k) {
    if(n < k) return 0;
    return (1LL * fact[n] * (1LL * invfact[k] * invfact[n - k] % MOD)) % MOD;
}
#endif

using namespace std;

struct Fenwick {
    vector < pair <int, int> > aib;
    int n;

    inline void init(int _n) {
        n = _n;
        aib.resize(n + 1, {0, -1});
    }

    inline void update(int pos, int cnt, int p) {
        for(int i = pos + 1; i <= n; i += lsb(i)) {
            if(cnt > aib[i].first) {
                aib[i] = {cnt, p};
            }
        }
    }

    inline pair <int, int> query(int pos) {
        pair <int, int> ans = {0, 1e9};
        for(int i = pos + 1; i > 0; i -= lsb(i)) {
            if(ans.first < aib[i].first || (ans.first == aib[i].first && ans.second > aib[i].second)) {
                ans = aib[i];
            }
        }
        return ans;
    }
};

int main() {
#if 0
    ifstream cin("A.in");
    ofstream cout("A.out");
#endif
    int i, n, m;
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n >> m;

    vector < pair <int, int> > a(n);
    for(i = 0; i < n; i++) {
        cin >> a[i].second >> a[i].first;
    }
    sort(a.begin(), a.end());

    /*for(auto it : a) {
        cerr << it.first << " " << it.second << "   ";
    }
    cerr << "\n";*/

    vector < pair <int, int> > b(n);
    for(i = 0; i < n; i++) {
        b[i] = {a[i].second, i};
    }
    sort(b.begin(), b.end());

    /*for(auto it : b) {
        cerr << it.first << " " << it.second << "   ";
    }
    cerr << "\n";*/

    vector <int> c(m);
    for(i = 0; i < m; i++) {
        cin >> c[i];
    }
    sort(c.begin(), c.end());

    Fenwick fen; fen.init(n);
    for(auto it : b) {
        auto cur = fen.query(it.second - 1);
        int res = cur.second;
        for(int step = 1 << 17; step; step >>= 1) {
            if(res + step < m && c[res + step] < it.first) {
                res += step;
            }
        }
        res++;
        //cerr << cur.first << " " << cur.second << " " << res << "\n";
        if(res < m) {
            fen.update(it.second, cur.first + 1, res);
        }
    }

    cout << fen.query(n - 1).first;

    return 0;
}

# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Incorrect 2 ms 376 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Incorrect 2 ms 376 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Incorrect 2 ms 376 KB Output isn't correct
3 Halted 0 ms 0 KB -