列表

详情


NC206834. 数树

描述

小牛牛在暑假的时候返乡务农。为了响应习主席“绿水青山就是金山银山”的号召开始种树。

但他种树的方式比较奇怪。他会先拿出一些有标号的点,然后他会有一些操作,分为3种:添加一条边,切断一条边,询问他有多少个大小不为一的树。当然,年幼的小牛牛记性不是很好,他有时会连出重边,有时也会切断根本不存在的边。当然,对于这样的操作,无视就可以了。

注意看数据范围

输入描述


第一行一个n

接下来n行,表示n次操作。

每组操作格式如下

表示将u点和v点连起来

表示将u点和v点之间的边删除

3 表示询问

输出描述

对每一个3询问输出一个数表示当前大小不为一的树的数量。

示例1

输入:

4
1 1926 817
3
2 817 1926
3

输出:

1
0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 149ms, 内存消耗: 7228K, 提交时间: 2020-09-27 01:16:09

#include<bits/stdc++.h>
using namespace std;
unordered_map<int,int> e;
map<pair<int,int>,int> mp;

int main()
{
	int n,x,y;cin>>n;
	int ans=0;
	while(n--){
		int op;cin>>op;
		if(op==1){
			cin>>x>>y;if(x>y) swap(x,y);
			if(!mp[{x,y}]){
				if(!e[x]&&!e[y]) ans++;
				else if(e[x]&&e[y]) ans--;
				e[x]++;e[y]++;mp[{x,y}]=1;
			}
		}
		else if(op==2){
			cin>>x>>y;if(x>y) swap(x,y);
			if(mp[{x,y}]){
				if(e[x]==1&&e[y]==1) ans--;
				else if(e[x]>1&&e[y]>1) ans++;
				e[x]--;e[y]--;mp[{x,y}]=0;	
			}
		}
		else cout<<ans<<endl;
	} 
	return 0;	
} 

C++11(clang++ 3.9) 解法, 执行用时: 213ms, 内存消耗: 8312K, 提交时间: 2020-09-26 22:16:35

#include<iostream>
#include<map>
using namespace std;
map<pair<int ,int >,int >e;
map<int ,int >v;
int main(){
	int n,z=0,y=0;
	cin>>n;
	while(n--){
		int t,a,b;
		cin>>t;
		if(t==1){
			cin>>a>>b;
			if(e[{a,b}]==0){
				e[{a,b}]=1;e[{b,a}]=1; z++;
				if(v[a]++==0) y++;
				if(v[b]++==0) y++;
			}
		}
		else if(t==2){
			cin>>a>>b;
			if(e[{a,b}]==1){
				e[{a,b}]=0; e[{b,a}]=0;z--;
			    if(--v[a]==0) y--;
				if(--v[b]==0) y--;	
			}
		} 
		else cout<<y-z<<endl;
	}
}

上一题