Submission #136175

# Submission time Handle Problem Language Result Execution time Memory
136175 2019-07-24T21:35:58 Z jovan_b trapezoid (balkan11_trapezoid) C++17
90 / 100
500 ms 28744 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;

const int MOD = 30013;

int a[100005], b[100005], c[100005], d[100005];
map <int, int> u;

pair <int, int> niz[200005];

int dp[100005];
int brn[100005];

struct drvo{
    int val;
    int br;
} seg[1000000];

void upd(int node, int l, int r, int x, int val){
    if(l > x || r < x) return;
    if(l == r){
        seg[node].val = dp[val];
        seg[node].br = brn[val];
        return;
    }
    int mid = (l+r)/2;
    upd(node*2, l, mid, x, val);
    upd(node*2+1, mid+1, r, x, val);
    seg[node].val = max(seg[node*2].val, seg[node*2+1].val);
    seg[node].br = 0;
    if(seg[node].val == seg[node*2].val){
        seg[node].br += seg[node*2].br;
    }
    if(seg[node].val == seg[node*2+1].val){
        seg[node].br += seg[node*2+1].br;
    }
    seg[node].br %= MOD;
}

pair <int, int> query(int node, int l, int r, int tl, int tr){
    if(l > tr || tl > r) return {0, 1};
    if(tl <= l && r <= tr){
        return {seg[node].val, seg[node].br};
    }
    int mid = (l+r)/2;
    pair <int, int> a1  = query(node*2, l, mid, tl, tr);
    pair <int, int> b1 = query(node*2+1, mid+1, r, tl, tr);

    int mn = max(a1.first, b1.first);
    int s = 0;
    if(a1.first == mn) s += a1.second;
    if(b1.first == mn) s += b1.second;
    s %= MOD;
    return {mn, s};
}

int main(){
    ios_base::sync_with_stdio(false);
	cout.precision(10);
	cout << fixed;

    int n;
    cin >> n;
    vector <int> vec;
    for(int i=1; i<=n; i++){
        cin >> a[i] >> b[i] >> c[i] >> d[i];
        vec.push_back(a[i]);
        vec.push_back(b[i]);
        vec.push_back(c[i]);
        vec.push_back(d[i]);
    }
    sort(vec.begin(), vec.end());
    int cnt = 0;
    for(auto c : vec){
        if(!u[c]) u[c] = ++cnt;
    }
    for(int i=1; i<=n; i++){
        a[i] = u[a[i]];
        b[i] = u[b[i]];
        c[i] = u[c[i]];
        d[i] = u[d[i]];
        niz[i] = {c[i] , i};
        niz[i+n] = {d[i], i+n};
    }
    sort(niz+1, niz+1+2*n);
    for(int i=1; i<=2*n; i++){
        if(niz[i].second > n){
            //cout << b << " " << niz[i].second - n << endl;
            upd(1, 1, cnt+5, b[niz[i].second - n], niz[i].second - n);
        }
        else{
            int k = niz[i].second;
            //cout << a[k] << " " << k << endl;
            pair <int, int> rs = query(1, 1, cnt+5, 1, a[k]);
            dp[k] = rs.first + 1;
            brn[k] = rs.second;
            if(dp[k] == 1) brn[k] = 1;
        }
    }
    int res = 0;
    int mx = 1;
    for(int i=1; i<=n; i++){
        mx = max(mx, dp[i]);
    }
    for(int i=1; i<=n; i++){
        //cout << dp[i] << " ";
        if(dp[i] == mx){
            res += brn[i];
            if(res > MOD) res -= MOD;
        }
    }
    cout << mx << " " << res;
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 3 ms 504 KB Output is correct
4 Correct 4 ms 632 KB Output is correct
5 Correct 7 ms 1016 KB Output is correct
6 Correct 10 ms 1272 KB Output is correct
7 Correct 10 ms 1144 KB Output is correct
8 Correct 17 ms 1528 KB Output is correct
9 Correct 37 ms 3576 KB Output is correct
10 Correct 58 ms 4340 KB Output is correct
11 Correct 100 ms 8052 KB Output is correct
12 Correct 245 ms 16044 KB Output is correct
13 Correct 293 ms 16916 KB Output is correct
14 Correct 362 ms 22980 KB Output is correct
15 Correct 401 ms 19724 KB Output is correct
16 Correct 423 ms 20584 KB Output is correct
17 Incorrect 465 ms 27120 KB Output isn't correct
18 Correct 321 ms 17768 KB Output is correct
19 Correct 468 ms 26544 KB Output is correct
20 Execution timed out 527 ms 28744 KB Time limit exceeded