NC206834. 数树
描述
输入描述
第一行一个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; } }