結果

問題 No.2453 Seat Allocation
ユーザー t98slidert98slider
提出日時 2023-09-01 22:19:39
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 81 ms / 2,000 ms
コード長 5,918 bytes
コンパイル時間 1,791 ms
コンパイル使用メモリ 173,916 KB
実行使用メモリ 13,232 KB
最終ジャッジ日時 2023-09-07 15:35:51
合計ジャッジ時間 3,901 ms
ジャッジサーバーID
(参考情報)
judge12 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,376 KB
testcase_01 AC 2 ms
4,376 KB
testcase_02 AC 2 ms
4,380 KB
testcase_03 AC 2 ms
4,380 KB
testcase_04 AC 2 ms
4,380 KB
testcase_05 AC 77 ms
12,944 KB
testcase_06 AC 21 ms
4,380 KB
testcase_07 AC 35 ms
12,344 KB
testcase_08 AC 7 ms
4,376 KB
testcase_09 AC 81 ms
13,056 KB
testcase_10 AC 79 ms
13,232 KB
testcase_11 AC 80 ms
13,064 KB
testcase_12 AC 21 ms
4,380 KB
testcase_13 AC 24 ms
4,376 KB
testcase_14 AC 19 ms
4,524 KB
testcase_15 AC 34 ms
4,376 KB
testcase_16 AC 26 ms
4,380 KB
testcase_17 AC 2 ms
4,380 KB
testcase_18 AC 52 ms
8,228 KB
testcase_19 AC 66 ms
12,224 KB
testcase_20 AC 27 ms
7,284 KB
testcase_21 AC 31 ms
4,748 KB
testcase_22 AC 45 ms
5,900 KB
testcase_23 AC 1 ms
4,380 KB
testcase_24 AC 2 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

template <class S, S (*op)(S, S), S (*e)()> struct segtree {
    public:
    segtree() : segtree(0) {}
    segtree(int n) : segtree(std::vector<S>(n, e())) {}
    segtree(const std::vector<S>& v) : _n(int(v.size())) {
        log = ceil_pow2(_n);
        size = 1 << log;
        d = std::vector<S>(2 * size, e());
        for (int i = 0; i < _n; i++) d[size + i] = v[i];
        for (int i = size - 1; i >= 1; i--) {
            update(i);
        }
    }

    void set(int p, S x) {
        assert(0 <= p && p < _n);
        p += size;
        d[p] = x;
        for (int i = 1; i <= log; i++) update(p >> i);
    }

    S get(int p) {
        assert(0 <= p && p < _n);
        return d[p + size];
    }
    const S operator[](int p) const { return get(p); }
    S operator[](int p) { return get(p); }

    S prod(int l, int r) {
        assert(0 <= l && l <= r && r <= _n);
        S sml = e(), smr = e();
        l += size;
        r += size;

        while (l < r) {
            if (l & 1) sml = op(sml, d[l++]);
            if (r & 1) smr = op(d[--r], smr);
            l >>= 1;
            r >>= 1;
        }
        return op(sml, smr);
    }

    S all_prod() { return d[1]; }

    template <bool (*f)(S)> int max_right(int l) {
        return max_right(l, [](S x) { return f(x); });
    }
    template <class F> int max_right(int l, F f) {
        assert(0 <= l && l <= _n);
        assert(f(e()));
        if (l == _n) return _n;
        l += size;
        S sm = e();
        do {
            while (l % 2 == 0) l >>= 1;
            if (!f(op(sm, d[l]))) {
                while (l < size) {
                    l = (2 * l);
                    if (f(op(sm, d[l]))) {
                        sm = op(sm, d[l]);
                        l++;
                    }
                }
                return l - size;
            }
            sm = op(sm, d[l]);
            l++;
        } while ((l & -l) != l);
        return _n;
    }

    template <bool (*f)(S)> int min_left(int r) {
        return min_left(r, [](S x) { return f(x); });
    }
    template <class F> int min_left(int r, F f) {
        assert(0 <= r && r <= _n);
        assert(f(e()));
        if (r == 0) return 0;
        r += size;
        S sm = e();
        do {
            r--;
            while (r > 1 && (r % 2)) r >>= 1;
            if (!f(op(d[r], sm))) {
                while (r < size) {
                    r = (2 * r + 1);
                    if (f(op(d[r], sm))) {
                        sm = op(d[r], sm);
                        r--;
                    }
                }
                return r + 1 - size;
            }
            sm = op(d[r], sm);
        } while ((r & -r) != r);
        return 0;
    }

    private:
    int _n, size, log;
    std::vector<S> d;
    int ceil_pow2(int n) {
        int x = 0;
        while ((1U << x) < (unsigned int)(n)) x++;
        return x;
    }
    void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
};

