C - Junk-Mail Filter
题目大意:就是一堆信件,然后有两个操作,一个是把一堆信件归在一个文件夹,一个就是把一个信件从文件夹中取出,最后问有多少个文件夹,一开始所有信件都是单独的文件夹。
其实就是一个简单的并查集删除的操作,当删除时就创建新的结点来代替它,要注意的是数组的范围,虽然信件只有10的5次方,但是操作有10的6次方,因为删除时还得创建新节点,所以数组一定要开大,不然不是WR就是TL。最后的输出可以直接用set,也可以用数组标记信件是归在哪个文件夹,注意的是后面创建的结点是虚拟的,真实的信件有对它们的映射,所以最后统计时只考虑真实信件。
1 #include2 #include 3 #include 4 using namespace std; 5 struct Email{ 6 int id,gen; 7 }em[1201108];//要够大 8 int n,m; 9 int gui(int x);10 void bing(int x,int y);11 void del(int x);12 int main()13 {14 int i,x,y,test=0;15 char c;16 while(scanf("%d%d",&n,&m)!=EOF&&(n||m))17 {18 int N=n;19 set s;20 for(i=0;i >c;28 if(c=='M')29 {30 scanf("%d%d",&x,&y);31 bing(em[x].id,em[y].id);32 }33 else34 {35 scanf("%d",&x);36 del(x);37 }38 }39 for(i=0;i