# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1222747 | mariamtsagareli | 사다리꼴 (balkan11_trapezoid) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
using i = int;
const i MOD = 30013;
struct Trap { i a,b,c,d; };
struct Node { i mx,cnt; };
struct Seg {
i mx,cnt;
Seg(i m=0,i c=0):mx(m),cnt(c){}
};
Seg mergeSeg(const Seg &x,const Seg &y){
if(x.mx>y.mx) return x;
if(y.mx>x.mx) return y;
if(x.mx==0) return Seg(0,1);
return Seg(x.mx,(x.cnt+y.cnt)%MOD);
}
struct ST{ i n; vector<Seg> t;
ST(i m):n(m),t(4*m+4,Seg(0,1)){}
Seg q(i p,i l,i r,i ql,i qr){
if(r<ql||l>qr) return Seg(0,1);
if(ql<=l&&r<=qr) return t[p];
i m=(l+r)>>1;
return mergeSeg(q(p<<1,l,m,ql,qr),q(p<<1|1,m+1,r,ql,qr));
}
Seg q(i l,i r){ return l>r?Seg(0,1):q(1,1,n,l,r); }
void u(i p,i l,i r,i pos,Seg v){
if(l==r){ t[p]=mergeSeg(t[p],v); return; }
i m=(l+r)>>1;
if(pos<=m) u(p<<1,l,m,pos,v); else u(p<<1|1,m+1,r,pos,v);
t[p]=mergeSeg(t[p<<1],t[p<<1|1]);
}
void u(i pos,Seg v){ u(1,1,n,pos,v); }
};
struct BIT{ i n; vector<i> f;
BIT(i m):n(m),f(m+1,0){}
void add(i i,i v){ for(;i<=n;i+=i&-i) f[i]=(f[i]+v)%MOD; }
i sum(i i){ i s=0; for(;i>0;i-=i&-i) s=(s+f[i])%MOD; return s; }
};
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
i N; cin>>N;
vector<Trap> A(N);
vector<i> C; C.reserve(4*N);
for(i i=0;i<N;i++){ cin>>A[i].a>>A[i].b>>A[i].c>>A[i].d; C.insert(C.end(),{A[i].a,A[i].b,A[i].c,A[i].d}); }
sort(C.begin(),C.end()); C.erase(unique(C.begin(),C.end()),C.end());
auto id=[&](i v){ return int(lower_bound(C.begin(),C.end(),v)-C.begin()+1); };
i M=C.size();
for(auto &t:A){ t.a=id(t.a); t.b=id(t.b); t.c=id(t.c); t.d=id(t.d); }
sort(A.begin(),A.end(),[](auto &x,auto &y){ return x.a!=y.a?x.a<y.a:x.b<y.b; });
ST st1(M),st2(M);
vector<Node> dp(N);
for(i i=0;i<N;i++){
auto s1=st1.q(1,A[i].a-1);
auto s2=st2.q(1,A[i].c-1);
auto s=mergeSeg(s1,s2);
dp[i].mx=s.mx+1; dp[i].cnt=s.cnt;
st1.u(A[i].b,Seg(dp[i].mx,dp[i].cnt));
st2.u(A[i].d,Seg(dp[i].mx,dp[i].cnt));
}
i K=0; for(auto &x:dp) K=max(K,x.mx);
vector<vector<i>> by(K+1);
for(i i=0;i<N;i++) by[dp[i].mx].push_back(i);
vector<i> cnt2(N);
for(i k=1;k<K;k++){
BIT bit(M);
for(i idx:by[k]) bit.add(A[idx].d,dp[idx].cnt);
for(i idx:by[k+1]) cnt2[idx]=bit.sum(A[idx].c-1);
for(i idx:by[k+1]) dp[idx].cnt=cnt2[idx];
}
i total=0;
for(i idx:by[K]) total=(total+dp[idx].cnt)%MOD;
cout<<K<<" "<<total;
return 0;
}