# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
314300 | dolphingarlic | trapezoid (balkan11_trapezoid) | C++14 | 126 ms | 5752 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int MOD = 30013;
struct Trapezoid {
int x1, x2, y1, y2;
} traps[100001];
int n, top[200001], bottom[200001];
int l_len[200001], l_num[200001];
pair<int, int> events[200001];
vector<pair<int, int>> s;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> traps[i].x1 >> traps[i].x2 >> traps[i].y1 >> traps[i].y2;
top[2 * i - 1] = traps[i].x1, top[2 * i] = traps[i].x2;
bottom[2 * i - 1] = traps[i].y1, bottom[2 * i] = traps[i].y2;
}
sort(top + 1, top + 2 * n + 1);
sort(bottom + 1, bottom + 2 * n + 1);
for (int i = 1; i <= n; i++) {
traps[i].x1 = lower_bound(top + 1, top + 2 * n + 1, traps[i].x1) - top;
traps[i].x2 = lower_bound(top + 1, top + 2 * n + 1, traps[i].x2) - top;
traps[i].y1 = lower_bound(bottom + 1, bottom + 2 * n + 1, traps[i].y1) - bottom;
traps[i].y2 = lower_bound(bottom + 1, bottom + 2 * n + 1, traps[i].y2) - bottom;
}
for (int i = 1; i <= n; i++) {
events[2 * i - 1] = {traps[i].x1, i};
events[2 * i] = {traps[i].x2, -i};
}
sort(events + 1, events + 2 * n + 1);
int b_len = 0, b_num = 0;
for (int i = 1; i <= 2 * n; i++) {
if (events[i].second > 0) {
int lis = lower_bound(s.begin(), s.end(), make_pair(traps[events[i].second].y1, INT_MIN)) - s.begin();
if (!lis) {
l_len[events[i].second] = l_num[events[i].second] = 1;
if (1 > b_len) {
b_len = 1;
b_num = 0;
}
if (1 == b_len) b_num = (b_num + 1) % MOD;
} else {
l_len[events[i].second] = lis + 1, l_num[events[i].second] = s[lis - 1].second;
if (lis + 1 > b_len) {
b_len = lis + 1;
b_num = 0;
}
if (lis + 1 == b_len) b_num = (b_num + s[lis - 1].second) % MOD;
}
} else {
int len = l_len[-events[i].second] - 1;
if (len == s.size()) s.push_back({traps[-events[i].second].y2, l_num[-events[i].second]});
else s[len] = {min(s[len].first, traps[-events[i].second].y2), (s[len].second + l_num[-events[i].second]) % MOD};
}
}
cout << b_len << ' ' << b_num;
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |