CF553E Kyoya and Train
Kyoya and Train
一个有\(n\)个节点\(m\)条边的有向图,每条边连接了\(a_i\)和\(b_i\),花费为\(c_i\)。
每次经过某一条边就要花费该边的\(c_i\)。
第\(i\)条边耗时为\(j\)的概率为\(p_{i,j}\)。
现在你从\(1\)开始走到\(n\),如果你在\(t\)单位时间内(包括\(t\))到了\(n\),不需要任何额外花费,否则你要额外花费\(x\)。
问你在最优策略下的期望花费最小为多少。(注意你每走一步都会根据当前情况制定最好的下一步)
\(n\leq 50 ,m \leq 100, t\leq 20000, x\leq 10^6\)
毛啸论文

看别人的代码,我学会了怎么用线性的空间预处理单位根。
\]
而\(\frac{lim}{2step}\times i < \frac{lim}{2},i\in [0,step)\),所以预处理\(\omega^{\frac{2\pi}{lim}}\)的次幂即可。
co double pi=acos(-1);
struct node {double x,y;};
il node operator+(co node&a,co node&b){
return (node){a.x+b.x,a.y+b.y};
}
il node operator-(co node&a,co node&b){
return (node){a.x-b.x,a.y-b.y};
}
il node operator*(co node&a,co node&b){
return (node){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};
}
co int N=55,M=105,T=20005,S=1<<15;
int n,m,t,punish;
int a[M],b[M],c[M],dis[N][N];
double dp[N][T],sum[M][T],p[M][T];
int rev[S];
node w[S],A[S],B[S];
void fourier_trans(node a[],int lim){
for(int i=0;i<lim;++i)
if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int step=1;step<lim;step<<=1){
int quot=lim/(step<<1);
for(int i=0;i<lim;i+=step<<1){
int j=i+step;
for(int k=0;k<step;++k){
node t=w[quot*k]*a[j+k];
a[j+k]=a[i+k]-t,a[i+k]=a[i+k]+t;
}
}
}
}
void solve(int l,int r){
if(l==r){
for(int e=1;e<=m;++e)
dp[a[e]][l]=min(dp[a[e]][l],sum[e][l]+c[e]);
return;
}
int mid=(l+r)>>1;
solve(mid+1,r);
int len=int(ceil(log2(r-mid+r-l-1))),lim=1<<len;
for(int i=0;i<lim;++i){
rev[i]=rev[i>>1]>>1|(i&1)<<(len-1);
w[i]=(node){cos(i*2*pi/lim),sin(i*2*pi/lim)};
}
for(int e=1;e<=m;++e){
for(int i=0;i<lim;++i)
A[i]=B[i]=(node){0,0};
for(int i=mid+1;i<=r;++i)
A[i-mid-1]=(node){dp[b[e]][i],0};
for(int i=1;i<=r-l;++i)
B[r-l-i]=(node){p[e][i],0};
fourier_trans(A,lim),fourier_trans(B,lim);
for(int i=0;i<lim;++i){
A[i]=A[i]*B[i];
w[i].y=-w[i].y;
}
fourier_trans(A,lim);
for(int i=0;i<lim;++i){
A[i].x/=lim;
w[i].y=-w[i].y;
}
for(int i=l;i<=mid;++i)
sum[e][i]+=A[i-mid-1+r-l].x;
}
solve(l,mid);
}
int main(){
scanf("%d%d%d%d",&n,&m,&t,&punish);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
dis[i][j]=i==j?0:1e9;
for(int i=1;i<=m;++i){
scanf("%d%d%d",a+i,b+i,c+i);
dis[a[i]][b[i]]=min(dis[a[i]][b[i]],c[i]);
for(int j=1;j<=t;++j)
scanf("%lf",p[i]+j),p[i][j]/=100000;
}
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
for(int i=0;i<N;++i)
for(int j=0;j<T;++j)
dp[i][j]=1e9;
for(int i=1;i<=n;++i) dp[i][t+1]=punish+dis[i][n];
for(int i=0;i<=t;++i) dp[n][i]=0;
for(int e=1;e<=m;++e){
double P=0;
for(int i=1;i<=t;++i){
P+=p[e][t+1-i];
sum[e][i]=P*dp[b[e]][t+1];
}
}
solve(0,t);
printf("%lf\n",dp[1][0]);
return 0;
}
CF553E Kyoya and Train的更多相关文章
- 【CF553E】Kyoya and Train 最短路+cdq分治+FFT
[CF553E]Kyoya and Train 题意:有一张$n$个点到$m$条边的有向图,经过第i条边要花$c_i$元钱,经过第i条边有$p_{i,k}$的概率要耗时k分钟.你想从1走到n,但是如果 ...
- [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
题链: http://codeforces.com/problemset/problem/623/E 题解: FFT,DP 题意: 一个有向图,给出每条边的起点u,终点v,费用c,以及花费每种时间的概 ...
- 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/553/E (题目链接) 艹尼玛,CF还卡劳资常数w(゚Д゚)w!!系统complex被卡TLE了T_T,劳资写了一天 ...
- CF 553E Kyoya and Train
题目分析 期望\(\text{dp}\). 设\(f_{i,j}\)表示在第\(j\)个时刻从\(i\)点出发,到达终点的期望花费. 有转移方程: \[ f_{x,t}=\min_{(x,y)\in ...
- Codeforces 553E Kyoya and Train
题目大意 链接:CF533E 给一张\(n\)个点,\(m\)条边的图,起点\(1\)终点\(n\),如果不能在\(T\)的时间内到达则需支付\(X\)的代价. 走每条边都会支付一定代价,经过一条边\ ...
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ
因为垃圾电脑太卡了就重开了一个... 前传:多项式Ⅰ u1s1 我预感还会有Ⅲ 多项式基础操作: 例题: 26. CF438E The Child and Binary Tree 感觉这题作为第一题还 ...
- 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】
原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...
随机推荐
- 最新 识装java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿. 识装等10家互联网公司的校招Offer,因为某些自身原因最终选择了 识装.6.7月主要是做系统复习.项目复盘.LeetCo ...
- ubuntu18.04安装Anaconda
jiangshan@dell-Precision-7920-Tower:~$ lsAnaconda3-2019.07-Linux-x86_64.shjiangshan@dell-Precision-7 ...
- [基础]C++:名字的作用域
每个名字都有自己的活动空间,同一个名字在不同的作用域可能指向不同的实体. 作用域:通常是以{}为分隔. 名字的有效区域开始于名字的声明,以声明语句所在的末端为结束. #include<iostr ...
- Django 报错 admin.E408 admin.E409 admin.E410
报错内容 ERRORS: ?: (admin.E408) 'django.contrib.auth.middleware.AuthenticationMiddleware' must be in MI ...
- Linux忘记root密码操作方法
此方法为:进入单用户模式,直接修改新密码覆盖掉以前的root密码. 操作步骤: 1.进入单用户模式 2.修改root密码 1.进入单用户方法: 1)启动Linux时,通过按上下键(其他键也可以)让Li ...
- TextField 、 FTE、 TLF 的使用情景和简单说明
作者:tiangej 来源:CSDN 原文:https://blog.csdn.net/tiangej/article/details/16859239 版权声明:本文为博主原创文章,转载请附上博文链 ...
- Jmeter学习笔记(十五)——常用的4种参数化方式
一.Jmeter参数化概念 当使用JMeter进行测试时,测试数据的准备是一项重要的工作.若要求每次迭代的数据不一样时,则需进行参数化,然后从参数化的文件中来读取测试数据. 参数化是自动化测试脚本的一 ...
- tp5隐藏入口文件(基于nginx)
location / { try_files $uri $uri/ /index.php?$query_string; #这项配置解决访问根目录以外路径报404的错误 ...
- HTTP协议复习一--认识HTTP
HTTP 是什么 HTTP 是一个在计算机世界里专门在两点之间传输文字.图片.音频.视频等超文本数据的约定和规范. HTTP 是一个用在计算机世界里的协议,它确立了一种计算机之间交流通信的规范,以及相 ...
- SpringMVC框架笔记02_参数绑定返回值文件上传异常处理器JSON数据交互_拦截器
目录 第1章 高级参数的绑定 1.1 参数的分类 1.2 数组类型的参数的绑定 1.3 集合类型的参数的绑定 第2章 @RequestMapping的用法 2.1 URL路径映射 2.2 请求方法限定 ...