2 条题解
-
0
#include<bits/stdc++.h> using namespace std; unordered_set<int>s[400005]; int n,m,rt=1; int ans; int f(int x){//判断是否是叶结点 return (x==rt&&s[x].size()==0)||(x!=rt&&s[x].size()==1); } int main(){ cin>>n; int x; for(int i=2;n>=i;i++){ cin>>x; s[i].insert(x);s[x].insert(i); } for(int i=2;n>=i;i++) if(s[i].size()==1)ans++; cout<<ans<<endl; cin>>m; string str; for(int i=1;m>=i;i++){ cin>>str>>x; if(str=="Add"){ if(!f(x))ans++; s[x].insert(n+i);s[n+i].insert(x); } if(str=="Del"){ s[*s[x].begin()].erase(x); if(!f(*s[x].begin()))ans--; } if(str=="Upd"){ int y=rt;rt=0; if(f(x)&&!f(y))ans--; if(!f(x)&&f(y))ans++; rt=x; } cout<<ans<<endl; } return 0; }
-
0
#include<bits/stdc++.h> using namespace std; unordered_set<int>s[400005]; int n,m,rt=1; int ans; int f(int x){//判断是否是叶结点 return (x==rt&&s[x].size()==0)||(x!=rt&&s[x].size()==1); } int main(){ cin>>n; int x; for(int i=2;n>=i;i++){ cin>>x; s[i].insert(x);s[x].insert(i); } for(int i=2;n>=i;i++) if(s[i].size()==1)ans++; cout<<ans<<endl; cin>>m; string str; for(int i=1;m>=i;i++){ cin>>str>>x; if(str=="Add"){ if(!f(x))ans++; s[x].insert(n+i);s[n+i].insert(x); } if(str=="Del"){ s[*s[x].begin()].erase(x); if(!f(*s[x].begin()))ans--; } if(str=="Upd"){ int y=rt;rt=0; if(f(x)&&!f(y))ans--; if(!f(x)&&f(y))ans++; rt=x; } cout<<ans<<endl; } return 0; }
- 1
信息
- ID
- 1057
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 4
- 已通过
- 1
- 上传者