题目大意

链接:CF533E

给一张\(n\)个点,\(m\)条边的图,起点\(1\)终点\(n\),如果不能在\(T\)的时间内到达则需支付\(X\)的代价。

走每条边都会支付一定代价,经过一条边\(i\)的时间有\(p_{i,j}\)的概率为\(j\),最小化期望代价。

题目分析

暴力方法:期望DP

设\(f_{i,j}\)表示在第\(j\)时刻,从\(i\)点出发,到达终点的期望花费,

设边为\(e\),边上两点为\(x,y\),边集为\(E\),则有

\[f(x,t)=\min\limits_{e\in E}\{val_{e}+\sum_{i=1}^Tp_{e,i}\cdot f(y,t+i)\}
\]

时间复杂度\(O(n\cdot T^2)\)。

或许你会觉得这样转移有问题,因为这不是一个DAG图,

但是,由于没有负权环,一个点不可能回到它的祖先,所以我们可以当做DAG来处理。


现在想想怎么优化这个DP。

我们设\(g_{e,t}\)表示\(\sum\limits_{i=1}^Tp_{e,i}\cdot f(y,t+i)\),显然有

\[f(x,t)=\min\{val_e+g(e,t)\}
\]

我们可以利用分治。

如果要求出\(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的更多相关文章

  1. [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)

    [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...

  2. CodeForces 553E Kyoya and Train 动态规划 多项式 FFT 分治

    原文链接http://www.cnblogs.com/zhouzhendong/p/8847145.html 题目传送门 - CodeForces 553E 题意 一个有$n$个节点$m$条边的有向图 ...

  3. ●codeforces 553E Kyoya and Train

    题链: http://codeforces.com/problemset/problem/623/E 题解: FFT,DP 题意: 一个有向图,给出每条边的起点u,终点v,费用c,以及花费每种时间的概 ...

  4. CF 553E Kyoya and Train

    题目分析 期望\(\text{dp}\). 设\(f_{i,j}\)表示在第\(j\)个时刻从\(i\)点出发,到达终点的期望花费. 有转移方程: \[ f_{x,t}=\min_{(x,y)\in ...

  5. 【codeforces 553E】 Kyoya and Train

    http://codeforces.com/problemset/problem/553/E (题目链接) 艹尼玛,CF还卡劳资常数w(゚Д゚)w!!系统complex被卡TLE了T_T,劳资写了一天 ...

  6. 【CF553E】Kyoya and Train 最短路+cdq分治+FFT

    [CF553E]Kyoya and Train 题意:有一张$n$个点到$m$条边的有向图,经过第i条边要花$c_i$元钱,经过第i条边有$p_{i,k}$的概率要耗时k分钟.你想从1走到n,但是如果 ...

  7. Codeforces A. Kyoya and Colored Balls(分步组合)

    题目描述: Kyoya and Colored Balls time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  8. CF553E Kyoya and Train

    Kyoya and Train 一个有\(n\)个节点\(m\)条边的有向图,每条边连接了\(a_i\)和\(b_i\),花费为\(c_i\). 每次经过某一条边就要花费该边的\(c_i\). 第\( ...

  9. 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 ...

随机推荐

  1. 年底了,该跳槽了,全套高级Java面试题及答案整理~

    又到年底了,又是一轮跳槽季 城外的人想进去,城里的人想出来 为什么离职? 马云说过,要么工资低,要么受了委屈 我想大多数人离职是这个原因 出来混的,跳槽也都是为了更好的生活 干技术的,工资都是跳出来的 ...

  2. 51-Ubuntu-打包压缩-1-打包压缩简介

    打包压缩是日常工作中备份文件的一种方式 在不同操作系统中,常用的打包压缩方式是不同的 Windows 常用 rar Mac 常用 zip Linux 常用 tar.gz

  3. android应用的资源

    应用资源可以分为两大类: 1.无法直接访问的原生资源,保存在asset目录下. 2.可以通过R资源清单类访问的资源,保存在res目录下. 资源的类型以及存储方式: android要求在res目录下用不 ...

  4. http://localhost:8080 is requesting your username and password

    after you startup your tomcat,  you type a concrete request url  in broswer, the tomcat probably wil ...

  5. 微信小程序のwxml列表渲染

    列表渲染存在的意义 以电商为例,我们希望渲染5个商品,而又希望容易改变,我们就要在wxml中动态添加. <view> <block wx:for="{{products}} ...

  6. Oracle之数据类型问题

    做项目涉及到Oracle数据库中数据类型:字符串型的问题 我不太清楚varchar(32)到底代表着什么? 通过搜索了解到:oracle中有三种常用的类型:varchar2(byte),varchar ...

  7. Spring:DataSource注入到dao

    Spring:DataSource注入到dao 使用DOS命令创建数据库(Mysql) CREATE DATABASE book DEFAULT CHARACTER SET utf8; CREATE ...

  8. 安装percona-toolkit.rpm时候报错:perl(Time::HiRes) is needed by percona-toolkit-2.2.16-1.noarch

    1.安装percona-toolkit.rpm时候报错: warning: percona-toolkit.rpm: Header V4 DSA/SHA1 Signature, key ID cd2e ...

  9. 导出Excel(终极版)

    /** * 导出excel 案例 */ public void exportExcel(){ long beginTime = System.currentTimeMillis(); HttpServ ...

  10. NX二次开发-UFUN导入表达式UF_MODL_import_exp

    最近在做表达式创建,发现UFUN的创建表达式函数UF_MODL_create_exp,UF_MODL_create_exp_tag没有办法创建字符串类型的表达式,例如AA="BB" ...