当前位置: 首页 > news >正文

[SHOI2011] 扫雷机器人 题解

[SHOI2011] 扫雷机器人 题解

前言

显然,一个炸弹可以引爆另一个,而另一个炸弹却不一定能引爆这一个。

考虑假设炸弹一能引爆炸弹二,则建一条一到二的有向边。

推导过程

期望,就是平均值,也就是所有情况的权值总和除以情况总数的值。

可是,情况总数足足有n ! n!n!种,显然会超时到没边。

当你走投无路的时候,可以尝试化简式子。

令全部的引爆次数为c n t cntcnt期望a n s ansans,可以写出以下式子:

a n s = c n t n ! ans=\frac{cnt}{n!}ans=n!cnt

考虑c n t cntcnt该如何计算。

考虑每个炸弹对于c n t cntcnt的贡献。

显然这个炸弹被手动引爆一次,那么c n t cntcnt就会多1 11

考虑什么时候这个炸弹能够被手动引爆

显然,每个炸弹都有若干个炸弹可以将其引爆,所以为了被手动引爆,这个炸弹的引爆时间必须在能引爆它的炸弹的前边。

令对于第i ii个炸弹,有k i k_iki个炸弹可以将它引爆,为了方便计算,此处的k i k_iki包含第i ii个炸弹本身。

显然第i ii个炸弹被手动引爆的概率s i s_isi如下:
s i = 1 k i ! s_i=\frac{1}{k_i!}si=ki!1
那么第i ii个炸弹能够被手动引爆的次数t i t_iti为:
t i = 1 k i ! ⋅ n ! t_i=\frac{1}{k_i!}\cdot n!ti=ki!1n!
将这些式子代入计算期望的式子,得:
a n s = ∑ i = 1 n 1 k i ! ⋅ n ! n ! ans=\frac{\sum_{i=1}^n\frac{1}{k_i!}\cdot n!}{n!}ans=n!i=1nki!1n!
提取公因式,得:
a n s = n ! ⋅ ∑ i = 1 n 1 k i ! n ! ans=\frac{n!\cdot \sum_{i=1}^n\frac{1}{k_i!}}{n!}ans=n!n!i=1nki!1
化简,得:
a n s = ∑ i = 1 n 1 k i ! ans=\sum_{i=1}^n\frac{1}{k_i!}ans=i=1nki!1
这个式子就能计算了,但k i k_iki该如何计算?

一下子就想到了拓扑排序

可是可能存在环。

考虑使用 Tarjan 算法进行 缩点,再进行拓扑排序。

参考代码

#include<bits/stdc++.h>usingnamespacestd;structbomb{intx;intd;}a[4010];intn;bitset<4010>k[4010];vector<int>e[4010];set<int>b[4010];intlow[4010];intdfn[4010];intvis[4010];intd[4010];stack<int>s;intidx;vector<vector<int>>ans;intid[4010];voidTarjan(intx){s.push(x);low[x]=dfn[x]=++idx;vis[x]=1;for(inti:e[x]){if(!dfn[i]){Tarjan(i);low[x]=min(low[x],low[i]);}elseif(vis[i]){low[x]=min(low[x],dfn[i]);}}if(low[x]==dfn[x]){vector<int>q;while(s.top()!=x){autoh=s.top();s.pop();vis[h]=0;q.push_back(h);id[h]=ans.size();}s.pop();vis[x]=0;q.push_back(x);id[x]=ans.size();ans.push_back(q);}}intmain(){cin.tie(0)->sync_with_stdio(false);cin>>n;for(inti=1;i<=n;i++){cin>>a[i].x>>a[i].d;}for(inti=1;i<=n;i++){for(intj=1;j<=n;j++){if(i^j&&a[i].x-a[i].d<=a[j].x&&a[i].x+a[i].d>=a[j].x){e[i].push_back(j);}}}for(inti=1;i<=n;i++){if(!dfn[i]){Tarjan(i);}}for(inti=0;i<ans.size();i++){for(intj:ans[i]){k[i][j]=1;for(intk:e[j]){if(i==id[k])continue;b[i].emplace(id[k]);}}}for(inti=0;i<ans.size();i++){for(intj:b[i]){d[j]++;}}queue<int>q;for(inti=0;i<ans.size();i++){if(!d[i])q.push(i);}while(!q.empty()){autoh=q.front();q.pop();for(inti:b[h]){k[i]|=k[h];d[i]--;if(!d[i])q.push(i);}}longdoublee=0.000000;for(inti=0;i<ans.size();i++){e+=(1.000000)/(k[i].count()*1.000000)*ans[i].size();}cout<<fixed<<setprecision(4)<<e;return0;}

