UCSD ICPC Club Nov20 C

Initially, each sock is its own set.
If on a certain day the two socks to be worn are $l_i$ and $r_i$, then merge the sets containing $l_i$ and $r_i$
It’s evident that ultimately, all socks in each set must be of the same color.
Using union find set, find the size of each set $|S|$, as well as the count of the most frequently occurring sock color in the set $s_{\max}$. The rest need to be repainted. Sum up the answers. If using a map, the complexity is $O(n\log)$.

The second solution is constructing an undirected graph, using DFS on each connected component and maintaining it with a hash table, with an expected complexity of $O(n)$.

// compile: make data
// run: ./data < data.in
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#ifdef LOCAL
#include <debug/codeforces.h>
#define debug(x...) _debug_print(#x, x);
#define Debug(x...) _debug_print_format(#x, x);
std::ifstream terminal("/dev/tty");
#define PP cerr<<"\033[1;30mpause...\e[0m",terminal.ignore();
#else
#define debug(x...)
#define Debug(x...)
#define PP
#endif
template<typename...Args> void print_(Args...args){((cout<<args<<" "),...)<<endl;}
#define rep(i,a,b) for(int i=(a);i<(int)(b);++i)
#define sz(v) ((int)(v).size())
#define print(...) print_(__VA_ARGS__);
#define FIND(a, x) ((find(a.begin(),a.end(),(x))!=a.end())?1:0)
#define cmin(x,...) x=min({(x),__VA_ARGS__})
#define cmax(x,...) x=max({(x),__VA_ARGS__})
#define INTMAX (int)(9223372036854775807)
#define INF (int)(1152921504606846976)
#define NaN (int)(0x8b88e1d0595d51d1)
#define double long double
#define int long long
#define uint unsigned long long
#define MAXN 200010

struct DSU {
    vector<int> parent, rank, s;
    DSU(int n) {
        parent.resize(n);
        rank.resize(n);
        s.resize(n, 1);
        rep(i, 0, n) parent[i] = i;
    }
    int find(int x) {
        if (parent[x] != x) parent[x] = find(parent[x]);
        return parent[x];
    }
    void unite(int x, int y) {
        int rx = find(x), ry = find(y);
        if (rx == ry) return;
        if (rank[rx] < rank[ry]) parent[rx] = ry, s[ry] = s[rx] + s[ry];
        else if (rank[rx] > rank[ry]) parent[ry] = rx, s[rx] = s[rx] + s[ry];
        else parent[ry] = rx, ++rank[rx], s[rx] = s[rx] + s[ry];
    }
    int get_size(int x) {
        return s[find(x)];
    }
};

int32_t main() {
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);

    int n, m, k; cin >> n >> m >> k;
    DSU dsu(n+1);
    vector<int> a(n);
    vector<vector<int>> v(n);
    rep(i, 0, n) cin >> a[i];
    rep(i, 0, m) {
        int x, y; cin >> x >> y;
        --x, --y;
        dsu.unite(x, y);
    }
    rep(i, 0, n) v[dsu.find(i)].push_back(a[i]);
    int ans = 0;
    rep(i, 0, n) {
        if (sz(v[i]) > 1) {
            map<int, int> mp;
            int maxv = 0;
            for (auto j: v[i]) {
                mp[j]++;
                cmax(maxv, mp[j]);
            }
            ans += sz(v[i]) - maxv;
        }
    }
    cout << ans << endl;

    return 0;
}

Comments

  1. 1 week ago
    2025-12-06 2:22:54

    Hey guys, just tried out fortunesnakebr and gotta say, it’s pretty rad! Smooth interface and the gameplay is on point. Definitely worth checking out if you’re looking for something new. Check it out here: fortunesnakebr

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next