アヴァの手袋

タイトル説明
Avaのあるファンタジーの世界に冬がやってくる!Avaはかわいい子猫です。彼女はこの冬にたくさんの手袋を購入しました。AkatheRabbitは長い休止キャンプを組織し、Avaに参加を呼びかけました。Avaは毎日異なる手袋を着用する予定です。アッカラビットが開催する休止キャンプには合計T日間あり、毎朝早起きして手袋を選びます。彼女は合計n個の手袋を持っており、それぞれが互いに異なりますが、メインカラーはCiです。異なる手袋の色は同じである可能性があります。Avaは、毎日n個の手袋から2個を選びます。彼女は、色の異なる手袋は手に馴染みにくいと感じているため、休止キャンプの開始前にAkaに助けを求めることができます。一部の手袋を他の色でペイントしますが、休止キャンプが開始されると、n個の手袋の色を変更できないことに注意してください。休止キャンプが始まる前に、アヴァは毎日2枚の手袋を着用する計画を立てていましたが、少なくとも手袋の色を変更して、アヴァの計画に従って手袋を着用する場合は、毎日2枚の手袋を着用するように指示する必要があります。すべての手袋は同じ色です


最初の行、整数nを入力します。これは、Avaの手袋の数を表します。
2行目のn個の整数で、i番目の数値Ciはi番目のグローブの初期色を表します。
3行目の整数Tは、Akkaが開催した休止キャンプの日数を表します。
次に、T行があり、それぞれに2つの整数i、jがあります。それぞれ、Avaがこの日に選んだ2つの手袋の数を示しています。

出力は
、少なくとも変更が必要な手袋の色の数を示す線、整数です。

サンプル入力
5
2 2 2 2 1
4
2 4
5 3
4 3
5 2

サンプル出力
1

そして、入力手袋を確認し、サイクルを繰り返して父親を更新し、それを配列に保存します。各ファミリの異なる色の数、同じ色の大部分は変更せずにそのままにして、合計数から同じ数を引くことができます。色を変更することです

#include<bits/stdc++.h>
using namespace std;
int fa[150000];
int n,a[150000],ans;
map<int ,int>q[150000],p,pp;
 
int m;
int getfa(int x)//找爸爸
{
    
    
  if(fa[x]==x)return x;
  return fa[x]=getfa(fa[x]);
}
int main()
{
    
    
   cin>>n;int sum=n;
   for(int i=1;i<=n;i++)fa[i]=i;
   for(int i=1;i<=n;i++)cin>>a[i],pp[i]=a[i]; 
   cin>>m;
   for(int i=1;i<=m;i++)
   {
    
    
     int x,y;cin>>x>>y;
     int xx=getfa(x);
     int yy=getfa(y);
     if(xx!=yy)fa[xx]=yy;
   }
    
   for(int i=1;i<=n;i++)getfa(i);//更新祖先
   /* for(int i=1;i<=n;i++)cout<<fa[i]<<' ';
    cout<<endl;*/
   for(int i=1;i<=n;i++)
   {
    
    
     q[fa[i]][a[i]]++;
     if(q[fa[i]][a[i]]>p[fa[i]])p[fa[i]]=q[fa[i]][a[i]];//如果这种颜色更多,更新
   }
   for(int i=1;i<=n;i++)if(fa[i]==i)sum-=p[fa[i]];//同种颜色不用变
   cout<<sum;
   return 0;
}

おすすめ

転載: blog.csdn.net/yhhy666/article/details/108223373