제출 #1321242

#제출 시각아이디문제언어결과실행 시간메모리
1321242thnhann사다리꼴 (balkan11_trapezoid)C++20
100 / 100
156 ms26860 KiB
//#pragma GCC optimize("Ofast,unroll-loops") //#pragma GCC target("avx,avx2,fma,lzcnt,popcnt") #include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define ii pair<int,int> #define ill pair<ll,ll> #define el cout<<'\n' #define int long long const ll mod=30013; const int dx[]={1,0,-1,0},dy[]={0,1,0,-1}; const int nmax=5e5; const int inf =2e9; void add(int &a, int b) { a += b; if (a >= mod) a -= mod; if (a < 0) a += mod; } template<typename T> void chkmin(T& x, T y) {if(x > y) x = y;} template<typename T> void chkmax(T& x, T y) {if(x < y) x = y;} using namespace std; mt19937 rd(chrono::steady_clock::now().time_since_epoch().count()); int rand(int l, int r) { return uniform_int_distribution<int>(l, r) (rd); } int n; struct polygon{ int a,b,c,d; } polygons[nmax + 5]; int dp[nmax + 5]; int way[nmax + 5]; vector<ii>bucket[nmax + 5]; ii t[nmax * 4 + 5]; ii combine(ii x,ii y) { int val = max(x.fi,y.fi); int cnt = 0; if(val == x.fi) cnt+=x.se; if(val == y.fi) cnt+=y.se; cnt%=mod;cnt+=mod;cnt%=mod; return (make_pair(val,cnt)); } void update(int id,int l,int r,int pos,ii val) { if(l > pos || r < pos) return; if(l == r) { if(t[id].fi < val.fi) { t[id].fi = val.fi; t[id].se = val.se; } else { if(t[id].fi == val.fi) t[id].se = (t[id].se + val.se)%mod; } return; } int mid = (l + r) >> 1; update(id << 1,l,mid,pos,val); update(id << 1 | 1,mid + 1,r,pos,val); t[id] = combine(t[id << 1],t[id << 1 | 1]); } ii get(int id,int l,int r,int u,int v) { if(l > v || r < u) { return (make_pair(0,0)); } if(u <= l && r <= v) { return t[id]; } int mid = (l + r) >> 1; return combine(get(id << 1,l,mid,u,v),get(id << 1 | 1,mid + 1,r,u,v)); } vector<int>up; vector<int>down; void mapping() { for(int i=1;i<=n;i++) { up.push_back(polygons[i].a); up.push_back(polygons[i].b); } sort(up.begin(),up.end()); up.erase(unique(up.begin(),up.end()),up.end()); for(int i=1;i<=n;i++) { polygons[i].a = lower_bound(up.begin(),up.end(),polygons[i].a) - up.begin() + 1; polygons[i].b = lower_bound(up.begin(),up.end(),polygons[i].b) - up.begin() + 1; } for(int i=1;i<=n;i++) { down.push_back(polygons[i].c); down.push_back(polygons[i].d); } sort(down.begin(),down.end()); down.erase(unique(down.begin(),down.end()),down.end()); for(int i=1;i<=n;i++) { polygons[i].c = lower_bound(down.begin(),down.end(),polygons[i].c) - down.begin() + 1; polygons[i].d = lower_bound(down.begin(),down.end(),polygons[i].d) - down.begin() + 1; } } signed main() { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin >> n; for(int i=1;i<=n;i++) { cin >> polygons[i].a >> polygons[i].b >> polygons[i].c >> polygons[i].d; } mapping(); for(int i=1;i<=n;i++) { bucket[polygons[i].a].push_back({1LL,i}); bucket[polygons[i].b].push_back({2LL,i}); } int X = up.size(); int Y = down.size(); for(int i=1;i<=X;i++) sort(bucket[i].begin(),bucket[i].end()); for(int i=1;i<=X;i++) { for(auto poly:bucket[i]) { int type = poly.fi; int id = poly.se; if(type == 1) { ii tmp = get(1,1,Y,1,polygons[id].c - 1); dp[id] = tmp.fi + 1; way[id] = tmp.se; if(dp[id] == 1) way[id] = 1; } else { update(1,1,Y,polygons[id].d,make_pair(dp[id],way[id])); } } } ii ans = {0,0}; for(int i=1;i<=n;i++) ans = combine(ans,make_pair(dp[i],way[i])); cout << ans.fi << " " << ans.se; } // "Can i get a kiss? And can u make it last forever?"
#Verdict Execution timeMemoryGrader output
Fetching results...