AcWing 5723. 文件夹合并25分暴力
原题链接
困难
作者:
送葬的芙莉叶
,
2024-11-24 12:03:47
,
所有人可见
,
阅读 20
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
struct t {
int parent=0;
int value=0;
vector <int>child;
};
int main() {
int n,m;
cin>>n>>m;
t tree[n];
for(int i=1; i<n; i++) {
int temp;
cin>>temp;
tree[i].parent=temp-1;
tree[temp-1].child.push_back(i);//学会用,意思是把i扔进动态数组里
}
for(int i=0; i<n; i++) {
int temp;
cin>>temp;
tree[i].value=temp;
}//注意:树的节点从0开始
for(int i=0; i<m; i++) {
int op,oo;
cin>>op>>oo;
if(op==2) {
int temp=oo-1;
int num=1;
while(temp!=0) {
temp=tree[temp].parent;
num++;
}
cout<<num<<endl;
}
if(op==1) {
int size=tree[oo-1].child.size();
for(int j=0; j<size; j++) {
tree[oo-1].value+=tree[tree[oo-1].child[j]].value;//它的各种孩子
for(int k=0; k<tree[tree[oo-1].child[j]].child.size(); k++) {
//将他孩子的孩子转移过来
tree[oo-1].child.push_back(tree[tree[oo-1].child[j]].child[k]);
tree[tree[tree[oo-1].child[j]].child[k]].parent=oo-1;
}
}
for(int j=0; j<size; j++)
tree[oo-1].child.erase(tree[oo-1].child.begin());//删除原有文件夹
cout<<tree[oo-1].child.size()<<" "<<tree[oo-1].value<<endl;
}
}
return 0;
}