#include <bits/stdc++.h>
using namespace std;
class Delivery {
public:
int driverId;
int64_t startTime;
int64_t endTime;
int64_t costHundredthCents;
bool paid = false;
};
class ConcurrentDeliveryDTO{
public :
int64_t time;
int driverId;
int type;
};
class DeliveryCostManager3 {
private:
unordered_map<int, int64_t> driverRates; // driverId → hundredths of a cent/hour
vector<Delivery> deliveries; // sorted by endTime
int64_t globalTotalCost = 0;
int64_t globalPaidCost = 0;
public:
void addDriver(int driverId, double usdHourlyRate) {
// Store as hundredths of a cent/hour
int64_t rateHundredthCentsPerHour = (int64_t)(llround(usdHourlyRate * 10000));
driverRates[driverId] = rateHundredthCentsPerHour;
}
void recordDelivery(int driverId, int64_t startTime, int64_t endTime) {
if (endTime - startTime > 3 * 3600)
throw invalid_argument("Delivery exceeds 3-hour limit");
int64_t rate = driverRates[driverId];
int64_t durationSecs = endTime - startTime;
int64_t cost = (rate * durationSecs) / 3600;
deliveries.push_back({driverId, startTime, endTime, cost, false});
globalTotalCost += cost;
}
void payUpTo(int64_t payTime) {
for (auto d : deliveries) {
if (!d.paid && d.endTime <= payTime) {
d.paid = true;
globalPaidCost += d.costHundredthCents;
}
}
}
double getTotalCost() { return (double)(globalTotalCost) / 10000.0; }
double getTotalCostPaid() { return (double)(globalPaidCost) / 10000.0; }
double getTotalCostUnpaid() {
return (double)(globalTotalCost - globalPaidCost) / 10000.0;
}
bool static compareDeliveries(ConcurrentDeliveryDTO &a,ConcurrentDeliveryDTO &b){
return a.time<b.time;
}
int maxDriverrs(int64_t endTime) {
int64_t startTime = endTime - (24*60*60);
vector<ConcurrentDeliveryDTO> validDeliveries;
for(auto d : deliveries){
if(d.endTime<startTime){
continue;
}
if(d.startTime>endTime){
continue;
}
validDeliveries.push_back({max(startTime,d.startTime),d.driverId,0});
validDeliveries.push_back({min(endTime,d.endTime),d.driverId,1});
}
sort(validDeliveries.begin(),validDeliveries.end(),compareDeliveries);
unordered_map<int,int> countDelivery;
int currentDrivers = 0;
int maxDrivers = 0 ;
for(auto it: validDeliveries){
if(it.type==0){
countDelivery[it.driverId]++;
}
if(it.type==1){
countDelivery[it.driverId]--;
if(countDelivery[it.driverId]==0){
countDelivery.erase(it.driverId);
}
}
currentDrivers = countDelivery.size();
maxDrivers = max(maxDrivers,currentDrivers);
}
return maxDrivers;
}
};
int main(){
DeliveryCostManager3 manager;
manager.addDriver(1, 35.10);
manager.addDriver(2, 15.15);
manager.addDriver(3, 8.55);
manager.addDriver(4, 11.28);
manager.addDriver(5, 0.1);
manager.recordDelivery(1, 0, 3600);
manager.recordDelivery(5, 0, 3600);
manager.recordDelivery(2, 0, 5400);
manager.recordDelivery(2, 4400, 6200);
manager.recordDelivery(5, 3600, 7200);
manager.recordDelivery(5,7200, 10800);
manager.recordDelivery(5, 10800, 14400);
manager.recordDelivery(5, 14400, 18000);
cout << fixed << setprecision(2);
// cout << "Driver 1 total: $" << manager.getDriverTotalCost(1) << std::endl;
// cout << "Driver 2 total: $" << manager.getDriverTotalCost(2) << std::endl;
cout << "Global total: $" << manager.getTotalCost() << std::endl;
// cout<<manager.maxSimultaneousDrivers24HourBefore(18000)<<endl;
cout<<manager.maxDriverrs(18000)<<endl;
return 0;
}