add data-structure of number container and priority manager

change example 3479
This commit is contained in:
2025-09-18 19:31:20 +08:00
parent 80b6e4fcaf
commit 57dd0e9440
3 changed files with 89 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
#include <unordered_map>
#include <queue>
#include <vector>
/*
The number container system can do the following:
1. insert or replace a number at the given index
2. return the smallest index for the given number in the system
*/
class NumberContainers {
private:
std::unordered_map<int, int> nums;
std::unordered_map<int, std::priority_queue<int, std::vector<int>, std::greater<int>>> heap;
public:
NumberContainers() = default;
void change(int index, int number) {
nums[index] = number;
heap[number].push(index);
}
int find(int number) {
while (!heap[number].empty() && nums[heap[number].top()] != number) {
heap[number].pop();
}
if (heap[number].empty()) {
return -1;
}
return heap[number].top();
}
};

View File

@@ -0,0 +1,48 @@
#include <unordered_map>
#include <queue>
/*
Task scheduling with changeable priorities
*/
class PriorityManager {
private:
std::unordered_map<int, int> info;
std::priority_queue<std::pair<int, int>> heap;
public:
PriorityManager(std::vector<std::pair<int, int>>& tasks) {
for (auto& task : tasks) {
int taskId = task.first, priority = task.second;
info[taskId] = priority;
heap.push(std::make_pair(priority, taskId));
}
}
void add(int taskId, int priority) {
info[taskId] = priority;
heap.push(std::make_pair(priority, taskId));
}
void edit(int taskId, int newPriority) {
info[taskId] = newPriority;
heap.push(std::make_pair(newPriority, taskId));
}
void rmv(int taskId) {
info.erase(taskId);
}
int execTop() {
while (!heap.empty()) {
auto task = heap.top();
heap.pop();
int priority = task.first, taskId = task.second;
if (info.find(taskId) != info.end() && info[taskId] == priority) {
rmv(taskId);
return taskId;
}
}
return -1;
}
};

View File

@@ -8,6 +8,12 @@
Return the number of fruit types that remain unplaced after all possible allocations are made. Return the number of fruit types that remain unplaced after all possible allocations are made.
*/ */
#include <vector>
#include <bit>
#include <bitset>
using namespace std;
class SegmentTree { class SegmentTree {
private: private:
vector<int> segVal; vector<int> segVal;