Submission #67530

#TimeUsernameProblemLanguageResultExecution timeMemory
67530knon0501조화행렬 (KOI18_matrix)C++14
38 / 100
4048 ms486984 KiB
#include <bits/stdc++.h> using namespace std; #define f first #define s second int n,m; const int MX=2e5+5; pair<int,pair<int,int>> a[MX]; unordered_map<int,int> xx; unordered_map<int,int> yy; int ans; int num; int num2; set<int> S1; set<int> S2; struct Tree{ int l,r,w; }seg[MX*3]; struct Real{ int l,r,d; }seg2[MX*200]; inline int max2(int x,int y){ return x>y ?x:y; } int g(int y,int l,int r,int lv){ if(r<=y)return seg2[lv].d; int u=0,v=0; int mid=(l+r)/2; if(y>mid){ if(seg2[lv].r)u=g(y,mid+1,r,seg2[lv].r); if(u==ans)return u; } if(seg2[lv].l) v=g(y,l,mid,seg2[lv].l); return max2(u,v); } int f(int x,int y,int l,int r,int lv){ if(r<=x){ if(seg[lv].w==0)return 0; return g(y,1,n,seg[lv].w); } int u=0,v=0; int mid=(l+r)/2; if(x>mid){ if(seg[lv].r)u=f(x,y,mid+1,r,seg[lv].r); if(u==ans)return u; } if(seg[lv].l)v=f(x,y,l,mid,seg[lv].l); return max2(u,v); } void update2(int y,int l,int r,int lv,int k){ seg2[lv].d=max2(seg2[lv].d,k); int mid=(l+r)/2; if(l==r)return; if(y>mid){ if(!seg2[lv].r)seg2[lv].r=++num2; update2(y,mid+1,r,seg2[lv].r,k); } else{ if(!seg2[lv].l)seg2[lv].l=++num2; update2(y,l,mid,seg2[lv].l,k); } } void update(int x,int y,int l,int r,int lv,int k){ int mid=(l+r)/2; if(l!=r){ if(x>mid){ if(!seg[lv].r)seg[lv].r=++num; update(x,y,mid+1,r,seg[lv].r,k); } else{ if(!seg[lv].l)seg[lv].l=++num; update(x,y,l,mid,seg[lv].l,k); } } if(!seg[lv].w)seg[lv].w=++num2; update2(y,1,n,seg[lv].w,k); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>m>>n; int i; for(i=1 ; i<=n ; i++)cin>>a[i].f; for(i=1 ; i<=n ; i++)cin>>a[i].s.f; for(i=1 ; i<=n ; i++)cin>>a[i].s.s; sort(a+1,a+n+1); for(i=1 ; i<=n ; i++){ S1.insert(a[i].s.f); S2.insert(a[i].s.s); } int cnt=0; for(auto &i:S1)xx[i]=++cnt; cnt=0; for(auto &i:S2)yy[i]=++cnt; int tx,ty,k; ++num; for(i=1 ; i<=n ; i++){ tx=xx[a[i].s.f]; ty=yy[a[i].s.s]; k=f(tx,ty,1,n,1)+1; update(tx,ty,1,n,1,k); ans=max2(ans,k); if(ans==n)break; } cout<<ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...