2 条题解

  • 0
    @ 2025-1-10 18:17:24
    #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
      @ 2025-1-10 18:02:27
      #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
      上传者