专栏文章
题解:P11458 [USACO24DEC] All Pairs Similarity P
P11458题解参与者 13已保存评论 13
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @miqnwcc7
- 此快照首次捕获于
- 2025/12/04 07:52 3 个月前
- 此快照最后确认于
- 2025/12/04 07:52 3 个月前
来点神秘做法。
首先有 。每个位置的答案就是 。两部分可以用差不多的方法算,这里就只考虑第一部分。
如果求所有 的和,显然可以将出现次数数组和自己做 FWT。然后考虑把一边看作常数,另一边每个位置对答案的贡献是一个常数(也就是把转移画成 DAG 的形式,每条边有一个常数边权,这个就是所有路径权值积的和),然后发现我们要求的就是这个。
然后统计路径权值和正着和倒着是一样的,所以我们把这个 FWT 整个倒过来写就行了。时间复杂度 。
CPPcin>>n>>k;
rep(i,1,n)cin>>a[i],++cnt[a[i]];
repn(S,1<<k)if(S)f[S]=Z(1)/popcnt(S);
repn(i,k)repn(S,1<<k)if(S>>i&1)f[S^(1<<i)]-=f[S];
repn(S,1<<k)scnt[S]=cnt[S],ssum[S]=cnt[S]*popcnt(S);
repn(i,k)repn(S,1<<k)if(S>>i&1)scnt[S]+=scnt[S^(1<<i)],ssum[S]+=ssum[S^(1<<i)];
repn(S,1<<k)g[S]=f[S]*ssum[S],f[S]*=scnt[S];
repn(i,k)repn(S,1<<k)if(S>>i&1)f[S^(1<<i)]+=f[S],g[S^(1<<i)]+=g[S];
repn(S,1<<k)res[S]=f[S]*popcnt(S)+g[S]-n;
rep(i,1,n)cout<<res[a[i]].val()<<'\n';
相关推荐
评论
共 13 条评论,欢迎与作者交流。
正在加载评论...