Submission #534914

# Submission time Handle Problem Language Result Execution time Memory
534914 2022-03-09T06:48:01 Z Evang trapezoid (balkan11_trapezoid) C++17
30 / 100
176 ms 16636 KB
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;

#ifdef _DEBUG
#define dout(x) clog << "Line " << __LINE__ << ": " << #x << "=" << (x) << el
#else
#define dout(x)
#endif

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define uid(a,b) uniform_int_distribution<int>(a,b)(rng)

#define ins insert
#define ssize(x) (int((x).size()))
#define bs(args...) binary_search(args)
#define lb(args...) lower_bound(args)
#define ub(args...) upper_bound(args)
#define all(x) (x).begin(),(x).end()
#define mp(a, b) make_pair(a, b)
#define mt(args...) make_tuple(args)
#define pb push_back
#define eb emplace_back
#define ff first
#define ss second
#define die exit(0)

template<typename T>
using vc = vector<T>;
template<typename T>
using uset = unordered_set<T>;
template<typename A, typename B>
using umap = unordered_map<A, B>;
template<typename T, typename Comp>
using pq = std::priority_queue<T, vc<T>, Comp>;
template<typename T>
using maxpq = pq<T, less<T>>;
template<typename T>
using minpq = pq<T, greater<T>>;
template<typename T>
using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

using db = double;
using ld = long double;
using ll = long long;
using ull = unsigned long long;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vc<int>;
using vll = vc<ll>;
using vpi = vc<pi>;
using vpll = vc<pll>;
using str = string;

constexpr char el = '\n';
constexpr char sp = ' ';
constexpr int inf = 0x3f3f3f3f;
constexpr ll llinf = 0x3f3f3f3f3f3f3f3fLL;
// ---------------------------------------------------------------------


const int N = 1e5+5;
const int MM = 4e5+5;
const int mod = 30013;
int n, dp[N], dp2[N];
struct evan {
    int a, b, c, d;
} a[N];
struct node {
    int max = 0, cnt = 0;
} seg[MM];
vi qs[N];
map<pi, pi> mp;

void pull(int i){
    if(seg[2*i].max==seg[2*i+1].max){
        seg[i].max = seg[2*i].max;
        seg[i].cnt = (seg[2*i].cnt + seg[2*i+1].cnt)%mod;
    }else if(seg[2*i].max<seg[2*i+1].max)
        seg[i] = seg[2*i+1];
    else
        seg[i] = seg[2*i];
}

void upd(int i, int x, int y){
    // i is 0-indexed
    i += 2*n;
    if(x==seg[i].max)
        seg[i].cnt += y;
    else if(x>seg[i].max){
        seg[i].max = x;
        seg[i].cnt = y;
    }

    for(i /= 2; i > 0; i /= 2)
        pull(i);
}

pi qry(int r){
    // r is 0-indexed
    r += 2*n;
    int l = 2*n;
    int car = 0, cnt = 0;
    while(l<=r){
        if(l&1){
            if(seg[l].max>car){
                car = seg[l].max;
                cnt = seg[l].cnt;
            }else if(seg[l].max==car)
                cnt = (cnt+seg[l].cnt)%mod;
            ++l;
        }
        if(r&1^1){
            if(seg[r].max>car){
                car = seg[r].max;
                cnt = seg[r].cnt;
            }else if(seg[r].max==car)
                cnt = (cnt+seg[r].cnt)%mod;
            --r;
        }
        l /= 2; r /= 2;
    }
    return mp(car, cnt);
}

void unik(vi &v){
    sort(all(v));
    vi u{v[0]};
    for(int i = 1; i < ssize(v); ++i)
        if(v[i]^v[i-1])
            u.pb(v[i]);
    swap(u, v);
}

signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
    cout << fixed; clog << fixed; clog << unitbuf;
#ifdef _DEBUG
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    freopen("debug.txt", "w", stderr);
#else
    //freopen(".in", "r", stdin);
    //freopen(".out", "w", stdout);
#endif

    cin >> n;
    vi cct, ccb;
    for(int i = 1; i <= n; ++i){
        cin >> a[i].a >> a[i].b >> a[i].c >> a[i].d;
        cct.pb(a[i].a);
        cct.pb(a[i].b);
        ccb.pb(a[i].c);
        ccb.pb(a[i].d);
    }

    unik(cct);
    unik(ccb);
    for(int i = 1; i <= n; ++i){
        a[i].a = lb(all(cct), a[i].a)-cct.begin();
        a[i].b = lb(all(cct), a[i].b)-cct.begin();
        a[i].c = lb(all(ccb), a[i].c)-ccb.begin();
        a[i].d = lb(all(ccb), a[i].d)-ccb.begin();
    }
    sort(a+1, a+1+n, [](evan x, evan y){
        return x.b < y.b;
    });

#ifdef _DEBUG
    clog << "Line " << __LINE__ << ":\n";
    for(int i = 1; i <= n; ++i)
        clog << a[i].a << sp << a[i].b << sp << a[i].c << sp << a[i].d << el;
    clog << el;
#endif

    int p = 0;
    for(int i = 1; i <= n; ++i){
        while(a[p+1].b<a[i].a)
            ++p;

        qs[p].pb(a[i].c-1);
    }

    p = 0;
    for(int i = 1; i <= n; ++i){
        while(a[p+1].b<a[i].a)
            ++p;

        auto[car, cnt] = mp[mp(p, a[i].c-1)];
        if(dp[i-1]>car+1)
            dp[i] = dp2[i] = 1;
        else{
            dp[i] = car+1;
            dp2[i] = max(1, cnt);
        }

        upd(a[i].d, dp[i], dp2[i]);
        for(int j: qs[i])
            mp[mp(i, j)] = qry(j);
    }

    auto[car, cnt] = qry(2*n-1);
    cout << car << sp << cnt;

#ifdef _DEBUG
    clog << "Line " << __LINE__ << ":\n";
    for(int i = 0; i <= n; ++i)
        clog << dp[i] << sp << dp2[i] << el;
    clog << el;
#endif
}

Compilation message

trapezoid.cpp: In function 'pi qry(int)':
trapezoid.cpp:113:13: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
  113 |         if(r&1^1){
      |            ~^~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 2636 KB Output is correct
2 Correct 2 ms 2636 KB Output is correct
3 Incorrect 2 ms 2764 KB Output isn't correct
4 Correct 3 ms 2820 KB Output is correct
5 Incorrect 4 ms 2892 KB Output isn't correct
6 Incorrect 5 ms 3148 KB Output isn't correct
7 Correct 7 ms 3276 KB Output is correct
8 Incorrect 9 ms 3468 KB Output isn't correct
9 Incorrect 18 ms 4144 KB Output isn't correct
10 Correct 31 ms 5472 KB Output is correct
11 Incorrect 39 ms 6280 KB Output isn't correct
12 Incorrect 77 ms 9760 KB Output isn't correct
13 Incorrect 95 ms 11144 KB Output isn't correct
14 Incorrect 129 ms 12528 KB Output isn't correct
15 Incorrect 133 ms 13300 KB Output isn't correct
16 Incorrect 137 ms 13928 KB Output isn't correct
17 Incorrect 158 ms 14672 KB Output isn't correct
18 Correct 129 ms 15264 KB Output is correct
19 Incorrect 149 ms 15616 KB Output isn't correct
20 Incorrect 176 ms 16636 KB Output isn't correct