Submission #931193

#TimeUsernameProblemLanguageResultExecution timeMemory
93119312345678trapezoid (balkan11_trapezoid)C++17
2 / 100
90 ms31736 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=2e5+5, mod=30013;

int n, a[nx], b[nx], c[nx], d[nx], t, p;
vector<pair<int, int>> A, B;
map<int, int> mp;

struct value
{
    int mx, f;
    value(): mx(0), f(0) {}
    value(int mx, int f): mx(mx), f(f) {}
    friend value operator+(const value &lhs, const value &rhs) {
        if (lhs.mx>rhs.mx) return lhs;
        if (lhs.mx<rhs.mx) return rhs;
        return value(lhs.mx, (lhs.f+rhs.f)%mod);
    }
} dp[nx];

struct fenwick 
{
    value d[nx];
    void add(int i, value x) 
    {
        i++;
        while (i<nx) d[i]=(d[i]+x), i+=(i&-i);
    }
    value query(int i)
    {
        i++;
        value res=value(0, 0);
        while (i>0) res=(res+d[i]), i-=(i&-i);
        return res; 
    }
} f;

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n;
    for (int i=0; i<n; i++) cin>>a[i]>>b[i]>>c[i]>>d[i], A.push_back({a[i], i}), B.push_back({b[i], i}), mp[c[i]]=0, mp[d[i]]=0;
    sort(A.begin(), A.end());
    sort(B.begin(), B.end());
    for (auto &[x, y]:mp) y=++t;
    for (int i=0; i<n; i++)
    {
        while (B[p].first<A[i].first) f.add(d[B[p].second], dp[p]), p++;
        dp[i]=f.query(c[A[i].second]-1);
        dp[i].mx++;
        if (dp[i].f==0) dp[i].f=1;
    }
    cout<<dp[n-1].mx<<' '<<dp[n-1].f;
}
#Verdict Execution timeMemoryGrader output
Fetching results...