resize函数可以用于vector数组的初始化
class LockingTree {
public:
vector<int>p;
vector<vector<int>> g;
vector<int> user;
int n;
LockingTree(vector<int>& parent) {
p=parent;
n=p.size();
user.resize(n,-1);
g.resize(n);
for(int i=1;i<n;i++)
g[p[i]].push_back(i);
}
bool lock(int k, int u) {
if(user[k]!=-1) return false;
user[k]=u;
return true;
}
bool unlock(int k, int u) {
if(user[k]!=u) return false;
user[k]=-1;
return true;
}
int dfs(int u)
{
int res=0;
if(user[u]!=-1)
{
res++;
user[u]=-1;
}
for(auto son:g[u])
{
res+=dfs(son);
}
return res;
}
bool upgrade(int k, int u) {
if(user[k]!=-1) return false;
for(int i=p[k];i!=-1;i=p[i])
if(user[i]!=-1)
return false;
int cnt=dfs(k);
if(cnt)
{
user[k]=u;
return true;
}
return false;
}
};