Codeforces 553E Kyoya and Train
题目大意
链接:CF533E
给一张\(n\)个点,\(m\)条边的图,起点\(1\)终点\(n\),如果不能在\(T\)的时间内到达则需支付\(X\)的代价。
走每条边都会支付一定代价,经过一条边\(i\)的时间有\(p_{i,j}\)的概率为\(j\),最小化期望代价。
题目分析
暴力方法:期望DP
设\(f_{i,j}\)表示在第\(j\)时刻,从\(i\)点出发,到达终点的期望花费,
设边为\(e\),边上两点为\(x,y\),边集为\(E\),则有
\]
时间复杂度\(O(n\cdot T^2)\)。
或许你会觉得这样转移有问题,因为这不是一个DAG图,
但是,由于没有负权环,一个点不可能回到它的祖先,所以我们可以当做DAG来处理。
现在想想怎么优化这个DP。
我们设\(g_{e,t}\)表示\(\sum\limits_{i=1}^Tp_{e,i}\cdot f(y,t+i)\),显然有
\]
我们可以利用分治。
如果要求出\(l\leq t\leq r\)的所有\(f(x,t)\)和\(g(e,t)\),不妨设\(mid=l+r>>1\),
先求出\(mid<t\leq r\)的\(f\),并用这些\(f\)去更新\(l\leq t\leq mid\)的\(g\),然后递归下去即可。
(方法co自这位大佬的博客)
对于\(g(e,t)\),我们可以考虑把它化为卷积的形式进行更新。
令\(mid=mid+1\),对于\(g(e,mid-1)\),我们有\(g(e,mid-1)+=\sum\limits_{i=0}^{r-mid+1}p_{e,i+1}\cdot f(e,mid+i)\)
我们把\(f\)数组反转,\(g(e,mid-1)+=\sum\limits_{i=0}^{r-mid+1}p_{e,i+1}\cdot f(e,r-i)\)。
在映射一下:\(g(e,mid-1)+=\sum\limits_{i=0}^{r-mid+1}p^{\prime}_{e,i}\cdot f^\prime(e,r-mid-i)\)。
即:\(g(e,mid-x)+=\sum\limits_{i=0}^{r-mid+1}p^{\prime}_{e,i}\cdot f^\prime(e,r-(mid-x)-i-1)\)
用\(ans(r-(mid-x)-1)\)来更新\(g(mid-x)\),即用\(ans(r-t-1)\)来更新\(g(t)\)。
代码实现
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#define MAXN 1<<30
typedef long long LL;
const int N=100005;
using namespace std;
inline int Getint(){register int x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;}
const double pi=acos(-1);
struct Z{
double r,i;
Z(double _r=0,double _i=0){r=_r,i=_i;}
Z operator + (const Z &a)const{return Z(r+a.r,i+a.i);}
Z operator - (const Z &a)const{return Z(r-a.r,i-a.i);}
Z operator * (const Z &a)const{return Z(r*a.r-i*a.i,r*a.i+i*a.r);}
Z operator / (const double &a)const{return Z(r/a,i/a);}
Z operator /= (const double &a) {return *this=Z(r/a,i/a);}
};
void FFT(Z *a,int x,int K){
static int rev[N],lst;
int n=1<<x;
if(n!=lst){
for(int i=0;i<n;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<x-1);
lst=n;
}
for(int i=0;i<n;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=1;i<n;i<<=1){
int tmp=i<<1;
Z wn(cos(pi/i),sin(pi*K/i));
for(int j=0;j<n;j+=tmp){
Z w(1,0);
for(int k=0;k<i;k++,w=w*wn){
Z x=a[j+k],y=w*a[i+j+k];
a[j+k]=x+y,a[i+j+k]=x-y;
}
}
}
if(K==-1)for(int i=0;i<n;i++)a[i]/=n;
}
Z a[N],b[N];
int n,m,T,X;
double p[105][20005];
struct node{int x,y,z;}s[105];
double mp[55][55],f[55][N],g[105][N];
void Floyd(){
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
void Cal(int l,int mid,int r){
int len=r-l;
for(int j=1;j<=m;j++){
int x=ceil(log2(len+r-mid));
fill(a,a+(1<<x),0),fill(b,b+(1<<x),0);
for(int i=0;i<r-mid+1;i++)a[i].r=f[s[j].y][r-i];
for(int i=0,lim=min(T,len);i<lim;i++)b[i].r=p[j][i+1];
FFT(a,x,1),FFT(b,x,1);
for(int i=0;i<(1<<x);i++)a[i]=a[i]*b[i];
FFT(a,x,-1);
for(int i=mid-1;i>=l;i--)g[j][i]+=a[r-i-1].r;
}
}
void Binary(int l,int r){
if(l==r){
for(int i=1;i<=m;i++)
f[s[i].x][l]=min(f[s[i].x][l],s[i].z+g[i][l]);
return;
}
int mid=l+r>>1;
Binary(mid+1,r);
Cal(l,mid+1,r);
Binary(l,mid);
}
int main(){
n=Getint(),m=Getint(),T=Getint(),X=Getint();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i^j)mp[i][j]=MAXN;
for(int i=1;i<=m;i++){
int x=Getint(),y=Getint(),z=Getint();
s[i]=(node){x,y,z};
mp[x][y]=min(mp[x][y],1.0*z);
for(int j=1;j<=T;j++)p[i][j]=(double)Getint()/100000;
}
Floyd();
for(int j=T+1;j<=2*T;j++)f[n][j]=X;
for(int i=1;i<n;i++){
for(int j=0;j<=T;j++)f[i][j]=MAXN;
for(int j=T+1;j<=2*T;j++)f[i][j]=X+mp[i][n];
}
Cal(1,T+1,2*T);
Binary(0,T);
printf("%.6f",f[1][0]);
return 0;
}
Codeforces 553E Kyoya and Train的更多相关文章
- [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)
[Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...
- CodeForces 553E Kyoya and Train 动态规划 多项式 FFT 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8847145.html 题目传送门 - CodeForces 553E 题意 一个有$n$个节点$m$条边的有向图 ...
- ●codeforces 553E Kyoya and Train
题链: http://codeforces.com/problemset/problem/623/E 题解: FFT,DP 题意: 一个有向图,给出每条边的起点u,终点v,费用c,以及花费每种时间的概 ...
- CF 553E Kyoya and Train
题目分析 期望\(\text{dp}\). 设\(f_{i,j}\)表示在第\(j\)个时刻从\(i\)点出发,到达终点的期望花费. 有转移方程: \[ f_{x,t}=\min_{(x,y)\in ...
- 【codeforces 553E】 Kyoya and Train
http://codeforces.com/problemset/problem/553/E (题目链接) 艹尼玛,CF还卡劳资常数w(゚Д゚)w!!系统complex被卡TLE了T_T,劳资写了一天 ...
- 【CF553E】Kyoya and Train 最短路+cdq分治+FFT
[CF553E]Kyoya and Train 题意:有一张$n$个点到$m$条边的有向图,经过第i条边要花$c_i$元钱,经过第i条边有$p_{i,k}$的概率要耗时k分钟.你想从1走到n,但是如果 ...
- Codeforces A. Kyoya and Colored Balls(分步组合)
题目描述: Kyoya and Colored Balls time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- CF553E Kyoya and Train
Kyoya and Train 一个有\(n\)个节点\(m\)条边的有向图,每条边连接了\(a_i\)和\(b_i\),花费为\(c_i\). 每次经过某一条边就要花费该边的\(c_i\). 第\( ...
- codeforces 553A . Kyoya and Colored Balls 组合数学
Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are ...
随机推荐
- dubbo入门之异步调用
dubbo默认使用同步的方式调用.但在有些特殊的场景下,我们可能希望异步调用dubbo接口,从而避免不必要的等待时间,这时候我们就需要用到异步.那么dubbo的异步是如何实现的呢?下面就来看看这个问题 ...
- sublime的安装与使用
1.sublime简介 Sublime是一个代码编辑器,可以编写HTML,php,js,css等文件. Sublime是由程序员Jon Skinner于2008年1月份所开发出来,它最初被设计为一个具 ...
- Ruby 类和对象
Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...
- NX二次开发-将工程图视图+尺寸的最大边界导出图片
/***************************************************************************** ** ** ExportPicture.c ...
- 其它课程中的python---1、python基础
其它课程中的python---1.python基础 一.总结 一句话总结: 可以先把视频平台搭起来,这样学习效率会高很多,而且有额外收益 1.python的优势有哪些? 一个广泛的标准库 扩展性:比如 ...
- Linux_磁盘分区、挂载、查看
一.挂载 1.查看设备的挂载情况 lsblk或lsblk -f 2.挂载 需求 :给我们的Linux系统增加一个新的硬盘,并且挂载到/home/newdisk 说明:我们以增加一块硬盘为例来熟悉一下磁 ...
- idea不断提示=========>This file is indented with tabs instead of 4 spaces
file->other settings ->default settings
- Redis基于主从复制的RCE(redis4.x 5.x)复现
使用docker建立redis 拉取镜像 运行 查看 可以连接,存在未授权 https://github.com/Ridter/redis-rce 发送poc i:正向连接 r:反弹 反弹成功
- 拾遗:{rpm、yum及源码方式管理软件包}
一.yum配置文件位置 /etc/yum.conf /etc/yum.repos.d/*.repo 二.yum常用命令 install pkgs reinstall pkgs update pkgs ...
- 如何在Spring Boot 中动态设定与执行定时任务
本篇文章的目的是记录并实现在Spring Boot中,动态设定与执行定时任务. 我的开发项目是 Maven 项目,所以首先需要在 pom.xml 文件中加入相关的依赖.依赖代码如下所示: <de ...