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

CF传送门

洛谷传送门

【题目分析】

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

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

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

f_{i,j,k}=\Sigma_{x=1}^{n}f_{i,x,k-1}\times f_{x,j,1}

然后发现这个形式其实就是矩阵乘法,所以可以利用矩阵快速幂优化,计算出走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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux centos/redhat mysql8.0安装(汇总贴)

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下linux 装 mysql8.0。以下都是实践过的可以用的。 1. yum方式安装&#xff08;最简单方式&#xff09; https://blog.csdn.net/weixin_37264997/article/details/80342838 2. linux系统安装mysql8.0.11完整教程&#xff…

[css] 请说说CSS3实现文本效果的属性有哪些?

[css] 请说说CSS3实现文本效果的属性有哪些&#xff1f; text-shadow:文字阴影效果 word-wrap:换行设置个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

SqlServer自定义聚合函数

sqlserver2017版本包括以上的可以使用string_agg(字段,’,’)函数 sqlserver查询版本&#xff1a; select versionSql Server自定义聚合函数详细bai步骤 开始-> 输出-> 首先用baiVS2008/VS2005建立一个SQL Server项目&#xff0c;右键解决方案添加新项 点击“确定…

C#前后端操作json数据

一、前端代码&#xff1a; function initDeptSelect() {var datas {"plant":$(#plantSelect).val()}; //获取某个组件的值&#xff0c;以json格式形式存放var jsonVal JSON.stringify(datas);//将值转化为json对象&#xff0c;必须要做$.ajax({type: post, …

[css] 请说说在什么时候用transition?什么时候使用animation?

[css] 请说说在什么时候用transition&#xff1f;什么时候使用animation&#xff1f; transition 相当于是个过度动画&#xff0c;需要又过度效果才会触发。一般用来做元素的放大缩小、平移旋转等简单的操作。transition 只执行一次&#xff0c;当需要执行多次时&#xff0c;一…

springboot : Failed to decode downloaded font 和 OTS parsing error

大家好&#xff0c;我是烤鸭&#xff1a; 采坑实录&#xff0c;看了很多人跟我有类似问题&#xff0c;但是都没解决我的问题&#xff1a; Failed to decode downloaded font 和 OTS parsing error: 尝试了把woff文件移动到其他可以加载的静态资源文件夹下&#xff0c;还是无法…

PowerDesigner从数据库导入

第一步&#xff1a;PowerDesigner逆向导入MYSQL数据库并显示中文注释 第二步&#xff1a;PowerDesigner互换表结构中NAME和CODE的值 注意事项&#xff1a; 1&#xff0c;mysql导入可能会卡死&#xff08;我试了好几遍&#xff09; 2&#xff0c;建议使用sqlserver和oracle…

根据时间戳 统计每天用户的金额总数

SELECT FROM_UNIXTIME(add_time, %Y-%m-%d) AS date, sum(price), user_idFROM ryc_order_courseWHERE add_time ! GROUP BY date, user_id 转载于:https://www.cnblogs.com/guolc/p/9934557.html

[css] 说说响应式设计(responsive design)和自适应设计(adaptive design)的区别?

[css] 说说响应式设计(responsive design)和自适应设计(adaptive design)的区别&#xff1f; 响应式是通过视口分辨率识别不同客户端展现不同的布局和内容&#xff0c;一套代码。自适应是通过识别时候分辨率针对不同设备返回不同的页面&#xff0c;多套代码。个人简介 我是歌…

达梦数据库常用SQL

转载请注明原文链接地址 --达梦数据库创建表 create table TEST_TABLE(scid varchar2(10) primary key,scname varchar2(20), scsm number(6), scprice number(4,2) );---------------------当前用户-------------------------- --达梦数据库-获取…

insert ignore duplicate key

Insert into T1select * from T2 where NOT EXISTS (select 1 from T1 X where X.GUIDT2.GUID);转载于:https://www.cnblogs.com/kakaisgood/p/9935028.html

【objectMapper实体转换异常】 com.fasterxml.jackson.databind.exc.MismatchedInputException

大家好&#xff0c;我是烤鸭&#xff1a; 采坑实录&#xff0c;想把json数据直接转成对象&#xff0c;其中有个属性是list<T>&#xff1a; 异常 1 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.util.ArrayList o…

[css] 什么是脱离文档流?有什么办法可以让元素脱离标准的文档流?

[css] 什么是脱离文档流&#xff1f;有什么办法可以让元素脱离标准的文档流&#xff1f; 文档流就是指元素在 HTML 文档中位置顺序决定排布的过程。HTML 元素有块级元素和行内元素&#xff0c;块级元素一个占一行&#xff0c;行内元素在一行内依次排布。整体元素从上到下的排布…

解决 org.apache.hadoop.io.nativeio.NativeIO$POSIX.stat异常

原因是我的maven使用的hadoop版本是3.1.2&#xff0c; 但是系统环境变量配置的hadoop的版本是3.0.0&#xff0c; 所以造成这个异常。 解决方案&#xff1a;将两个版本改成一致&#xff0c;如果修改的是系统环境变量&#xff0c;请重启电脑。

[Leetcode 376]摇摆序列 Wiggle Subsequence

【题目】 A sequence of numbers is called a wiggle sequence if the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either positive or negative. A sequence with fewer than t…

java 实现 常见排序算法(三)快速排序

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下基础排序算法之快速排序。快速排序是内部排序&#xff08;基于比较排序&#xff09;中最好的比较算法。 1. 快速排序&#xff1a; 原理&#xff1a;在要排的数&#xff08;比如数组A&#xff09;中选择一个中心值k…

[css] 请问background-attachmentn属性有什么用途?

[css] 请问background-attachmentn属性有什么用途&#xff1f; background-attachment: fixed / scroll / local&#xff1a; 设置背景图像是否固定或者随着页面的其余部分滚动。fixed: 背景图片不会随着页面的滚动而滚动。scroll: 背景图片随着页面的滚动而滚动&#xff0c;这…

解决org.apache.hadoop.io.nativeio.NativeIOException: 当文件已存在时,无法创建该文件。

Hadoop在本地运行的时候总是出现这个异常&#xff0c;虽然这个异常不影响代码运行&#xff0c;但是看着很不爽 1&#xff0c;找到log4j.properties文件&#xff0c;查看log4j.rootLogger&#xff0c;但是却没有debug log4j.rootLogger info,stdout2&#xff0c;查看pom.xm…

两台TP-LINK路由器串联

TP-LINK的交换机LAN口连接电脑&#xff0c;设置交换机IP为192.168.2.1&#xff0c;为以后方便管理不设置自动获取IP地址&#xff0c;不设置DHCPLAN口连接路由器网线&#xff0c;不是WAN口其他电脑也连接LAN口&#xff0c;即可上网 https://www.192ly.com/qiu-zhu/two-routers-c…

[css] 移动页面底部工具条有3个图标,如何平分?在设置边框后最后一个图标掉下去了怎么办?

[css] 移动页面底部工具条有3个图标&#xff0c;如何平分&#xff1f;在设置边框后最后一个图标掉下去了怎么办&#xff1f; flex-wrap nowrap, 一般flex默认就是nowrap white-space:nowrap是针对行内元素设置的,默认为normal个人简介 我是歌谣&#xff0c;欢迎和大家一起交流…