Untitled

mail@pastecode.io avatar
unknown
plain_text
7 days ago
3.0 kB
2
Indexable
Never
#include <iostream>
#include <set>
#include <unordered_map>

using namespace std;

struct Car {
    int id;
    int tDen;
    int totalParking;
    int totalWaiting;
    int tWait;
    int tPark;
} cars[70001];

struct cmp {
    bool operator()(const Car &a, const Car &b) const {
        int x = a.totalWaiting - a.totalParking;
        int y = b.totalWaiting - b.totalParking;
        if (x == y) return a.tDen < b.tDen;
        return x > y;
    }
};

unordered_map<int, int> mp;  // Map car ID to car index
set<Car, cmp> se;  // Waiting list ordered by cmp

int bTime, bFee, uTime, uFee, capacity, cnt;

void init(int mBaseTime, int mBaseFee, int mUnitTime, int mUnitFee, int mCapacity) {
    bTime = mBaseTime;
    bFee = mBaseFee;
    uTime = mUnitTime;
    uFee = mUnitFee;
    capacity = mCapacity;
    cnt = 0;

    mp.clear();
    se.clear();
}

int arrive(int mTime, int mCar) {
    if (mp.find(mCar) == mp.end()) { // Xe mới xuất hiện
        mp[mCar] = cnt;
        cars[cnt].id = mCar;
        cars[cnt].tDen = mTime;
        cars[cnt].totalParking = 0;
        cars[cnt].totalWaiting = 0;
        cars[cnt].tPark = 0;
        cars[cnt].tWait = 0;

        if (capacity > 0) {  // Còn chỗ đỗ xe
            cars[cnt].tPark = mTime;
            capacity--;
        } else {  // Hết chỗ, thêm vào danh sách chờ
            cars[cnt].tWait = mTime;
            se.insert(cars[cnt]);
        }
        cnt++;
    } else {  // Xe đã từng xuất hiện trước đó
        int idx = mp[mCar];
        if (capacity > 0) {  // Còn chỗ đỗ xe
            cars[idx].tDen = mTime;
            cars[idx].tPark = mTime;
            capacity--;
        } else {  // Hết chỗ, thêm vào danh sách chờ
            cars[idx].tDen = mTime;
            cars[idx].tWait = mTime;
            se.insert(cars[idx]);
        }
    }
    return se.size();
}

int leave(int mTime, int mCar) {
    int idx = mp[mCar];
    if (se.find(cars[idx]) == se.end()) {  // Xe đang đỗ
        cars[idx].totalParking += (mTime - cars[idx].tPark);
        capacity++;

        // Tính phí đỗ xe
        int timePark = mTime - cars[idx].tPark;
        int fee = bFee;
        if (timePark > bTime) {
            int extraTime = timePark - bTime;
            fee += ((extraTime + uTime - 1) / uTime) * uFee;  // Làm tròn lên
        }

        // Nếu có xe đang chờ, chuyển xe từ danh sách chờ vào bãi
        if (!se.empty()) {
            auto topCar = *se.begin();
            int idCar = topCar.id;
            se.erase(se.begin());
            int idxCar = mp[idCar];
            cars[idxCar].tPark = mTime;
            cars[idxCar].totalWaiting += (mTime - cars[idxCar].tWait);
            capacity--;  // Đã dùng 1 slot đỗ
        }

        return fee;
    } else {  // Xe đang trong danh sách chờ
        se.erase(cars[idx]);
        cars[idx].totalWaiting += (mTime - cars[idx].tWait);
        cars[idx].tWait = 0;
        return -1;
    }
}
Leave a Comment