Submission #856478

#TimeUsernameProblemLanguageResultExecution timeMemory
856478ArminAzimitrapezoid (balkan11_trapezoid)C++14
40 / 100
128 ms11964 KiB
#include<bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #define ordered_set tree<pair <int, int>, null_type,less<pair <int, int>>, rb_tree_tag,tree_order_statistics_node_update> const int MAXN = 2e5 + 10, MAXM = 1e2 + 10, MOD = 998244353, MOD1 = 1e9 + 9, SQ = 350; const long long INF = 1e9 + 11; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int a[MAXN], b[MAXN], c[MAXN], d[MAXN]; int id_a[MAXN], id_b[MAXN]; int seg[4 * MAXN]; int dp[MAXN]; void upd(int l, int r, int id, int ind, int val) { if (l == r) { seg[id] = val; return; } int mid = (l + r) / 2; if (ind <= mid) upd(l, mid, 2 * id, ind, val); else upd(mid + 1, r, 2 * id + 1, ind, val); seg[id] = max(seg[2 * id], seg[2 * id + 1]); } int get(int l, int r, int id, int l1, int r1) { if (r < l1 || r1 < l) return 0; if (l1 <= l && r <= r1) return seg[id]; int mid = (l + r) / 2; return max(get(l, mid, 2 * id, l1, r1), get(mid + 1, r, 2 * id + 1, l1, r1)); } void solve() { int n; cin >> n; vector <int> kol1, kol2; for (int i = 1; i <= n; i++) { cin >> a[i] >> b[i] >> c[i] >> d[i]; kol1.push_back(a[i]); kol1.push_back(b[i]); kol2.push_back(c[i]); kol2.push_back(d[i]); } sort(kol1.begin(), kol1.end()); kol1.resize(unique(kol1.begin(), kol1.end()) - kol1.begin()); sort(kol2.begin(), kol2.end()); kol2.resize(unique(kol2.begin(), kol2.end()) - kol2.begin()); for (int i = 1; i <= n; i++) { a[i] = lower_bound(kol1.begin(), kol1.end(), a[i]) - kol1.begin(); b[i] = lower_bound(kol1.begin(), kol1.end(), b[i]) - kol1.begin(); c[i] = lower_bound(kol2.begin(), kol2.end(), c[i]) - kol2.begin(); d[i] = lower_bound(kol2.begin(), kol2.end(), d[i]) - kol2.begin(); id_a[a[i]] = i; id_b[b[i]] = i; } for (int i = 0; i < 2 * n; i++) { if (id_a[i]) { int ind = id_a[i]; int l1 = c[ind]; dp[i] = get(0, 2 * n, 1, 0, l1) + 1; } else { int ind = id_b[i]; int index = d[ind]; upd(0, 2 * n, 1, index, dp[a[ind]]); } } int ans = 0; for (int i = 0; i < 2 * n; i++) ans = max(ans, dp[i]); cout << ans << " 0" << "\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q = 1; // cin >> q; while (q--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...