[CSP-S模拟测试]:糊涂图(概率DP)
题目传送门(内部题76)
输入格式
第一行输入三个空格隔开的整数$n,m,s$表示随机加一条边之前的糊涂图的点数,边数,以及起点的编号。
接下来$m$行,每行两个空格隔开的整数$a,b$表示从$a$到$b$有一条有向边。保证$a<b$,但可能存在重复的边。
最后两个空格隔开的数字$Max,Avr$。如果$Max!=-1$,那么$Max$就是第一个问题的答案(三位小数),选手在输出的时候把$Max$直接输出就可以了。否则,如果$Max=-1$,说明没有给出第一个问题的答案,选手需要自己计算。$Avr$的作用相同,在$Avr!=-1$的时候给出第二个问题的答案(三位小数)。不会出现$Max$和$Avr$都不为$-1$的情况。
输出格式
一行两个空格隔开的小数(保留三位),表示$liu\text{_}runda$的最大获胜概率和平均获胜概率。
样例
见下发文件
数据范围与提示
对全部的测试点,$n\leqslant 10^5,m\leqslant 3\times 10^5$,$Max$和$Avr$不会同时不等于$-1$
第$1$个测试点,$m=0,Avr!=-1,Max=-1$
第$2$个测试点,$m=0,Avr=-1,Max=-1$
第$3,4$个测试点,$m=1,Avr=-1,Max=-1$
第$5,6,7,8$个测试点,$n\leqslant 100,m\leqslant 300,Avr=-1,Max=-1$
第$9,10,11$个测试点,$Avr!=-1,Max=-1$,也就是说需要自己求$Max$
第$12,13,14$个测试点,$Max!=-1,Avr=-1$,也就是说需要自己求$Avr$
第$15,16,17,18,19,20$个测试点,$Avr=-1,Max=-1$
其中还有一些测试点具有较特殊的性质:
第$5,15,16$个测试点还满足,$m=n-1$且对任意满足$2\leqslant i\leqslant n$的$i$,存在一条从$i-1$到$i$的有向边,也就是说图的形状是一条链
第$9,12,17$个测试点还满足,$m\leqslant 100$
题解
显然是一道树上概率$DP$,然后就不会了……
可以知道,如果到不能走走了奇数条边,那么$liu\text{_}runda$获胜;否则失败。
不妨做如下定义:
$\alpha.f[i]$表示从$i$号点出发经过奇数条边之后停止的概率。
$\beta,g[i]$表示在原来的图中从$s$出发经过$i$的概率。
$\gamma.h[i]$表示从$s$出发随机行走没有经过$i$的概率。
$\delta.p0[i]$表示从$s$出发经过$i$且经过偶数条边的概率。
$\epsilon.p1[i]$表示从$s$出发经过$i$且经过奇数条边的概率。
$\zeta.Q[i]$表示$liu\text{_}runda$从$i$出发获胜的概率。
考虑求出$f$数组。
对于$f[i]$,没有出度的点$f[x]=0$,直接递推求出其它点即可。
考虑加边之后对胜率的影响,不妨设这条边从$u$到$v$,则原来走的时候可能根本不会经过$u$,那么对于这种情况,其对答案没有影响。
考虑求出$g$数组。
起点固定为$s$,可以对于每个点递推$x$求出在原来的图上从$s$出发经过点$i$的概率概率,$g[s]=1$。
考虑求出$p0[i]$和$p1[i]$,$p0[s]=1,p1[s]=0$,递推其可得到其它值。
考虑求出$h$数组。
现在再考虑有加边的情况,可以再将其细分为两种情况:
$\alpha.$从$s$出发随机行走经过了$i$。
$\beta.$从$s$出发随机行走没有经过$i$。
那么我们可以知道:
$$f[s]=p0[i]\times f[i]+p1[i]\times (1-f[i])+(1-p0[i]-p1[i])\times h[i]$$
加边之后对胜率的影响只影响了从$u$出发的概率,也就是只影响了$p0[u]\times f[u]+p1[u]\times (1-f[u])$。
再来考虑加边的影响,假设点$u$原来的出度为$k$,那么现在从$u$出发走这条加边的概率就是$\frac{1}{k+1}$。
因为这条加边在走过之后就会被删除,也就是恢复了原图的状态。
那么如果$liu\text{_}runda$从$u$出发,那么其胜率即为:
$$\frac{1}{k+1}\times (1-f[v])+\frac{k}{k+1}\times f[v]$$
反之同理。
所以答案就是
$$ans=p0[i]\times Q[i]+p1[i]\times (1-Q[i])+(1-p0[i]-p1[i])\times h[i]$$
式中$Q[i]$在上面已经求出,即为
$$Q[i]=\frac{1}{k+1}\times (1-f[i])+\frac{k}{k+1}\times f[i]$$
而$(1-p0[i]-p1[i])\times h[i]$则可以根据之前的$f[s]=p0[i]\times f[i]+p1[i]\times (1-f[i])(1-p0[i]-p1[i])\times h[i]$求出。
剩下的就是化简式子了,在此不再赘述。
时间复杂度:$\Theta(n+m)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{int nxt,to;}e[300001];
int head[100001],cnt;
int n,m,s;
double MA,AV;
double f[100001],p[2][100001],h[100001],du[100001],sum,maxn,minn=1000000000.0;
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);du[u]++;
}
p[0][s]=1;
for(int x=1;x<=n;x++)
for(int i=head[x];i;i=e[i].nxt)
{
p[0][e[i].to]+=p[1][x]/du[x];
p[1][e[i].to]+=p[0][x]/du[x];
}
for(int x=n;x;x--)
for(int i=head[x];i;i=e[i].nxt)
f[x]+=(1-f[e[i].to])/du[x];
for(int x=1;x<=n;x++)
{
maxn=max(f[x],maxn);
minn=min(f[x],minn);
sum+=1-f[x];
h[x]=f[s]-p[0][x]*f[x]-p[1][x]*(1-f[x]);
}
for(int i=1;i<=n;i++)
{
AV+=(p[1][i]+h[i])*(n-1)+(p[0][i]-p[1][i])*f[i]*du[i]*(n-1)/(du[i]+1)+(p[0][i]-p[1][i])*(sum+f[i]-1)/(du[i]+1);
double Q=(p[1][i]<p[0][i])?(1-minn)/(du[i]+1)+f[i]*du[i]/(du[i]+1):(1-maxn)/(du[i]+1)+f[i]*du[i]/(du[i]+1);
Q=p[0][i]*Q+p[1][i]*(1-Q)+h[i];
MA=max(MA,Q);
}
AV/=(double)n*(n-1);
printf("%.3lf %.3lf",MA,AV);
return 0;
}
rp++
[CSP-S模拟测试]:糊涂图(概率DP)的更多相关文章
- [CSP-S模拟测试]:玩具(概率DP)
题目描述 这个故事发生在很久以前,在$IcePrincess\text{_}1968$和$IcePrince\text{_}1968$都还在上幼儿园的时候. $IcePrince\text{_}196 ...
- [CSP-S模拟测试]:Seat(概率DP+数学)
题目描述 有$n+2$个座位等距地排成一排,从左到右编号为$0$至$n+1$.最开始时$0$号以及$n+1$号座位上已经坐了一个小$G$,接下来会有$n$个小$G$依次找一个空座位坐下.由于小$G$们 ...
- [CSP-S模拟测试]:B(期望DP)
题目传送门(内部题151) 输入格式 第一行一个整数$N$. 第二行$N$个整数,第$i$个为$a_i$. 输出格式 一行一个整数,表示答案.为避免精度误差,答案对$323232323$取模. 即设答 ...
- [CSP-S模拟测试]:超级树(DP)
题目传送门(内部题5) 输入格式 一行两个整数$k$.$mod$,意义见上. 输出格式 一行一个整数,代表答案. 样例 样例输入1: 2 100 样例输出1: 样例输入2: 3 1000 样例输出2: ...
- [CSP-S模拟测试]:w(树上DP)
题目背景 $\frac{1}{4}$遇到了一道水题,双完全不会做,于是去请教小$D$.小$D$看了${0.607}^2$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac ...
- [CSP-S模拟测试]:赤壁情(DP)
前赤壁赋 壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下.清风徐来,水波不兴.举酒属客,诵明月之诗,歌窈窕之章.少焉,月出于东山之上,徘徊于斗牛之间.白露横江,水光接天.纵一苇之所如,凌万顷之茫然.浩浩 ...
- [CSP-S模拟测试]:chemistry(期望DP+组合数学)
题目传送门(内部题27) 输入格式 第一行有$4$个整数$n,k,p,q$.第二行有$n$个整数$a_i$.接下来有$n-1$行,每行有两个整数$u,v$,表示$u$与$v$之间通过化学单键连接. 输 ...
- [CSP-S模拟测试]:走路(期望DP+分治消元)
题目传送门(内部题100) 输入格式 第一行两个整数$n,m$,接下来$m$行每行两个整数$u,v$表示一条$u$连向$v$的边.不保证没有重边和自环. 输出格式 $n-1$行每行一个整数,第$i$行 ...
- [CSP-S模拟测试]:密码(数位DP+库默尔定理)
题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...
随机推荐
- “EndExecuteNonQuery”方法没有任何重载采用“0”个参数
EndExecuteNonQuery需要参数IAsyncResult asyncResult myCmd.ExecuteNonQuery();//执行 ExecuteNonQuery 返回受影响行数
- 文件类型 | 命令ln | 软链接硬链接
1.9文件类型 1.9.1常见文件类型 d:目录 -:普通文件 l:链接文件 b:设备 1.9.2文件后缀名 sh:shell脚本 tar.gz:压缩包 my.cnf:配置文件 test.zip:压缩 ...
- 第八周作业总结&第六次实验报告
实验六 Java异常 实验目的 理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获方法. 实验要求 练习捕获异常.声明异常.抛出异常的方法.熟悉try和catch子句的使用. 掌握自定义异常类 ...
- 关于Pulsar与Kafka
在本系列的Pulsar和Kafka比较文章中,我将引导您完成我认为重要的几个领域,并且对于人们选择强大,高可用性,高性能的流式消息传递平台至关重要.消息传递模型(Messaging model)是用户 ...
- Eureka 源码分析之 Eureka Server
文章首发于公众号<程序员果果> 地址 : https://mp.weixin.qq.com/s/FfJrAGQuHyVrsedtbr0Ihw 简介 上一篇文章<Eureka 源码分析 ...
- django基础知识之认识MVT MVC??
MVT Django是一款python的web开发框架 与MVC有所不同,属于MVT框架 m表示model,负责与数据库交互 v表示view,是核心,负责接收请求.获取数据.返回结果(相当于mvc的c ...
- 使用英特尔® 驱动程序和支持助理更新英特尔®固态盘数据中心工具(英特尔®固态盘 DCT)后仍旧提示更新
再regedit中搜索原始版本,位于计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{82F015 ...
- 当页面完全加载完成后执行一个JS函数
方法1.如下程序,当页面完全加载后执行openTheIndexPage()方法 <html> <head> <meta http-equiv="Conte ...
- Django之modles 多对多创建第三张表
一.第一种:纯自动创建第三张表 纯自动 class Book(models.Model): title = models.CharField(max_length=32) price = models ...
- cookie,localStorage和sessionStorage
一.Cookie Cookie 是小甜饼的意思.cookie 非常小,它的大小限制为4KB左右.它的主要用途有保存登录信息,比如你登录某个网站市场可以看到“记住密码”,这通常就是通过在 Cookie ...