ACM训练联盟周赛 A. Teemo's bad day

  •  65536K
 

Today is a bad day. Teemo is scolded badly by his teacher because he didn't do his homework.But Teemo is very self-confident, he tells the teacher that the problems in the homework are too simple to solve. So the teacher gets much angrier and says"I will choose a problem in the homework, if you can't solve it, I will call you mother! "

The problem is that:

There is an array A which contains n integers, and an array B which also contains n integers. You can pay one dollar to buy a card which contains two integers a1 and a2, The card can arbitrary number of times transform a single integer a1 to a2 and vise-versa on both array A and Array B. Please calculate the minimum dollars you should pay to make the two array same(For every 1<=i<=n,A[i]=B[i]);

Input Format

  • The first line of the input contains an integer T(1<=T<=10), giving the number of test cases.
  • For every test case, the first line contains an integer n(1<=n<=500000). The second line contains n integers. The i th integer represents A[i](1<=A[i]<=100000). And the third line contains n integers. The i th integer represents B[i](1<=B[i]<=100000).

Output Format

For each test case, output an integer which means the minimum dollars you should pay in a line.

样例输入

1
5
1 1 2 3 2
1 2 3 1 1

样例输出

2

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <vector>
 5 #include <string>
 6 #include <string>
 7 #include <map>
 8 #include <cmath>
 9 #include <set>
10 #include <ctime>
11 #include <algorithm>
12 using namespace std;
13 const int N=5e5+9;
14 const int M=1e5+9;
15 using namespace std;
16 int t,n,a[N],b[N];
17 //map<int,int>mp;
18 int mp[M];
19 vector<int>ve[M];
20 int ans1,ans2;
21 bool vis[M];
22 void dfs(int x)
23 {
24     vis[x]=1;
25     for(int i=0;i<ve[x].size();i++){
26         int y=ve[x][i];
27         if(!vis[y])
28         {
29             dfs(y);
30         }
31     }
32 }
33 int  main()
34 {
35     scanf("%d",&t);
36     while(t--)
37     {    clock_t sta=clock();
38         scanf("%d",&n);
39         //mp.erase(mp.begin(),mp.end());//用map会超时
40         memset(mp,0,sizeof(mp));
41         //memset(vis,0,sizeof(vis));
42         for(int i=1;i<=M;i++)  ve[i].clear();
43         for(int i=1;i<=n;i++)
44         {
45             scanf("%d",&a[i]);
46         }
47         for(int i=1;i<=n;i++)  scanf("%d",&b[i]);
48         for(int i=1;i<=n;i++)  {
49             if(a[i]!=b[i]){
50                 mp[a[i]]=1;
51                 mp[b[i]]=1;
52                 ve[a[i]].push_back(b[i]);
53                 ve[b[i]].push_back(a[i]);//一定是无向图,不然可能一个联通快走不遍
54             }
55         }
56         ans1=ans2=0;
57         memset(vis,0,sizeof(vis));
58         //将该子联通快的所有点和根相互交换
59         for(int i=1;i<=M;i++){
60            if(mp[i]==1){
61                ans1++;
62                if(vis[i]==0){
63                    dfs(i);
64                    ans2++;
65                }
66            }    
67         }
68         printf("%d\n",ans1-ans2);
69         clock_t end=clock();
70         //printf("%d\n",end-sta);
71         cout<<end-sta<<endl;
72     }
73     return 0;
74 }

 

posted on 2018-08-01 01:01  cltt  阅读(225)  评论(0编辑  收藏  举报

导航