提出 #34665160


ソースコード 拡げる

#include <bits/stdc++.h>
#include <atcoder/modint>
#include <atcoder/dsu>
using mint = atcoder::modint998244353;
using namespace std;

#define rep(i,a,n) for (int i=a;i<(int)n;i++)
int read(){int r;scanf("%d",&r);return r;}

int k;
vector<vector<int>> to; // to[树的节点] = vector<叶子节点>
vector<mint> merge(const vector<mint>& d, const vector<mint>& e) { // 就暴力merge, 卷积
  vector<mint> dp(d.size() + e.size() - 1);
  rep(i,0,d.size())rep(j,0,e.size()) dp[i+j] += d[i]*e[j];
  if ((int)dp.size() > k+1) dp.resize(k+1);
  return dp;
};

vector<mint> dfs (int v) { // 树节点v
  vector<mint> dp = {1,0}; // dp[i]:  <=i-1次不行,i次才行的染色集合方案数, 可以写成{1,0}后面需要加 if(dp.size() == 1) dp.resize(2);,这里丢个0, 省去resize
  for (int u : to[v]) dp = merge(dfs(u),dp);
  int c = to[v].size(); // 子节点个数
  if (c != 0 && c < (int)dp.size()) dp[c] -= 1; // 每个子节点选一次, 全部染色的情况
  dp[1] += 1; // 直接染v
  return dp;
};

int top[100010]; // top[并查集根] = to上树的节点

int main() {
  int n = read();
  int m = read();
  k = read();
  map<int,vector<pair<int,int> >> mp;
  rep(i,0,m) {
    int a = read()-1;
    int b = read()-1;
    int c = read();
    mp[c].push_back({a,b});
  }
  to.resize(n);
  iota(top,top+n,0); // 初始每个根是自己 top[i] = i
  vector<bool> root(n,true); // 是否是树上目前的根节点

  // 建树
  atcoder::dsu t(n); // 并查集
  for (auto [_,es] : mp) { // 边从小到大
    set<int> st; // 哪些根是这轮合并的
    for (auto [a,b] : es) {
      a = t.leader(a); // 并查集根
      b = t.leader(b);
      if (a == b) continue;
      t.merge(a,b); // 合并 并查集
      st.insert(a);
      st.insert(b);
    }
    for (int v : st) if(v == t.leader(v)){ // 找到每组内部的根
      root[top[v]] = false; // top[v] 不再是根
      to.push_back(vector<int>(1,top[v])); // 新节点[] -> 树上叶子节点
      root.push_back(true); // root[to.size()-1] = true, 和to的sz一致
      top[v] = to.size()-1; // v的目前对应树上节点
    }
    for (int v : st) if(v != t.leader(v)){ // 非根的部分
      int p = t.leader(v); // p 是并查集跟
      root[top[v]] = false; // v不再是树根
      to[top[p]].push_back(top[v]); // 树节点指向vector<子节点>
    }
  }
  // dp on tree
  vector<mint> dp = {1};
  rep(i,0,root.size()) if (root[i]) dp = merge(dp,dfs(i));
  mint ans;
  rep(i,0,dp.size()) ans += dp[i];
  printf("%d\n",ans.val());
  return 0;
}

提出情報

提出日時
問題 Ex - Painting Weighted Graph
ユーザ cromarmot
言語 C++ (GCC 9.2.1)
得点 600
コード長 2541 Byte
結果 AC
実行時間 475 ms
メモリ 40164 KiB

コンパイルエラー

./Main.cpp: In function ‘int read()’:
./Main.cpp:8:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    8 | int read(){int r;scanf("%d",&r);return r;}
      |                  ~~~~~^~~~~~~~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 3
AC × 35
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt
All hand_01.txt, hand_02.txt, hand_03.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, random_24.txt, random_25.txt, random_26.txt, random_27.txt, random_28.txt, random_29.txt, sample_01.txt, sample_02.txt, sample_03.txt
ケース名 結果 実行時間 メモリ
hand_01.txt AC 7 ms 3608 KiB
hand_02.txt AC 2 ms 3708 KiB
hand_03.txt AC 52 ms 6320 KiB
random_01.txt AC 324 ms 23016 KiB
random_02.txt AC 174 ms 19324 KiB
random_03.txt AC 303 ms 13208 KiB
random_04.txt AC 183 ms 9220 KiB
random_05.txt AC 475 ms 40020 KiB
random_06.txt AC 321 ms 22912 KiB
random_07.txt AC 20 ms 4584 KiB
random_08.txt AC 301 ms 13308 KiB
random_09.txt AC 33 ms 4408 KiB
random_10.txt AC 473 ms 40164 KiB
random_11.txt AC 60 ms 12484 KiB
random_12.txt AC 46 ms 10096 KiB
random_13.txt AC 29 ms 4580 KiB
random_14.txt AC 2 ms 3708 KiB
random_15.txt AC 323 ms 23560 KiB
random_16.txt AC 148 ms 19588 KiB
random_17.txt AC 280 ms 12604 KiB
random_18.txt AC 172 ms 9080 KiB
random_19.txt AC 261 ms 12132 KiB
random_20.txt AC 131 ms 11416 KiB
random_21.txt AC 2 ms 3788 KiB
random_22.txt AC 4 ms 3800 KiB
random_23.txt AC 202 ms 8640 KiB
random_24.txt AC 126 ms 11992 KiB
random_25.txt AC 60 ms 12720 KiB
random_26.txt AC 50 ms 10936 KiB
random_27.txt AC 26 ms 4332 KiB
random_28.txt AC 36 ms 4912 KiB
random_29.txt AC 39 ms 9684 KiB
sample_01.txt AC 2 ms 3704 KiB
sample_02.txt AC 2 ms 3664 KiB
sample_03.txt AC 2 ms 3624 KiB