提出 #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;
}
提出情報
コンパイルエラー
./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 |
結果 |
|
|
セット名 |
テストケース |
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 |