# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1222749 | mariamtsagareli | trapezoid (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 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 BITSeg{
i n; vector<Seg> t;
BITSeg(i m):n(m),t(m+1,Seg(0,1)){}
void update(i pos,const Seg &v){for(;pos<=n;pos+=pos&-pos) t[pos]=mergeSeg(t[pos],v);}
Seg query(i pos){ Seg res(0,1); for(;pos>0;pos-=pos&-pos) res=mergeSeg(res,t[pos]); return res;}
};
int main(){ios::sync_with_stdio(false);cin.tie(NULL);
i N; if(!(cin>>N))return 0;
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.push_back(A[i].a);C.push_back(A[i].b);C.push_back(A[i].c);C.push_back(A[i].d);}
sort(C.begin(),C.end());C.erase(unique(C.begin(),C.end()),C.end());
auto id=[&](i v){return (i)(lower_bound(C.begin(),C.end(),v)-C.begin()+1);} ;
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;});
vector<i>orderB(N);
i idxB=0;
i M=C.size();
i cnt=0;
for(i i=0;i<N;i++)orderB[i]=i;
sort(orderB.begin(),orderB.end(),[&](i x,i y){return A[x].b<A[y].b;});
BITSeg bit(M);
vector<Seg>dp(N);
for(i i=0;i<N;i++){
while(idxB<N && A[orderB[idxB]].b < A[i].a){i j=orderB[idxB++]; bit.update(A[j].d, dp[j]);}
Seg best=bit.query(A[i].c-1);
dp[i]=Seg(best.mx+1,best.cnt);
}
i K=0; for(auto &s:dp) K=max(K,s.mx);
i total=0; for(auto &s:dp) if(s.mx==K) total=(total+s.cnt)%MOD;
cout<<K<<" "<<total;
}