제출 #1310354

#제출 시각아이디문제언어결과실행 시간메모리
1310354syanvuExhibition (JOI19_ho_t2)C++20
100 / 100
38 ms7300 KiB
// #pragma optimize ("g",on) // #pragma GCC optimize ("inline") // #pragma GCC optimize ("Ofast") // #pragma GCC optimize ("unroll-loops") // #pragma GCC optimize ("03") #include <bits/stdc++.h> #define pb push_back #define SS ios_base::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr); #define int long long #define all(v) v.begin(),v.end() using namespace std; mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()); const int N = 4e5 + 1, inf = 1e9 + 1, mod = 998244353; pair<int, int> t[4 * N]; int add[4 * N]; pair<int, int> f(pair<int, int> a, pair<int, int> b){ if(a.first > b.first) return a; else if(a.first < b.first) return b; else if(a.second < b.second) return a; else return b; } void push(int v, int tl, int tr){ t[v].first = max(t[v].first, add[v]); if(tl < tr){ add[v * 2] = max(add[v * 2], add[v]); add[v * 2 + 1] = max(add[v * 2 + 1], add[v]); } add[v] = 0; } void build(int v, int tl, int tr){ if(tl == tr){ t[v] = {0, tl}; return; } int mid = (tl + tr) / 2; build(v * 2, tl, mid); build(v * 2 + 1, mid + 1, tr); t[v] = f(t[v * 2], t[v * 2 + 1]); } void upd(int v, int tl, int tr, int l, int r, int x){ push(v, tl, tr); if(tl > r || l > tr) return; if(tl >= l && r >= tr){ add[v] = max(add[v], x); push(v, tl, tr); return; } int mid = (tl + tr) / 2; upd(v * 2, tl, mid, l, r, x); upd(v * 2 + 1, mid + 1, tr, l, r, x); t[v] = f(t[v * 2], t[v * 2 + 1]); } pair<int, int> get(int v, int tl, int tr, int l, int r){ push(v, tl, tr); if(tl > r || l > tr) return {-inf, inf}; if(tl >= l && r >= tr) return t[v]; int mid = (tl + tr) / 2; return f(get(v * 2, tl, mid, l, r), get(v * 2 + 1, mid + 1, tr, l, r)); } void solve(){ int n, m; cin >> n >> m; pair<int, int> p[n + 1]; int s[m + 1]; vector<int> v; for(int i = 1; i <= n; i++){ cin >> p[i].first >> p[i].second; } for(int i = 1; i <= m; i++){ cin >> s[i]; } build(1, 1, m); sort(s + 1, s + m + 1); sort(p + 1, p + n + 1, [&](pair<int, int> a, pair<int, int> b){ if(a.second != b.second) return a.second < b.second; return a.first < b.first; }); int ans = 0; int j = m; for(int i = n; i >= 1; i--){ if(j >= 1 && p[i].first <= s[j]){ ans++; j--; } } cout << ans; } signed main(){ SS // freopen("trains.in", "r", stdin); // freopen("trains.out", "w", stdout); int t = 1; // cin >> t; while(t--){ solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...