CF传送门

洛谷传送门

【题目分析】

在zxy大佬的讲解下终于懂了这道题的做法了qwq。。。

首先根据题意,出发点不一定在特殊点上,但第一次操作后,之后所有的操作都是在特殊点上,所以先考虑从线上出发的最大概率,再加一步即可得到从点出发的最大概率,二者取较大值即可。

记数组f[i][j][k]表示从i点走k步到j点的概率,所以转移方程就出来了:

然后发现这个形式其实就是矩阵乘法,所以可以利用矩阵快速幂优化,计算出走2^i步的概率。

但每次都进行一次快速幂的计算复杂度为O(n^3log(q)),所以继续优化。

因为我们只需要考虑最后到达t的最大概率,所以在进行矩阵乘法的时候很多位置都是没用的,所以考虑将初始矩阵简化为一个1*n的矩阵,表示走0步到达t的概率,显然只有base[t]=1,其他位置均为0。

然后将操作数进行二进制拆分进行左乘,因为初始矩阵只有1行,所以不管乘几次都只有一行,这样直接优化了一个n的复杂度。

从直线开始就是比从点开始少了一步(因为要先走到点上),所以就先处理从直线开始走的情况统计答案,最后再计算一次就可以得到从点开始走的概率。

考虑构造f[i][j][0],显然从i点走一步到达j点的概率为(1/(经过i点直线数)*(直线i,j上的点数)),根据这个构造即可。

然后就是各种小细节。。。

1.直线去重,这样可以避免进行重复计算。

2.将一个vector的值赋给另一个vector的时候加个传址符会快一点。

3.在计算f数组和base数组的时候如果f[i][j][k]或g[i]已经小于1e-6了,那么其实并没有必要继续计算下去了,因为精度太小反而可能会爆炸,而且题目也说了误差在1e-6以内即可,这样大大减少运行时间。

【代码~】

#include<bits/stdc++.h>
using namespace std;
const int MAXN=201;
const int MAXM=15;int n,q;
int x[MAXN],y[MAXN];
int vis[MAXN],cnt[MAXN];
double ans;
double f[MAXN][MAXN][MAXM+1];
double Base[MAXN],zy[MAXN];
vector<int> point[MAXN][MAXN];
vector<pair<int,int> > line; inline int Read(){int i=0,f=1;char c;for(c=getchar();(c>'9'||c<'0')&&c!='-';c=getchar());if(c=='-')f=-1,c=getchar();for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';return i*f;
}bool check(int a,int b,int c){return (y[b]-y[a])*(x[c]-x[a])==(y[c]-y[a])*(x[b]-x[a]);
}int main(){n=Read();for(int i=1;i<=n;++i)x[i]=Read(),y[i]=Read();for(int i=1;i<=n;++i){memset(vis,0,sizeof(vis));for(int j=1;j<=n;++j){if(i==j)continue;if(vis[j])continue;cnt[i]++;for(int k=1;k<=n;++k){if(check(i,j,k)){point[i][j].push_back(k);vis[k]=1;}}line.push_back(make_pair(point[i][j][0],point[i][j][1]));}}sort(line.begin(),line.end());line.erase(unique(line.begin(),line.end()),line.end());int siz1=line.size();for(int i=0;i<siz1;++i){vector<int> &vec=point[line[i].first][line[i].second];int siz2=vec.size();for(int j=0;j<siz2;++j){for(int k=0;k<siz2;++k){f[vec[j]][vec[k]][0]+=1.0/siz2*1.0;}}}for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){f[i][j][0]/=cnt[i];}}for(int i=1;i<=MAXM;++i){for(int j=1;j<=n;++j){for(int k=1;k<=n;++k){if(f[j][k][i-1]>1e-6){for(int t=1;t<=n;++t){f[j][t][i]+=f[j][k][i-1]*f[k][t][i-1];}}}}}q=Read();while(q--){int t=Read(),step=Read()-1;memset(Base,0,sizeof(Base));Base[t]=1;for(int i=0;i<=MAXM;++i){if((1<<i)>step)break;if((1<<i)&step){memset(zy,0,sizeof(zy));for(int j=1;j<=n;++j){if(Base[j]>1e-6){for(int k=1;k<=n;++k){zy[k]+=f[k][j][i]*Base[j];}}}memcpy(Base,zy,sizeof(zy));}}ans=0.0;int siz=line.size();for(int i=0;i<siz;++i){vector<int> &vec=point[line[i].first][line[i].second];double tot=0.0;int siz2=vec.size();for(int j=0;j<siz2;++j){tot+=Base[vec[j]];}tot/=1.0*siz2;ans=max(ans,tot);}memset(zy,0,sizeof(zy));for(int i=1;i<=n;++i){if(Base[i]>1e-6){for(int j=1;j<=n;++j){zy[j]+=Base[i]*f[j][i][0];}}}memcpy(Base,zy,sizeof(zy));for(int i=1;i<=n;++i)ans=max(ans,Base[i]);printf("%.10lf\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/Ishtar/p/10010705.html

CF989E A Trance of Nightfall(概率+矩阵快速幂优化+倍增)相关推荐

  1. 【POJ - 3744】Scout YYF I(概率dp,矩阵快速幂优化dp)

    题干: 题目大意: 在一条不满地雷的路上(无限长),你现在的起点在1处.在N个点处布有地雷,1<=N<=10.地雷点的可能坐标范围:[1,100000000]. 每次前进p的概率前进一步, ...

  2. 15年第六届蓝桥杯第九题_(矩阵快速幂优化的动态规划)

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  3. 蓝桥杯 - 垒骰子(动态规划+矩阵快速幂优化)

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  4. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

  5. AtCoder abc256全题解(区间合并模板、矩阵快速幂优化dp、线段树……)

    文章目录 A B C-枚举 D-区间合并模板 E-图论建模,函数图的性质 题意 思路 代码 F-树状数组 题意 思路 代码 G-矩阵快速幂优化dp H-线段树 思路 实现 传送门 本文CSDN 本文j ...

  6. 【noip2016十连测round3】T3 涂色游戏 【矩阵快速幂优化dp】

    涂色游戏 题解: 推一推公式. 我们让f[i][j]表示第i列有j种颜色的方案总数,k表示i-1列用了多少种颜色,l表示第i列用了多少种没有在i-1列出现的颜色,G(i,j)表示i个格子涂j种颜色的方 ...

  7. Q老师度假(变形矩阵快速幂优化DP)

    问题描述 忙碌了一个学期的 Q老师 决定奖励自己 N 天假期. 假期中不同的穿衣方式会有不同的快乐值. 已知 Q老师 一共有 M 件衬衫,且如果昨天穿的是衬衫 A,今天穿的是衬衫 B,则 Q老师 今天 ...

  8. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)

    传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...

  9. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)

    传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...

