Submission #1184759

#TimeUsernameProblemLanguageResultExecution timeMemory
1184759countlessWall (IOI14_wall)C++20
100 / 100
711 ms214284 KiB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

const ll MOD = 998244353;
const ll INF = 1e18;
const ld EPS = 1e-12;

#define endl "\n"
#define sp <<" "<<
#define REP(i, a, b) for(ll i = a; i < b; i++)
#define dbg(x) cout << #x << " = " << x << endl
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define fast_io() ios_base::sync_with_stdio(false); cin.tie(NULL)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) ((ll)(x).size())

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

template <typename Key, typename Value>
using hash_map = unordered_map<Key, Value, custom_hash>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
// uniform_int_distribution<int>(a, b)(rng);
// shuffle(all(a), rng);

struct segtree {
    int l, r;
    segtree *left, *right;
    int down, up;

    void merge() {
        ;; // nothing??
    }

    void update(pair<int, int> upd) {
        down = max(down, upd.first);
        up = max(up, down);

        up = min(up, upd.second);
        down = min(down, up);
    }

    segtree(int l, int r) : l(l), r(r) {
        down = 0;
        up = INT_MAX;

        if (l == r) {
            left = right = nullptr;
            return;
        }

        int m = (l+r)/2;
        left = new segtree(l, m);
        right = new segtree(m+1, r);
        merge();
    }

    void propagate() {
        if (left) {
            left->update({down, up});
            right->update({down, up});
            down = 0;
            up = INT_MAX;
        }
    }

    int query(int ind) {
        if (l == r) {
            return down;
        }

        int m = (l+r)/2;
        propagate();
        if (ind <= m) return left->query(ind);
        else return right->query(ind);
    }

    void updateUp(int ql, int qr, int upd) {
        if (ql > r || qr < l) return;

        if (ql <= l && r <= qr) {
            update({0, upd});
            propagate();
            return;
        }

        int m = (l+r)/2;
        propagate();
        left->updateUp(ql, qr, upd);
        right->updateUp(ql, qr, upd);
    }

    void updateDown(int ql, int qr, int upd) {
        if (ql > r || qr < l) return;

        if (ql <= l && r <= qr) {
            update({upd, INT_MAX});
            propagate();
            return;
        }
        
        int m = (l+r)/2;
        propagate();
        left->updateDown(ql, qr, upd);
        right->updateDown(ql, qr, upd);
    }
};

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) {
    segtree st(0, n-1);

    REP(i, 0, k) {
        if (op[i] == 1) {
            st.updateDown(left[i], right[i], height[i]);
        }

        else {
            st.updateUp(left[i], right[i], height[i]);
        }
    }

    // this should be an insignificant until subtask 3, optimize by storing nodes later:P
    REP(i, 0, n) {
        finalHeight[i] = st.query(i);
        // cerr << st.query(i) << endl;
    }
    return;
}

// signed main() {
//     int n, k; cin >> n >> k;
//     int op[k], left[k], right[k], height[k], finalHeight[n];
//     fill_n(finalHeight, n, 0);
//     REP(i, 0, k) {
//         cin >> op[i] >> left[i] >> right[i] >> height[i];
//     }

//     buildWall(n, k, op, left, right, height, finalHeight);

//     for (auto &x : finalHeight) {
//         cout << x << endl;
//     }
//     cout << endl;
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...