Submission #1311592

#TimeUsernameProblemLanguageResultExecution timeMemory
1311592vyaductMatryoshka (JOI16_matryoshka)C++20
100 / 100
300 ms14380 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; const int mxN = 200001; pll dolls[mxN]; pair<pll, ll> qrys[mxN]; ll ans[mxN]; /* claim: the minimum number of towers is the LDS of the selected items when R[] is sorted */ void solve(){ int n,q; cin>>n>>q; for (int i=0;i<n;i++) { cin>>dolls[i].first>>dolls[i].second; dolls[i].second *= -1; } for (int i=0;i<q;i++){ cin>>qrys[i].first.first>>qrys[i].first.second; qrys[i].second = i; } sort(dolls, dolls + n, greater<>()); sort(qrys, qrys + q, greater<>()); vector<pll> dp; const ll INF = 1e9; for (int i=0, j=0;i<q;i++){ while(j<n && dolls[j].first >= qrys[i].first.first){ pll X = make_pair(-dolls[j].second, INF); int lds = upper_bound(dp.begin(), dp.end(), X) - dp.begin(); if (lds == dp.size()) dp.push_back(make_pair(-dolls[j].second, dolls[j].first)); else dp[lds] = {-dolls[j].second, dolls[j].first}; j++; } ans[qrys[i].second] = upper_bound(dp.begin(), dp.end(), make_pair(qrys[i].first.second, INF)) - dp.begin(); } for (int i=0;i<q;i++){ cout << ans[i] << "\n"; } } int main(){ solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...