最新文章

  1. Java中怎样将Json字符串转换成实体类
  2. alibaba cloud is expensive
  3. php json与接口的使用,api接口与json
  4. chrome jsp 显示不正常_JSP程序在chrome下不兼容的问题!
  5. mysql 1033 frm_MySQL ERROR 1033 (HY000): Incorrect information in file. 处理一例
  6. AI 时代下的海量业务智能监控实践
  7. mysql如何管理innodb元数据_1.1.20 可动态关闭InnoDB更新元数据的统计功能
  8. viso 画背景框_手工界新宠:美绝了的浮雕画,揉揉捏捏一幅画
  9. ADO.NET 数据库操作类
  10. 详解Unity中的射线与射线检测
  11. win32实现两个透明窗口联动
  12. C#调用excel报错 (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))问题的解决方案
  13. 银联支付接口研究(Android端和Java服务端)
  14. 关于Windows mobile设备中心,同步软件不出现,打开卡住问题的解决
  15. 普渡大学计算机科学竞争激烈,Top12普渡大学计算机博士全奖录取:同时收获Top博士和藤校耶鲁硕士录取!她该怎么选择?...
  16. 问题解决:Unable to establish SSL connection.
  17. C语言中ret的作用,c-RET抑制剂 | c-RET Inhibitor
  18. SMS之SMS2003+SP3
  19. 电机速度曲线规划1:梯形速度曲线设计与实现
  20. PS仿制图章工具、油桶工具、渐变

热门文章

  1. python-上传下载文件
  2. Jquery创建动态表单
  3. 【51单片机快速入门指南】8:看门狗定时器(WDT)
  4. css媒体查询(手机、平板、PC)
  5. C++ 控制结构和函数(二) —— 函数I(Functions I)
  6. linux epoll 开发指南-【ffrpc源码解析】
  7. Python 爬虫进阶三之 Scrapy 框架安装配置
  8. 使用UltraEdit32编辑器格式化源码功能 XML、Java、C/C++、C#
  9. 调用 usb_control_msg 返回错误值 -32, Broken pipe, 对 hidraw write时 返回错误值 -32, Broken pipe
  10. JAVA进阶day08泛型