-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy path3408.cpp
More file actions
60 lines (55 loc) · 1.83 KB
/
3408.cpp
File metadata and controls
60 lines (55 loc) · 1.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class TaskManager {
public:
long long toKey(int taskId, int priority) {
long long key = 0;
key += ((long long)priority << 31);
key += taskId;
return key;
}
unordered_map<int, pair<int, int>> taskID2info;
set<long long> st;
TaskManager(vector<vector<int>>& tasks) {
for (auto& task : tasks) {
taskID2info[task[1]] = {task[0], task[2]}; // taskID: userID, priority
long long key = toKey(task[1], task[2]);
st.insert(key);
}
}
void add(int userId, int taskId, int priority) {
long long key = toKey(taskId, priority);
st.insert(key);
taskID2info[taskId] = {userId, priority};
}
void edit(int taskId, int newPriority) {
auto [userId, priority] = taskID2info[taskId];
taskID2info[taskId] = {userId, newPriority};
long long oldKey = toKey(taskId, priority);
st.erase(st.find(oldKey));
long long newKey = toKey(taskId, newPriority);
st.insert(newKey);
}
void rmv(int taskId) {
auto [userId, priority] = taskID2info[taskId];
long long oldKey = toKey(taskId, priority);
st.erase(st.find(oldKey));
taskID2info.erase(taskID2info.find(taskId));
}
int execTop() {
if (st.empty()) return -1;
long long key = *st.rbegin();
long long mask = 1;
int taskId = key & ((mask << 31) - 1);
auto [userId, priority] = taskID2info[taskId];
taskID2info.erase(taskID2info.find(taskId));
st.erase(st.find(key));
return userId;
}
};
/**
* Your TaskManager object will be instantiated and called as such:
* TaskManager* obj = new TaskManager(tasks);
* obj->add(userId,taskId,priority);
* obj->edit(taskId,newPriority);
* obj->rmv(taskId);
* int param_4 = obj->execTop();
*/