Submission #1221185

#TimeUsernameProblemLanguageResultExecution timeMemory
1221185takoshanavatrapezoid (balkan11_trapezoid)C++20
100 / 100
335 ms58288 KiB
#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define fs first
#define sc second
using namespace std;

const int N = 1e5 + 5, MOD = 30013;

int n, T;
int a[N], b[N], c[N], d[N];
pair<int, int> dp[N], bs = {0, 0}, v[16 * N];
vector<int> U[4 * N], G[4 * N];

void compress() {
    vector<int> s;
    map<int, int> f;
    for (int i = 1; i <= n; i++) {
        s.pb(a[i]); s.pb(b[i]); s.pb(c[i]); s.pb(d[i]);
    }
    sort(s.begin(), s.end());
    s.erase(unique(s.begin(), s.end()), s.end());
    T = s.size();
    for (int i = 0; i < T; i++) f[s[i]] = i + 1;
    for (int i = 1; i <= n; i++) {
        a[i] = f[a[i]];
        b[i] = f[b[i]];
        c[i] = f[c[i]];
        d[i] = f[d[i]];
    }
}

pair<int, int> comb(pair<int, int> A, pair<int, int> B) {
    pair<int, int> res;
    res.fs = max(A.fs, B.fs);
    res.sc = 0;
    if (res.fs == A.fs) res.sc = (res.sc + A.sc) % MOD;
    if (res.fs == B.fs) res.sc = (res.sc + B.sc) % MOD;
    return res;
}

void upd(int h, int l, int r, int id, pair<int, int> val) {
    if (id < l || r < id) return;
    if (l == r) {
        if (v[h].fs == val.fs) v[h].sc = (v[h].sc + val.sc) % MOD;
        else v[h] = val;
        return;
    }
    int m = (l + r) / 2;
    upd(h * 2, l, m, id, val);
    upd(h * 2 + 1, m + 1, r, id, val);
    v[h] = comb(v[h * 2], v[h * 2 + 1]);
}

pair<int, int> get(int h, int l, int r, int L, int R) {
    if (r < L or R < l) return bs;
    if (L <= l and r <= R) return v[h];
    int m = (l + r) / 2;
    return comb(get(h * 2, l, m, L, R), get(h * 2 + 1, m + 1, r, L, R));
}

signed main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i] >> d[i];

    compress();

    for (int i = 1; i <= n; i++) {
        U[b[i]].pb(i);
        G[a[i]].pb(i);
    }

    for (int i = 1; i <= T; i++) {
        for (int j = 0; j < G[i].size(); ++j) {
            int id = G[i][j];
            pair<int, int> res = get(1, 1, T, 1, c[id] - 1);
            if (!res.sc) res.sc = 1;
            res.fs++;
            dp[id] = res;
        }
        for (int j = 0; j < U[i].size(); ++j) {
            int id = U[i][j];
            upd(1, 1, T, d[id], dp[id]);
        }
    }

    cout << v[1].fs << " " << v[1].sc << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...