2016北京集训测试赛(十)Problem A: azelso
Solution
我们把遇到一个旗子或者是遇到一个敌人称为一个事件.
这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这段路只被经过一次的概率. 分类讨论:
- \(i + 1\)是一个敌人, 则\(f[i] = f[i + 1] \times p[i + 1]\)
- \(i + 1\)是一个旗子, 则
\]
表示\(i + 1\)到\(i + 2\)这一段只被走一次的概率, 加上走过\(i + 1\)后掉回\(i + 1\), 再往后走, 再掉回\(i + 1\), 一直循环, 一直掉回\(i + 1\), 直到走到终点的概率. 上面的式子用无限和式稍微处理即可化简.
然后我们又发现一段路程的被走过的期望次数等于\(1 / p_i\), 因此就可以方便地统计总共要走的期望距离.
#include <cstdio>
#include <cctype>
namespace Zeonfai
{
inline long long getInt()
{
long long a = 0, sgn = 1; char c;
while(! isdigit(c = getchar())) if(c == '-') sgn *= -1;
while(isdigit(c)) a = a * 10 + c - '0', c = getchar();
return a * sgn;
}
inline char getChar()
{
char c;
while(! isgraph(c = getchar()));
return c;
}
}
const long long MOD = 1e9 + 7, N = 1e5;
inline long long getInverse(long long a)
{
long long res = 1;
for(long long x = MOD - 2; x; a = a * a % MOD, x >>= 1) if(x & 1) res = res * a % MOD;
return res;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("azelso.in", "r", stdin);
freopen("azelso.out", "w", stdout);
#endif
using namespace Zeonfai;
long long len = getInt(), n = getInt();
static long long opt[N + 2], pos[N + 2], E[N + 2], p[N + 2];
for(long long i = 1; i <= n; ++ i)
{
opt[i] = getChar() == 'F' ? 0 : 1;
pos[i] = getInt() % MOD;
long long a = getInt(), b = getInt(); p[i] = a * getInverse(b) % MOD;
}
E[n] = 1;
for(long long i = n - 1; ~ i; -- i) E[i] = opt[i + 1] == 0 ? (E[i + 1] - p[i + 1] * E[i + 1] % MOD + p[i + 1] + MOD) % MOD : E[i + 1] * getInverse(p[i + 1]) % MOD;
long long ans = 0; pos[0] = 0; pos[n + 1] = len;
for(long long i = 0; i <= n; ++ i)
ans = (ans + (pos[i + 1] - pos[i] + MOD) * E[i] % MOD) % MOD;
// ans = (ans + len - pos[n]) % MOD;
printf("%d\n", ans);
}
2016北京集训测试赛(十)Problem A: azelso的更多相关文章
- 2016北京集训测试赛(十六)Problem C: ball
Solution 这是一道好题. 考虑球体的体积是怎么计算的: 我们令\(f_k(r)\)表示\(x\)维单位球的体积, 则 \[ f_k(1) = \int_{-1}^1 f_{k - 1}(\sq ...
- 2016北京集训测试赛(十六)Problem B: river
Solution 这题实际上并不是构造题, 而是一道网络流. 我们考虑题目要求的一条路径应该是什么样子的: 它是一个环, 并且满足每个点有且仅有一条出边, 一条入边, 同时这两条边的权值还必须不一样. ...
- 2016北京集训测试赛(十六)Problem A: 任务安排
Solution 这道题告诉我们, 不能看着数据范围来推测正解的时间复杂度. 事实证明, 只要常数足够小, \(5 \times 10^6\)也是可以跑\(O(n \log n)\)算法的!!! 这道 ...
- 2016北京集训测试赛(十四)Problem B: 股神小D
Solution 正解是一个\(\log\)的link-cut tree. 将一条边拆成两个事件, 按照事件排序, link-cut tree维护联通块大小即可. link-cut tree维护子树大 ...
- 2016北京集训测试赛(十四)Problem A: 股神小L
Solution 考虑怎么卖最赚钱: 肯定是只卖不买啊(笑) 虽然说上面的想法很扯淡, 但它确实能给我们提供一种思路, 我们能不买就不买; 要买的时候就买最便宜的. 我们用一个优先队列来维护股票的价格 ...
- 【2016北京集训测试赛(十)】 Azelso (期望DP)
Time Limit: 1000 ms Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...
- 【2016北京集训测试赛(十六)】 River (最大流)
Description Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...
- 2016北京集训测试赛(十七)Problem C: 数组
Solution 线段树好题. 我们考虑用last[i]表示\(i\)这个位置的颜色的上一个出现位置. 考虑以一个位置\(R\)为右端点的区间最远能向左延伸到什么位置: \(L = \max_{i \ ...
- 2016北京集训测试赛(十七)Problem B: 银河战舰
Solution 好题, 又是长链剖分2333 考虑怎么统计答案, 我场上的思路是统计以一个点作为结尾的最长上升链, 但这显然是很难处理的. 正解的方法是统计以每个点作为折弯点的最长上升链. 具体的内 ...
随机推荐
- 2 Model层 -定义模型
1 ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射” ...
- 等比例适配所有屏幕---css3 rem用法
1,rem的定义 rem(font size of the root element)是指相对于根元素的字体大小的单位.rem是一个相对单位.和em非常相似.em(font size of the e ...
- loj2046 「CQOI2016」路由表
大傻逼trie树,更傻逼的是我这都没独立想出来,以后要少看题解,多多思考 #include <algorithm> #include <iostream> #include & ...
- WinRM和WinRS
1.6.2 新远程工具:WinRM和WinRS 2012-05-14 10:18 张杰良 译 清华大学出版社 字号:T | T 综合评级: 想读(18) 在读(5) 已读(0) 品书斋鉴(0) ...
- IOS开发学习笔记015-block和protocol
一.block block 代码段 标识是 ^ block 和函数很像 1.可以保存代码 2.有返回值 3.有形参 格式 返回值 (block名)(形参列表) = ^(形参列表) {代码段 ...
- PHP 如何在txt里查找包含某个字符串的那一行?
<?php $handler=fopen("1.txt","r"); while(!feof($handler)) { $m = fgets($handl ...
- Mac OS 系统占用储存空间太大怎么办?
存储空间 121 GB,系统就占用 106G,然后就是不断的弹窗提醒你! 解决方法: 终端先执行一下 du -sh * 查看具体是哪里使用了存储空间,一般都是 library 占用比较多的空间, 把可 ...
- 【转】Unity5.x发布IOS项目Xcode8免签证调试发布教程
http://www.jianshu.com/p/b0fb49fbcc14 最近尝试发布一下IOS项目,发现现在发布已经简单很多了,不需要开发者账户也能简单快捷进行真机调试. 调试: 1.准备工作①硬 ...
- 做一个APP
前言 有点零乱,但是我想写下来慢慢整理,搭建一个好点的工程-模式MVC, 会包括一些第三方库,动画库,第三方库管理关联,自定义常用控件的管理和关联 1.预编译文件的创建 在build setting ...
- linux系统初始化——启动脚本是如何工作的
启动脚本是如何工作的 Linux 使用的是基于 运行级(run-levels) 概念的称为 SysVinit 的专用启动工具.它在不同的系统上可能是完全不一样的,所以不能认为一个脚本在某个 Linux ...