https://leetcode-cn.com/problems/operations-on-tree/
思路:无聊的模拟题。
class LockingTree {
public:
LockingTree(vector<int>& vec) {
parent=vec;
int n=parent.size();
tree.resize(n);
for(int i=1;i<n;i++)
tree[parent[i]].push_back(i);
}
bool lock(int num, int user) {
if(!lockState.count(num))
{
lockState[num]=user;
return 1;
}
return 0;
}
bool unlock(int num, int user) {
if(lockState.count(num)&&lockState[num]==user)
{
lockState.erase(num);
return 1;
}
return 0;
}
bool upgrade(int num, int user) {
if(lockState.count(num))
return 0;
int father=parent[num];
while(father>=0)
{
if(lockState.count(father))
return 0;
father=parent[father];
}
vector<int> childs;
function<void(int)> dfs=[&](int rt) -> void
{
if(lockState.count(rt))
childs.push_back(rt);
for(int &nxt:tree[rt])
dfs(nxt);
};
dfs(num);
if(childs.empty())
return 0;
lockState[num]=user;
for(int &child:childs)
lockState.erase(child);
return 1;
}
private:
vector<vector<int>> tree;
vector<int> parent;
unordered_map<int,int> lockState;
};
/**
* Your LockingTree object will be instantiated and called as such:
* LockingTree* obj = new LockingTree(parent);
* bool param_1 = obj->lock(num,user);
* bool param_2 = obj->unlock(num,user);
* bool param_3 = obj->upgrade(num,user);
*/