#include <bits/stdc++.h>
using namespace std;
static const int MOD = 30013;
struct Trap { long long a,b,c,d; };
struct Node {
int val, cnt;
};
Node merge(Node x, Node y) {
if (x.val > y.val) return x;
if (y.val > x.val) return y;
return {x.val, (x.cnt + y.cnt) % MOD};
}
vector<Node> st;
int SZ;
void update(int p, Node v) {
for (st[p += SZ] = merge(st[p], v); p > 1; p >>= 1)
st[p>>1] = merge(st[p], st[p^1]);
}
Node query(int l, int r) {
Node res = {0,0};
for (l += SZ, r += SZ; l <= r; l >>= 1, r >>= 1) {
if (l & 1) res = merge(res, st[l++]);
if (!(r & 1)) res = merge(res, st[r--]);
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<Trap> t(n);
vector<long long> up, down;
for (auto &x : t) {
cin >> x.a >> x.b >> x.c >> x.d;
up.push_back(x.a); up.push_back(x.b);
down.push_back(x.c); down.push_back(x.d);
}
sort(up.begin(), up.end());
up.erase(unique(up.begin(), up.end()), up.end());
sort(down.begin(), down.end());
down.erase(unique(down.begin(), down.end()), down.end());
for (auto &x : t) {
x.a = lower_bound(up.begin(), up.end(), x.a) - up.begin();
x.b = lower_bound(up.begin(), up.end(), x.b) - up.begin();
x.c = lower_bound(down.begin(), down.end(), x.c) - down.begin();
x.d = lower_bound(down.begin(), down.end(), x.d) - down.begin();
}
int X = up.size(), Y = down.size();
vector<vector<pair<int,int>>> ev(X);
for (int i = 0; i < n; i++) {
ev[t[i].a].push_back({0, i}); // start
ev[t[i].b].push_back({1, i}); // end
}
for (auto &v : ev) sort(v.begin(), v.end());
SZ = 1;
while (SZ < Y) SZ <<= 1;
st.assign(2 * SZ, {0,0});
vector<int> dp(n), ways(n);
for (int i = 0; i < X; i++) {
for (auto [type, id] : ev[i]) {
if (type == 0) {
Node best = (t[id].c > 0) ? query(0, t[id].c - 1) : Node{0,0};
dp[id] = best.val + 1;
ways[id] = best.cnt ? best.cnt : 1;
} else {
update(t[id].d, {dp[id], ways[id]});
}
}
}
Node ans = {0,0};
for (int i = 0; i < n; i++)
ans = merge(ans, {dp[i], ways[i]});
cout << ans.val << " " << ans.cnt << "\n";
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |