返回顶部

牛客练习赛70 D.数树 (模拟,STL)

  • 题意:每次有\(3\)中操作,对两个点连条边,删去某条边,或者问当前大小不为\(1\)的树的数量.连重边或者删去一条不存在的边,这样的白痴操作可以无视qwq.

  • 题解:水题,用map存一下pair然后分论讨论即可.

  • 代码:

    int n;
    ll u,v;
    map<PLL,bool> mp;
    map<ll,ll> son;
    ll res;
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>n;
        for(int i=1;i<=n;++i){
        	int op;
        	cin>>op;
        	if(op==3) cout<<res<<endl;
        	else if(op==1){
        		cin>>u>>v;
        		if(u>v) swap(u,v);
        		if(mp[{u,v}]) continue;
        		mp[{u,v}]=true;
        		if(son[u]==0 && son[v]==0) res++;
        		else if(son[u]!=0 && son[v]!=0) res--;
        		son[u]++;
        		son[v]++;
        	}
        	else{
        		cin>>u>>v;
        		if(u>v) swap(u,v);
        		if(!mp[{u,v}]) continue;
        		mp[{u,v}]=false;
        		if(son[u]!=1 && son[v]!=1) res++;
        		else if(son[u]==1 && son[v]==1) res--;
        		son[u]--;
        		son[v]--;
        	}
        }
    
        return 0;
    }
    
posted @ 2020-10-02 21:32  _Kolibri  阅读(146)  评论(0)    收藏  举报