Dist
### Description
数据范围:\(1<=n<=10^5,1<=k<=18,1<=k_i<=10^7,\sum |s_i|<=3*10^5\)
Solution
因为\(k\)比较小所以显然是拿\(k\)来搞事
比较简单粗暴的想法是,我们直接预处理出每个完全图中的一个点(好吧其实就是团==)到其他的完全图中一个点的最短距离,然后用这个东西来计算两个点之间的最短路就方便很多了
首先可以用一个\(mp[i][j]\)表示团\(i\)到团\(j\)的最短距离,这个数组在初始化的话直枚举每个节点,然后任选这个点所在团中的两个,取两个团的边权的最小值作为直接连接这两个团的距离,也就是初始的\(mp[i][j]\),然后floyd一下就得到完整的\(mp\)数组了
接下来考虑怎么用这个玩意计算两个节点的最短路
考虑固定一个起点\(x\),我们要计算\(x\)到其他点的最短路,我们可以先用预处理出的\(mp\)数组算出\(x\)到任意一个团\(j\)中的一个点(非\(x\))的最短路,记\(dis[j]\),具体一点的话就是枚举\(x\)先走一步到团\(i\)与团\(j\)的最短路的起点,然后直接走最短路到团\(j\)中某个节点,也就是\(min(k[i]+mp[i][j])\)
然后\(x\)到\(y\)的最短路一定是\(y\)所属的团的\(dis\)值的最小值,所以我们考虑将\(dis\)排序,从小到大计算贡献,当前团\(j\)的贡献应该就是\(dis[j]\)乘上当前团中没有被前面的团所包含的节点的数量
现在考虑这个数量怎么计算
因为\(k\)比较小,所以我们可以把当前已经考虑完的团具体是哪些给压成一个二进制数\(nowst\)(为\(1\)表示还没有考虑),每一个原图中的节点\(x\)所属的团也压成一个二进制数\(st[x]\),如果说当前考虑的团中包含的一个节点\(x\)满足\(st[x]|nowst=nowst\),那么说明这个节点不属于前面考虑的任何一个团,即有\(1\)的贡献,所以现在的问题就变成了对于每一个团\(i\)我们要预处理一个\(cnt[i][j]\)表示该团满足\(st[x]|j=j\)的节点\(x\)有多少个,这个东西的计算。。跟某fwt题里面的操作一样
然后我们只要枚举固定的起点\(x\)然后按照上面的步骤计算贡献就ok了
需要注意的是每次计算贡献的时候因为我们的\(dis\)处理出来的是\(x\)走到另外一个点的距离,也就是意味着我们在算的时候会把\(x\)到\(x\)的距离算成\(x\)走到排序后第一个团中某个其他节点的距离,所以需要判一下(减掉就好了),以及最后的答案要除以\(2\)(因为每条边算了\(2\)次)
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e5+10,ST=(1<<18)+10;
const ll inf=1LL<<60;
ll mp[20][20];
int rec[20][N],cnt[20][ST],w[20];
ll dis[20];
int st[N],ord[N];
int n,m;
ll ans;
int St(int x){return 1<<x-1;}
int in(int st,int x){return st>>x-1&1;}
void prework(){
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
if (!in(st[i],j)) continue;
++cnt[j][st[i]];
for (int k=1;k<=m;++k)
if (in(st[i],k))
mp[j][k]=min(mp[j][k],1LL*w[k]);
}
}
for (int k=1;k<=m;++k)
for (int i=1;i<=m;++i){
if (i==k||mp[i][k]==inf) continue;
for (int j=1;j<=m;++j){
if (j==k||j==i||mp[k][j]==inf) continue;
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
for (int i=1;i<=m;++i)
for (int j=0;j<m;++j)
for (int k=0;k<1<<m;++k)
if (!(k>>j&1))
cnt[i][k|(1<<j)]+=cnt[i][k];
}
bool cmp(int x,int y){return dis[x]<dis[y];}
void solve(){
ll tmp;
int nowst;
for (int x=1;x<=n;++x){
for (int i=1;i<=m;++i) dis[i]=inf,ord[i]=i;
for (int i=1;i<=m;++i){
if (!in(st[x],i)) continue;
for (int j=1;j<=m;++j)
dis[j]=min(dis[j],mp[i][j]+w[i]);
}
sort(ord+1,ord+1+m,cmp);
nowst=(1<<m)-1;
tmp=-dis[ord[1]];
for (int i=1;i<=m;++i){
tmp+=dis[ord[i]]*cnt[ord[i]][nowst];
nowst^=St(ord[i]);
}
ans+=tmp;
}
printf("%lld\n",ans/2);
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x;
scanf("%d%d",&n,&m);
for (int i=1;i<=m;++i){
for (int j=1;j<=m;++j) mp[i][j]=i==j?0:inf;
scanf("%d%d",&w[i],&rec[i][0]);
for (int j=1;j<=rec[i][0];++j){
scanf("%d",&x);
rec[i][j]=x;
st[x]|=St(i);
}
}
prework();
solve();
}
Dist的更多相关文章
- Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (dist) on project hadoop-kms: An Ant BuildException has occured
编译cdh版hadoop2.5.0出现的问题 系统: CentOs66 64位 JDK:1.7 Maven: 3.0.5 Protobuf: libprotoc 2.5.0 编译命令: mvn pac ...
- Spring官网下载dist.zip的几种方法
Spring官网下载dist.zip的几种方法 Spring官网改版后,很多项目的完整zip包下载链接已经隐掉了,虽然Spring旨在引导大家用更“高大上”的maven方式来管理所依赖的jar包, ...
- Excel 使用CHIINV函数和GAMMA.DIST函数绘制卡方分布
1.使用CHIINV(概率,自由度),在Excel中绘制卡方分布. 若n个独立的随机变量均服从标准正态分布,则这n个随机变量的平方和构成一新的随机变量,其分布规律称为服从自由度为ν 的χ2分布. 2. ...
- 官网下载Spring dist
新版Spring官网下载Spring的dist可真是麻烦 跟着下面的贴图走吧,有些在网页的下面,需要打开相应页面后往下拉拉. 下载完后解压lib里面就是各种jar包了 真是麻烦啊,不好找,不过Spri ...
- 每R一点:层次聚类分析实例实战-dist、hclust、heatmap等(转)
聚类分析:对样品或指标进行分类的一种分析方法,依据样本和指标已知特性进行分类.本节主要介绍层次聚类分析,一共包括3个部分,每个部分包括一个具体实战例子. 1.常规聚类过程: 一.首先用dist()函数 ...
- express整合webpack的打包文件dist
对于我来说,第一次接触前后端整合问题的小白,刚开始是一脸懵逼,这个问题整整坑了我一个晚上加一个早上,现在写出来总结: 前端开发:vue-cli+webpack: 后台开发:nodejs框架expres ...
- make、make clean、make install、make uninstall、make dist、make distcheck和make distclean
Makefile在符合GNU Makefiel惯例的Makefile中,包含了一些基本的预先定义的操作:make根据Makefile编译源代码,连接,生成目标文件,可执行文件.make clean清除 ...
- vue项目通过webpack打包生成的dist文件放到express环境里运行(vue+webpack+express)
1.首先需要的原料肯定是vue打包生成的dist文件 在vue项目目录下运行:npm run build,等待运行结束,会在项目目录下生成一个dist文件夹,里面会生成一些文件(如下图示) 小的项目文 ...
- 关于Vue修改默认的build文件存放的dist路径
原文地址:http://www.cnblogs.com/JimmyBright/p/7681086.html Vue默认build路径是项目的dist目录下,有时候我们可能希望build之后的文件自动 ...
- jzoj6099. 【GDOI2019模拟2019.4.1】Dist
题目链接:https://jzoj.net/senior/#main/show/6099 考虑直接统计某个点到其它所有点的距离和 我们先把整个团当成一个点建图,处理出任意两个团之间的距离\(dis(i ...
随机推荐
- 2017-2018-2 『网络对抗技术』Exp2:后门原理与实践
1. 后门原理与实践实验说明及预备知识 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用socat获取主机操作Shell, 任务计划启动 (0.5 ...
- [清华集训2015 Day1]主旋律-[状压dp+容斥]
Description Solution f[i]表示状态i所代表的点构成的强连通图方案数. g[i]表示状态i所代表的的点形成奇数个强连通图的方案数-偶数个强连通图的方案数. g是用来容斥的. 先用 ...
- 【第六课】Nginx常用配置下详解
目录 Nginx常用配置下详解 1.Nginx虚拟主机 2.部署wordpress开源博客 3.部署discuz开源论坛 4.域名重定向 5.Nginx用户认证 6.Nginx访问日志配置 7.Ngi ...
- 洛咕 P2336 [SCOI2012]喵星球上的点名
洛咕 P2336 [SCOI2012]喵星球上的点名 先求出SA和height,一个点名串对应的就是一段区间,还有很多个点,就转化成了 有很多个区间,很多个点集,对每个区间计算和多少个点集有交,对每个 ...
- 移动webapp的那些令你头疼的事
bug持续更新中... 测试浏览器 Chrome: 61.0.3163.73 Safari: 10.0(IOS 10.3.3) Github: webapp-bugs 1. IOS overflow: ...
- linux chroot 命令
chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以 /,即以根 (root) 开始的.而在使用 chroot 之后 ...
- VMware下三种网络连接模式介绍
birdged(桥接) 桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,那么物理网卡和虚拟网卡就相当于处于同一个网段,虚拟交换机就相当于 ...
- DRF02
1. 视图 Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据) 控制数据库查询的执行 1.1. 请求与响应 1.1.1 Request RES ...
- PAT-1045. Favorite Color Stripe (30)-LIS
将Eva喜欢的颜色按顺序编个优先级, 2 3 1 5 6-> 1 2 3 4 5 然后读取stripe,将Eva不喜欢的先剔除掉,剩下的颜色替换为相应的优先级 2 2 4(去掉) 1 5 5 6 ...
- Alpha 贡献分及转会人员确定
贡献分如下: 转会人员:金东禾 转到队伍:bugphobia