add data-structure of number container and priority manager
change example 3479
This commit is contained in:
35
data-structure/number-containers.cpp
Normal file
35
data-structure/number-containers.cpp
Normal 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();
|
||||
}
|
||||
};
|
48
data-structure/priority-manager.cpp
Normal file
48
data-structure/priority-manager.cpp
Normal 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;
|
||||
}
|
||||
};
|
@@ -8,6 +8,12 @@
|
||||
|
||||
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 {
|
||||
private:
|
||||
vector<int> segVal;
|
Reference in New Issue
Block a user