Untitled
unknown
plain_text
2 years ago
3.2 kB
11
Indexable
#include <bits/stdc++.h>
using namespace std;
class LockSystem {
private:
int N, m, Q;
unordered_map<string, int> indexOf; // To get index of node by name
vector<string> node;
unordered_map<string, int> isLocked; // this is a map that stores if a specific node is locked or not
unordered_map<string, set<string>> lockedChildList; // this variable stores list of descendents of a node that are locked
int getParent(int i) {
if(i==0) return -1;
return (i-1)/m;
}
public:
LockSystem(int N, int m, int Q, vector<string> node) : N(N), m(m), Q(Q), node(node) {
for(int i=0; i<N; i++){
indexOf[node[i]] = i; // Assigned every node one index, so that finding its parent became easy
}
}
string lock(string X, int id) {
if(isLocked.find(X) != isLocked.end()) return "false";
if(lockedChildList[X].size() > 0) return "false";
int i = indexOf[X];
while(i!=-1){
if(isLocked.find(node[i]) != isLocked.end()) return "false";
i = getParent(i);
}
i = getParent(indexOf[X]);
while(i!=-1){
lockedChildList[node[i]].insert(X);
i = getParent(i);
}
isLocked[X] = id;
return "true";
}
string unlock(string X, int id) {
if(isLocked.find(X) == isLocked.end()) return "false";
int lockedByID = isLocked[X];
if(lockedByID != id) return "false";
isLocked.erase(X);
int i = getParent(indexOf[X]);
while(i!=-1){
lockedChildList[node[i]].erase(X);
i = getParent(i);
}
return "true";
}
string upgradeLock(string X, int id) {
int i = indexOf[X];
if(isLocked.find(X)!=isLocked.end()) return "false";
set<int>ids;
for(auto it = lockedChildList[X].begin();
it != lockedChildList[X].end();
it++) {
ids.insert(isLocked[(*it)]);
}
if(ids.size() > 1) return "false";
if(ids.size() == 0){
return "false";
}
int tid = *(ids.begin());
set<string>temp(lockedChildList[X]);
for(auto it = temp.begin();
it != temp.end();
it++) {
unlock((*it), id);
}
unlock(X,id);
return lock(X,id);
}
};
int main() {
int N, m, Q;
cin >> N >> m >> Q;
vector<string> node(N);
for(int i=0; i<N; i++){
cin >> node[i];
}
LockSystem lockSystem(N, m, Q, node);
while(Q--){
int operationType;
string nodeName;
int userID;
cin >> operationType >> nodeName >> userID;
if(operationType==1){
cout << lockSystem.lock(nodeName, userID) << endl;
}
else if(operationType==2){
cout << lockSystem.unlock(nodeName, userID) << endl;
}
else{
cout << lockSystem.upgradeLock(nodeName, userID) << endl;
}
}
return 0;
}
Editor is loading...
Leave a Comment