2019牛客暑期多校训练营(第六场) H:Train Driver (最短路+概率)
题意:给定无向图,Alice在A集合选一个点,Bob在B集合选一个点,CXK在全集里选择一个点。 然后问“三人到某一点集合打篮球的最小距离”的期望。
思路:做过一个裸题,就是给定三人位置,问去哪里集合距离代价最小。 那题就是三个点跑三次SPFA,就可以更新答案了。而此题有一个Cxk,非常的头疼,然而注意到边权为1,tm的不是直接BFS扩展就可以了吗。枚举Alice和Bob的位置,然后dis[i]=disA[i]+disB[j],然后就可以扩展了。 注意不要带log就可以过这题了,排序可以用基数排序,然后维护两个单调队列,每次取小的一个队首进行扩展。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
const int inf=1e9;
int disA[][maxn],disB[][maxn],a[maxn],b[maxn];
int Laxt[maxn],Next[maxn],To[maxn],cnt,N; ll sum;
void add(int u,int v)
{
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v;
}
void BFS(int dis[],int st)
{
rep(i,,N) dis[i]=inf; dis[st]=;
queue<int>q; q.push(st);
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=Laxt[u];i;i=Next[i]){
if(dis[To[i]]==inf){
dis[To[i]]=dis[u]+;
q.push(To[i]);
}
}
}
}
int num[maxn],c[maxn],dis[maxn];
void solve() //基数排序+两个单调队列
{
rep(i,,N+N) num[i]=;
rep(i,,N) num[dis[i]]++,d[i]=;
rep(i,,N+N) num[i]+=num[i-];
rep(i,,N) c[num[dis[i]]--]=i;
queue<int>q1,q2;
rep(i,,N) q1.push(c[i]);
while(!q1.empty()||!q2.empty()){
if(q2.empty()||(!q1.empty()&&!q2.empty()&&dis[q1.front()]<dis[q2.front()])) {
int u=q1.front(); q1.pop();
for(int i=Laxt[u];i;i=Next[i]) {
if(dis[To[i]]>dis[u]+) {
dis[To[i]]=dis[u]+;
q2.push(To[i]);
}
}
}
else {
int u=q2.front(); q2.pop();
for(int i=Laxt[u];i;i=Next[i]) {
if(dis[To[i]]>dis[u]+) {
dis[To[i]]=dis[u]+;
q2.push(To[i]);
}
}
}
}
rep(i,,N) sum+=dis[i];
}
int main()
{
int C=,T,M,A,B,u,v;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
rep(i,,N) Laxt[i]=; cnt=;
rep(i,,M){
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
scanf("%d",&A); rep(i,,A) scanf("%d",&a[i]);
scanf("%d",&B); rep(i,,B) scanf("%d",&b[i]);
rep(i,,A) BFS(disA[i],a[i]);
rep(i,,B) BFS(disB[i],b[i]);
sum=;
rep(i,,A)
rep(j,,B){
rep(k,,N) dis[k]=disA[i][k]+disB[j][k];
solve();
}
ll ans=1LL*A*B*N;
ll g=__gcd(ans,sum);
printf("Case #%d: ",++C);
if(g==sum) printf("%lld\n",sum/g);
else printf("%lld/%lld\n",sum/g,ans/g);
}
return ;
}
2019牛客暑期多校训练营(第六场) H:Train Driver (最短路+概率)的更多相关文章
- 2019牛客暑期多校训练营(第三场)H题目
题意:给你一个N×N的矩阵,求最大的子矩阵 满足子矩阵中最大值和最小值之差小于等于m. 思路:这题是求满足条件的最大子矩阵,毫无疑问要遍历所有矩阵,并判断矩阵是某满足这个条件,那么我们大致只要解决两个 ...
- 2019牛客暑期多校训练营(第六场)C - Palindrome Mouse (回文自动机)
https://ac.nowcoder.com/acm/contest/886/C 题意: 给出一个串A , 集合S里面为A串的回文字串 , 现在在集合S里面找出多少对(a,b),b为a的字串 分析: ...
- 2019牛客暑期多校训练营(第六场)J Upgrading Technology
传送门 题意: 就是给你n个技能,每个技能最高升到m级,每升一级就是耗费Cij钱,这个Cij可能是负的,如果所有技能都升到或者说超过j等级,就会获得Dj钱,这个Dj也有可能是负值,让你求你最多得到多少 ...
- 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)
题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9: 对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可. 后者mod=1e9,5才 ...
- 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...
- 2019牛客暑期多校训练营(第一场) B Integration (数学)
链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...
- 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...
- 2019牛客暑期多校训练营(第二场)F.Partition problem
链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...
- 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)
链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...
- [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem
链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
随机推荐
- c++篇 cad.grx 入门,手动配置编译环境
安装vs2010+sp1补丁; 安装浩辰2018(64位版本); 下载浩辰Grx开发的SDK,注意对应版本年份., 解压到E盘目录下, E:\grxsdk 在他们的官方用户群下载,搜sdk, 找到gr ...
- linux_权限小练习
下面是解释: 当前# root用户, ls列出列表 mkdir 新建目录 赋予目录744权限 对others来说是 r-- 只可读 touch 新建在目录下的同名文件 赋予文件600权限 ...
- TestNG入门——注解之Before/After
注解是java 5新增的功能,可使用于类,方法,变量,testNG包提供的注解功能请见下表 1.@BeforeSuite or @AfterSuite 被注解的方法,将在整个测试套件之前 or 之后 ...
- c++ 数值计算库Eigen
http://eigen.tuxfamily.org/index.php?title=Main_Page
- Sitecore 6.4 升级Sitecore 8.2.7准备
考虑Sitecore升级?尽管这可能是一项令人生畏的任务,但这三个技巧可以帮助您无缝地完成整个过程. 如果您当前正在运行较旧版本的Sitecore并希望升级到最新版本,那么您可能已经瞥了一眼说明,但却 ...
- scala 函数式编程之集合操作
Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的集合体系非常相似. ...
- react项目添加本地音频
<audio src="./res/audio/alarm.mp3" autoplay="autoplay" loop="loop" ...
- Prometheus 标签使用示例整合
Prometheus 监控实例 一.Prometheus 根据标签聚合总CPU使用率 1.主机添加标签(可在多个主机内添加相同标签实现聚合):vim prometheus.conf static_co ...
- 示例:在Nuget发布自己的包的步骤
原文:示例:在Nuget发布自己的包的步骤 一.目的:很多时候都在用第三方的Nuget包,现成的轮子可以减少很多工作量,同时我们也可以造轮子供自己和其他人使用,本示例主要演示如何发布dll到Nuget ...
- AD常用术语
SMD : Surface Mounted Devices 表面贴装器件 PAD 焊盘