Submission #1109664

#TimeUsernameProblemLanguageResultExecution timeMemory
1109664faricatrapezoid (balkan11_trapezoid)C++14
73 / 100
177 ms31220 KiB
#include <bits/stdc++.h> #define long long int using namespace std; const int MOD = 30013; struct Node { int ans,ways; }; vector<Node>segm; Node comb(Node x, Node y) { Node fin; if(x.ans == y.ans) { fin.ans = x.ans; fin.ways = (x.ways + y.ways) % MOD; return fin; } else if(x.ans > y.ans) return x; else return y; } void update(int pos, int l, int r, int x, Node val) { if(l==r) { segm[pos] = comb(segm[pos], val); return; } int m = (l+r)/2; if(x <= m) update(2*pos+1, l, m, x, val); else update(2*pos+2, m+1, r, x, val); segm[pos] = comb(segm[2*pos+1], segm[2*pos+2]); } Node query(int pos, int l, int r, int L) { if(l >= L) return segm[pos]; int m = (l+r)/2; if(m >= L) return comb(query(2*pos+1, l, m, L), segm[2*pos+2]); else return query(2*pos+2, m+1, r, L); } void solve() { int n; cin >> n; Node tmp; tmp.ans = tmp.ways = 0; segm.assign(8*n, tmp); tmp.ans = tmp.ways = 1; map<int,vector<int>>upd, que; vector<array<int,4>>V(n); vector<int>c(n); vector<Node>ans(n, tmp); for(int i=0; i<n; ++i) { cin >> V[i][1] >> V[i][2] >> V[i][0] >> V[i][3]; c[i] = V[i][0]; } sort(V.begin(), V.end()); sort(c.begin(), c.end()); for(int i=0; i<n; ++i) { que[V[i][2]].push_back(i); upd[V[i][1]].push_back(i); } auto it = upd.end(), it2 = que.end(); --it, --it2; bool finish = 0; while(true) { while(!finish && it->first <= it2->first) { for(int x: it2->second) { int lb = upper_bound(c.begin(), c.end(), V[x][3]) - c.begin(); if(lb != n) { ans[x] = query(1, 0, n-1, lb); ++ans[x].ans; } } if(it2 == que.begin()) { finish = 1; break; } --it2; } for(int x: it->second) { update(1, 0, n-1, x, ans[x]); } if(it == upd.begin()) break; --it; } while(!finish) { for(int x: it2->second) { int lb = upper_bound(c.begin(), c.end(), V[x][3]) - c.begin(); if(lb != n) { ans[x] = query(1, 0, n-1, lb); ++ans[x].ans; } } if(it2 == que.begin()) break; --it2; } tmp.ans = tmp.ways = 0; Node fin = tmp; for(int i=0; i<n; ++i) { if(ans[i].ans == fin.ans) { fin.ways = (fin.ways + ans[i].ways) % MOD; } else if(ans[i].ans > fin.ans) fin = ans[i]; } cout << fin.ans << " " << fin.ways << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(NULL); int t = 1; while(t--) solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...