結果
問題 | No.2494 Sum within Components |
ユーザー |
![]() |
提出日時 | 2023-10-08 16:52:36 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 63 ms / 2,000 ms |
コード長 | 2,656 bytes |
コンパイル時間 | 416 ms |
コンパイル使用メモリ | 54,868 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-26 18:08:59 |
合計ジャッジ時間 | 1,619 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 |
ソースコード
/* -*- coding: utf-8 -*-** 2494.cc: No.2494 Sum within Components - yukicoder*/#include<cstdio>#include<vector>#include<algorithm>using namespace std;/* constant */const int MAX_N = 200000;const int MOD = 998244353;/* typedef */template<const int MOD>struct MI {int v;MI(): v() {}MI(int _v): v(_v % MOD) {}MI(long long _v): v(_v % MOD) {}MI operator+(const MI m) const { return MI(v + m.v); }MI operator-(const MI m) const { return MI(v + MOD - m.v); }MI operator*(const MI m) const { return MI((long long)v * m.v); }MI &operator+=(const MI m) { return (*this = *this + m); }MI &operator-=(const MI m) { return (*this = *this - m); }MI &operator*=(const MI m) { return (*this = *this * m); }bool operator==(const MI m) const { return v == m.v; }bool operator!=(const MI m) const { return v != m.v; }MI pow(int n) const { // a^n % MODMI pm = 1, a = *this;while (n > 0) {if (n & 1) pm *= a;a *= a;n >>= 1;}return pm;}MI inv() const { return pow(MOD - 2); }MI operator/(const MI m) const { return *this * m.inv(); }MI &operator/=(const MI m) { return (*this = *this / m); }};typedef MI<MOD> mi;struct UFT {vector<int> links, ranks, sizes;UFT() {}void init(int n) {links.resize(n);for (int i = 0; i < n; i++) links[i] = i;ranks.assign(n, 1);sizes.assign(n, 1);}int root(int i) {int i0 = i;while (links[i0] != i0) i0 = links[i0];return (links[i] = i0);}int rank(int i) { return ranks[root(i)]; }int size(int i) { return sizes[root(i)]; }bool same(int i, int j) { return root(i) == root(j); }int merge(int i0, int i1) {int r0 = root(i0), r1 = root(i1), mr;if (r0 == r1) return r0;if (ranks[r0] == ranks[r1]) {links[r1] = r0;sizes[r0] += sizes[r1];ranks[r0]++;mr = r0;}else if (ranks[r0] > ranks[r1]) {links[r1] = r0;sizes[r0] += sizes[r1];mr = r0;}else {links[r0] = r1;sizes[r1] += sizes[r0];mr = r1;}return mr;}};/* global variables */mi as[MAX_N];UFT uft;/* subroutines *//* main */int main() {int n, m;scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) scanf("%d", &(as[i].v));uft.init(n);for (int i = 0; i < m; i++) {int u, v;scanf("%d%d", &u, &v);u--, v--;if (! uft.same(u, v)) {mi sum = as[uft.root(u)] + as[uft.root(v)];int r = uft.merge(u, v);as[r] = sum;}}mi p = 1;for (int u = 0; u < n; u++) p *= as[uft.root(u)];printf("%d\n", p.v);return 0;}