Submission #1150241

#TimeUsernameProblemLanguageResultExecution timeMemory
1150241shjeongMatryoshka (JOI16_matryoshka)C++20
100 / 100
516 ms49988 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma optimize("unroll-loops") #define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0) #define all(x) x.begin(), x.end() #define rll(x) x.rbegin(), x.rend() #define COMP(x) x.erase(unique(all(x)), x.end()) #define MOD 1000000007 #define MOD2 998244353 #define sz(x) (ll)x.size() typedef __uint128_t lll; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<ll,ll> pll; typedef pair<ll, pll> PP; const ll Lnf = 2e18; const ll inf = 1e9; ll n, q; struct segtree{ vector<ll> tree; segtree(): tree(1616161){} void upd(ll node, ll s, ll e, ll i, ll d){ if(e<i or i<s)return; if(s==e)tree[node]=max(tree[node],d); else{ ll mid = s+e>>1; upd(node<<1,s,mid,i,d); upd(node<<1|1,mid+1,e,i,d); tree[node]=max(tree[node<<1],tree[node<<1|1]); } } ll query(ll node, ll s, ll e, ll l, ll r){ if(e<l or r<s)return 0; if(l<=s and e<=r)return tree[node]; ll mid = s+e>>1; return max(query(node<<1,s,mid,l,r),query(node<<1|1,mid+1,e,l,r)); } } seg; ll ans[202020]; vector<pll> p[404040]; //[y,isquery] int main(){ fast; cin>>n>>q; vector<pll> v(n); vector<ll> cpx, cpy; for(auto &[a,b] : v){ cin>>a>>b; cpx.push_back(a); cpy.push_back(b); } vector<pll> Q(q); for(auto &[a,b] : Q){ cin>>a>>b; cpx.push_back(a); cpy.push_back(b); } sort(all(cpx)); COMP(cpx); sort(all(cpy)); COMP(cpy); for(int i = 0 ; i < n ; i++){ ll x = lower_bound(all(cpx),v[i].first)-cpx.begin()+1; ll y = lower_bound(all(cpy),v[i].second)-cpy.begin()+1; y = sz(cpy)+1-y; p[x].push_back({y,0}); // cout<<x<<" "<<y<<endl; } for(int i = 0 ; i < q ; i++){ ll x = lower_bound(all(cpx),Q[i].first)-cpx.begin()+1; ll y = lower_bound(all(cpy),Q[i].second)-cpy.begin()+1; y = sz(cpy)+1-y; p[x].push_back({y,-(i+1)}); } for(int x = sz(cpx) ; x >= 1 ; x--){ sort(rll(p[x])); for(auto [y,id] : p[x]){ // cout<<x<<" "<<y<<" "<<id<<endl; if(id==0){ seg.upd(1,1,sz(cpy),y,seg.query(1,1,sz(cpy),y,sz(cpy))+1); } else{ id=-id; ans[id] = seg.query(1,1,sz(cpy),y,sz(cpy)); } } } for(int i = 1 ; i <= q ; i++)cout<<ans[i]<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...