如有错误,还请指出。

注. 我的洛谷账号即为 lonys,本篇文章同步在洛谷专栏发布。

http://www.jsqmd.com/news/1172231/

相关文章:

  • Leaflet 离线地图性能优化:3 种瓦片存储方案对比与百兆数据加载实测
  • Hadoop 3.3.4 MapReduce 实战:3步实现倒排索引,输出文件1@频次格式
  • OpenSSL 与 ssh-keygen 密钥格式互转:3 种场景下的完整命令与验证
  • 【Copilot×CI/CD黄金组合】:2024 Q2 Gartner DevOps成熟度评估新增“AI协同指数”,你团队达标了吗?
  • Android 3D游戏开发入门:从OpenGL ES基础到实战渲染与优化
  • Flink 2.3 状态后端实战:RocksDB vs HashMap 在10亿事件/天场景下的配置与调优
  • VS Code 插件深度评测:3款 TypeScript 智能辅助工具(Hero vs Importer vs Sorter)对比
  • 2026年7月最新长春芝柏官方售后联系电话与客户服务中心网点地址 - 亨得利官方服务中心
  • Unity URP卡通渲染实战:从色阶光照到屏幕描边的完整指南
  • etipc高可用性设计:接口宕机时的快速检测与链路切换机制
  • 猫抓Cat-Catch 2.6.9:浏览器资源嗅探终极指南,轻松获取网页媒体内容
  • 2026年10款靠谱论文降AIGC网站亲测:规范定稿实战对比实用指南
  • mpweixinpy餐厅微信点餐小程序
  • Godot TileMap完全指南:从基础配置到性能优化实战
  • Godot-MCP:基于MCP协议的AI游戏开发副驾驶实战指南
  • Codex接入国产AI模型:DeepSeek协议转换与配置实战
  • Makefile 模式匹配与变量实战:3个技巧将200行配置缩减至50行
  • Python 8个被忽略的底层事实:影响代码健壮性与性能的关键细节
  • GB8567-88 国标软件开发文档实战:8个核心文档模板与敏捷裁剪指南
  • Waymo-3DSkelMo:3D骨骼运动数据集如何革新自动驾驶行人交互建模
  • 2026 年现阶段,固原正规的剪股颖草坪源头厂家深度解析,别再浪费钱!这个小工具如何让你的草坪瞬间升级? - 行业推荐【认证官】
  • 亲身到店探访海口亨得利官方名表服务中心|网点地址与客服电话(2026年7月更新) - 亨得利官方
  • WWMI-Package:重构《鸣潮》3D模型导入的技术架构与实践
  • epkg-spec2yaml自动化集成:与CI/CD流水线结合的完整部署方案
  • 太顶了!输入主题,这几款AI论文网站直接生成结构完整的毕业论文
  • MMC崩溃原理与Windows服务器管理误操作防护指南
  • AI Agent开发实战:从原理到多智能体系统构建
  • RADIUS vs TACACS+ 协议对比:3大维度解析AAA安全与运维差异
  • Python Playwright 完整实战教程(爬虫+Web自动化生产落地)
  • 帝舵中国官方专柜客服电话权威信息声明(2026年7月最新) - 帝舵中国官方服务中心