template<class T> struct yuri {
    T num, den;
    yuri() : num(0), den(1) {}
    yuri(T a) : num(a), den(1) {}
    yuri(int a) : num(a), den(1) {}
    //yuri(long long a) : num(a), den(1) {}
    yuri(T a, T b) : num(a), den(b) {}
    void safe(){
        if(den < 0) den *= -1, num *= -1;
        T v = __gcd(abs(num), den);
        num /= v, den /= v;
    }
    yuri& operator++() { num += den; return *this; }
    yuri& operator--() { num -= den; return *this; }
    yuri& operator+=(const yuri& rhs) {
        num *= rhs.den;
        num += rhs.num * den;
        den *= rhs.den;
        return *this;
    }
    yuri& operator-=(const yuri& rhs) {
        num *= rhs.den;
        num -= rhs.num * den;
        den *= rhs.den;
        return *this;
    }
    yuri& operator*=(const yuri& rhs) {
        num *= rhs.num;
        den *= rhs.den;
        return *this;
    }
    yuri& operator/=(const yuri& rhs) {
        num *= rhs.den;
        den *= rhs.num;
        return *this ; 
    }
    yuri operator+() const { return *this; }
    yuri operator-() const { return yuri() - *this; }
    friend yuri operator+(const yuri& lhs, const yuri& rhs) {
        return yuri(lhs) += rhs;
    }
    friend yuri operator-(const yuri& lhs, const yuri& rhs) {
        return yuri(lhs) -= rhs;
    }
    friend yuri operator*(const yuri& lhs, const yuri& rhs) {
        return yuri(lhs) *= rhs;
    }
    friend yuri operator/(const yuri& lhs, const yuri& rhs) {
        return yuri(lhs) /= rhs;
    }
    friend bool operator==(const yuri& lhs, const yuri& rhs) {
        return (lhs.num * rhs.den == rhs.num * lhs.den);
    }
    friend bool operator!=(const yuri& lhs, const yuri& rhs) {
        return (lhs.num * rhs.den != rhs.num * lhs.den);
    }
    friend ostream& operator << (ostream &os, const yuri& rhs) noexcept {
        return os << (rhs.num / rhs.den);
    }
    friend bool operator<(const yuri lhs, const yuri rhs) {
        return (lhs.num*rhs.den<lhs.den*rhs.num);
    }
    friend bool operator>(const yuri lhs, const yuri rhs) {
        return (lhs.num*rhs.den>lhs.den*rhs.num);
    }
};

using S = pair<yuri<ll>, int>;
S op(S lhs, S rhs){
    if(lhs.first > rhs.first) return lhs;
    if(rhs.first > lhs.first) return rhs;
    return lhs.second < rhs.second ? lhs : rhs;
}

S e(){
    return make_pair(-1, 1 << 30);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, m;
    cin >> n >> m;
    vector<int> a(n), b(m), c(n), ans(m);
    for(auto &&v : a) cin >> v;
    for(auto &&v : b) cin >> v;
    b.push_back(1 << 30);
    segtree<S, op, e> seg(n);
    for(int i = 0; i < n; i++){
        seg.set(i, make_pair(yuri<ll>(a[i], b[c[i]++]), i));
    }
    for(int i = 0; i < m; i++){
        auto pa = seg.all_prod();
        cout << pa.second + 1 << '\n';
        int p = pa.second;
        seg.set(p, make_pair(yuri<ll>(a[p], b[c[p]++]), p));
    }
}
0