Submission #526848

#TimeUsernameProblemLanguageResultExecution timeMemory
526848BackNoobtrapezoid (balkan11_trapezoid)C++14
43 / 100
118 ms10188 KiB
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define endl '\n' #define MASK(i) (1LL << (i)) #define ull unsigned long long #define ld long double #define pb push_back #define all(x) (x).begin() , (x).end() #define BIT(x , i) ((x >> (i)) & 1) #define TASK "task" #define sz(s) (int) (s).size() using namespace std; const int mxN = 2e5 + 227; const int inf = 1e9 + 277; const int mod = 30013; const ll infll = 1e18 + 7; const int base = 307; const int LOG = 20; template <typename T1, typename T2> bool minimize(T1 &a, T2 b) { if (a > b) {a = b; return true;} return false; } template <typename T1, typename T2> bool maximize(T1 &a, T2 b) { if (a < b) {a = b; return true;} return false; } mt19937_64 rd(chrono::steady_clock::now().time_since_epoch().count()); ll Rand(ll l , ll r) { return l + rd() * 1LL * rd() % (r - l + 1); } struct item { int x, y, u, v; } a[mxN]; struct SEG { int l, r, ok , idx; bool operator<(const SEG &a) const { return l < a.l; } }; int n; int f[mxN]; int g[mxN]; void add(int &a , int b) { a += b; if(a >= mod) a -= mod; } int bitmax[mxN * 4]; void updatemax(int pos, int val) { for(; pos <= n * 4 ; pos += pos & -pos) maximize(bitmax[pos] , val); } int getmax(int pos) { int res = 0; for(; pos > 0 ; pos -= pos & -pos) maximize(res , bitmax[pos]); return res; } vector<int> cp; bool vis[mxN]; void solve() { // n = Rand(2 , 3); cin >> n; for(int i = 1 ; i <= n ; i++) { cin >> a[i].x >> a[i].u >> a[i].y >> a[i].v; // a[i].x = Rand(1 , 10); // a[i].y = Rand(1 , 10); // a[i].u = Rand(a[i].x , 20); // a[i].v = Rand(a[i].y , 20); cp.pb(a[i].x); cp.pb(a[i].y); cp.pb(a[i].u); cp.pb(a[i].v); } //cout << n << endl; //for(int i = 1 ; i <= n ; i++) // cout << a[i].x << ' ' << a[i].u << ' ' << a[i].y << ' ' << a[i].v << endl; sort(all(cp)); cp.erase(unique(all(cp)) , cp.end()); for(int i = 1 ; i <= n ; i++) { a[i].x = lower_bound(all(cp) , a[i].x) - cp.begin() + 1; a[i].y = lower_bound(all(cp) , a[i].y) - cp.begin() + 1; a[i].u = lower_bound(all(cp) , a[i].u) - cp.begin() + 1; a[i].v = lower_bound(all(cp) , a[i].v) - cp.begin() + 1; } vector<SEG> val; for(int i = 1 ; i <= n ; i++) { int x = a[i].x; int y = a[i].y; int u = a[i].u; int v = a[i].v; val.pb({x , y , 1 , i}); //cout << val.back().idx << endl; val.pb({u , v , 0 , i}); //cout << val.back().idx << endl; } sort(all(val)); // for(int i = 0 ; i < sz(val) ; i++) { // auto it = val[i]; // if(it.ok == 0) { // if(vis[it.idx] == false) { // cout << it.l << ' ' << it.r << ' ' << it.ok << ' ' << it.idx << endl; // cout << a[it.idx].x << ' ' << a[it.idx].y << ' ' << a[it.idx].u << ' ' << a[it.idx].v << endl; // cout << "f"; // exit(0); // } // } // else { // vis[it.idx] = true; // } // } for(auto it : val) { int i = it.idx; if(it.ok == 0) { //cout << it.r << ' ' << f[i] << ' ' << g[i] << endl; updatemax(it.r , f[i]); } else { f[i] = max(1 , getmax(it.r - 1) + 1); if(f[i] == 1) add(g[f[i]] , 1); else add(g[f[i]] , g[f[i] - 1]); } } int res = getmax(4 * n); int ans = g[res]; cout << res << ' ' << ans << endl; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); //freopen(TASK".inp" , "r" , stdin); //freopen(TASK".out" , "w" , stdout); int tc = 1; //cin >> tc; while(tc--) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...