Untitled
unknown
plain_text
a year ago
3.0 kB
9
Indexable
#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;
}
}
Editor is loading...
Leave a Comment