Submission #314297

#TimeUsernameProblemLanguageResultExecution timeMemory
314297dolphingarlictrapezoid (balkan11_trapezoid)C++14
0 / 100
130 ms12664 KiB
#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, 0)) - s.begin();
            if (!lis) l_len[events[i].second] = l_num[events[i].second] = 1;
            else l_len[events[i].second] = lis, l_num[events[i].second] = s[lis - 1].second;
            if (lis > b_len) {
                b_len = lis;
                b_num = 0;
            }
            if (lis == b_len) b_num = (b_num + s[lis - 1].second) % MOD;
        } else {
            if (l_len[-events[i].second] == s.size()) s.push_back({traps[-events[i].second].y2, l_num[-events[i].second]});
            else {
                int len = l_len[-events[i].second];
                s[len] = {min(traps[-events[i].second].y2, s[len].first), (s[len].second + l_num[-events[i].second]) % MOD};
            }
        }
    }

    cout << b_len << ' ' << b_num;
    return 0;
}

Compilation message (stderr)

trapezoid.cpp: In function 'int main()':
trapezoid.cpp:53:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |             if (l_len[-events[i].second] == s.size()) s.push_back({traps[-events[i].second].y2, l_num[-events[i].second]});
      |                 ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...