太蠢了……$noip$ 后第一次模拟赛竟然是这样的……完全就是打击自信 / 降智……

1. 假面

一道神仙概率 $dp$!第一次写……

拿到题就发现血量 $m_i$ 的上限只有 $100$!

然后 $0$ 操作就可以用 $rate(i,j)$ 动态维护第 $i$ 个人血量为 $j$ 的概率啦。

$1$ 操作比较麻烦(但是它故意弄得很少)。

设 $live_i$ 和 $dead_i$ 分别为 $1$ 操作范围内的第 $i$ 个人活着和死了的概率,$g_{i,j}$ 是除 $i$ 以外有 $j$ 个人活着的概率。

第 $i$ 个人的答案就是 $live_i\times \sum_{j=0}^{k-1} \frac{1}{j+1}\times g_{i,j}$,其中 $\times \sum_{j=0}^{k-1}$ 是因为等概率攻击自己和其它 $j$ 个人(自己必定活着,因为自己的答案是命中自己的概率)。

但是 $g_{i,j}$ 怎么求?我们发现它的原型是这样一个 $dp$:设 $f_{i,j}$ 表示前 $i$ 个人有 $j$ 个活着的概率。

不难看出它是能递推出来的:$ f_{i,j} = f_{i-1,j-1} \times alive_i + f_{i-1,j} \times dead_i$

而且它最终转移出的总共 $k$ 个人的概率 与转移顺序无关,所以把当前求答案的这个人放到最后,然后不算他,推出的前 $k-1$ 个人的概率 $f_{k-1}$ 就是 $g_i$ 了。

每次最多有 $k$ 个人要求答案,套上述 $O(n^2)$ $dp$,时间复杂度是 $O(C\times n^3)$,能得 $70$ 分。

然后怎么优化?

$XJR$:我会 $FFT$!

不过他现场被卡成 $80$,事实证明 $200$ 个数的卷积算上常数 甚至比暴力还慢,$O(n^2\times log(n))$ 容易被卡成 $70$ 分。

$100$ 分就是(我)没弄过的一个操作了——倒推 $dp$。

什么意思?我们观察递推式 $ f_{i,j} = f_{i-1,j-1} \times alive_i + f_{i-1,j} \times dead_i$

它是可以简单反推的,即移项得到 $$f_{i-1, j} = \frac{f_{i, j} - f_{i -1, j - 1} \times live_i}{dead_i}$$

又因为答案与转移顺序无关,所以对于每个放到最后的要求答案的人,$f_{k-1}$ 可能会变,但 $f_k$ 一定不变。我们只需要从所有人的概率情况 $f_k$ 去掉当前求答案的人即可得到 $g_k$,而把这个人像上面一样放到第 $k$ 位时,由于上式可以从 $f_k$ 转移一次就得到 $f_{k-1}$,我们就可以一次求得 $g_i$。这样就不用像之前那样对于每个求答案的人重新从第 $1$ 到 $k-1$ 位递推一遍 $f$ 数组了(所以程序中的 $f$ 数组是一维的,最终存的是 $f_n$)。

$$f_{k-1, j} = \frac{f_{k, j} - f_{k -1, j - 1} \times live_k}{dead_k}$$

因为第 $k$ 个数是我们当前要求答案的第 $i$ 个人,所以 $live$ 和 $dead$ 的下标可以直接替换成 $i$,这样就省去了实际交换。

每次只是反推了一位,之前被各种博客无限误导为要整体反推一遍,然后无限瞎**理解,然后极其暴躁

2. 暴力写挂

我像是会边分治吗?

45pts:

$noip$ 难度,会写 欧拉序+RMQ 的 $O(1)$ 求 $lca$ 就行了。

100pts:

一个比较叼的线段树合并,作为一个初学者,别人的题解都好难看懂哦……杠了不少时间。

首先要知道这么一个不常用的计算链并长的方法:树上两点 $x,y$ 到根的链并长 = $[depth(x)+depth(y)+(depth(x)-depth(lca))+(depth(y)-depth(lca))] / 2$。

画个图就是

容易发现,四种颜色的边加起来之后,每条边都被算了两次,因此除以 $2$ 后每条边就只被算 $1$ 次了。

这里定义一个点 $x$ 的权值为 $depth(x)+(depth(x)-depth(lca))$。其中 $lca$ 会在之后枚举。

为什么要用这个?最后会提。

开始正题。

观察题目式子,发现前 $3$ 项是第一棵树上的,最后一项是第二棵树上的,好像不支持同时维护跨树的信息,所以我们枚举第二棵树的 $lca$。

也就是说,从第二棵树的根节点开始深搜遍历第二棵树。

那怎么解决第一棵子树?

我们注意到这样一个事情:一个点只对它的所有祖先节点有影响。

(这不是废话吗)

但正是这一点,让这个树上问题可以套个板子。

考虑一下不套板子的时候,直接做,怎么做?

如果我们固定了第一棵树的某个点为 $lca$,那我们只需要找这个点的所有子树中,子树中最大点权最大的两个,相加即可得到答案。

但我们只固定了第二棵树的 $lca$,所以我们可以反过来做,用第一个树中的点的权值更新其所有祖先节点。这样当之后祖先节点作为 $lca$ 时,只要取它被更新到的最大值和次大值,相加即可得到答案。

然而这样做复杂度并不对,因为树的深度一大,就有很多点有很多祖先节点,暴力更新的时间就炸了。

这时就可以套树分治板子了。我这用的是边分治(也可以用点分治做)。

众所周知,树分治就是通过重构树来让它尽量平衡一些,至少控制在 $log(n)$ 级别(二叉树)。然后我们就可以暴力枚举祖先什么的了。

而枚举第二棵树的 $lca$ 时,我们在之后对第一棵树做线段树合并时,只能枚举所有不能确定第一棵树的 $lca$

【2018.11.22】CTSC2018(模拟赛!)的更多相关文章

  1. 2018.9.22 NOIP模拟赛

    *注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...

  2. 2018.11.7 PION 模拟赛

    期望:100 + 80 + 75 = 255 实际:0 + 80 + 60 = 140 唉~一天比一天犯的错误智障,感觉noip要凉啊... 吓得我赶紧吃几颗药补补脑子. 奶一下大佬: lgj AK ...

  3. 2018.11.6 PION 模拟赛

    期望:100 + 40 + 50 = 190 实际:60 + 10 + 50 = 120 考得好炸啊!!T1数组开小了炸掉40,T2用 int 读入 long long ,int存储 long lon ...

  4. 2018.11.5 PION模拟赛

    期望:30 + 40 + 50 = 120 实际:30 + 50 + 40 = 120 ‘’ 思路:最重要的是发现 是完全没有用的,然后这个题目就可以转成DP来做. /* 期望的分:30 */ #in ...

  5. 2018.11.3 PION模拟赛

    期望:100    实际:100 #include<cstdio> #include<cstring> #include<iostream> #include< ...

  6. 2018 11.2 PION模拟赛

    期望:100 + 50 + 30 = 180 实际:0 + 50 + 30 =80 期望:100   实际:0 数值有负数,边界应该设为-0x7f       此处 gg /* 期望的分:50+ */ ...

  7. 2018 11.1 PION 模拟赛

    期望:250  100+100+50 实际:210   80+100+30 期望:100   实际:80 最后:两个点T了.可能是求逆元的方法太慢了,也可能是闲的又加了一个快速乘的原因. #inclu ...

  8. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  9. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

随机推荐

  1. HDU 3033 I love sneakers! 我爱运动鞋 (分组背包+01背包,变形)

    题意: 有n<=100双鞋子,分别属于一个牌子,共k<=10个牌子.现有m<=10000钱,问每个牌子至少挑1双,能获得的最大价值是多少? 思路: 分组背包的变形,变成了相反的,每组 ...

  2. 通过StringBuilder的reverse()实现倒序

    import java.util.Scanner; public class ReverseString { public static void main(String[] args) { Scan ...

  3. iOS上架问题解决

    dns问题 http://iphone.91.com/tutorial/syjc/140509/21686339.html 网络问题 手机4g开wifi,上传提交多次 时间问题 东八区下午6点上架成功 ...

  4. UVA Live 3713 Astronauts (2-SAT)

    用布尔变量表示状态,把限制条件转化为XνY的形式以后跑2SAT,根据变量取值输出方案. #include<bits/stdc++.h> using namespace std; ; #de ...

  5. MIPS——递归调用

    嵌套过程 不调用其他过程的过程称为叶过程(leaf procedure).如果所有过程都是叶过程,那么情况就很简单.但是某个过程可以调用其他过程,甚至调用的是自身的“克隆”.在调用非叶过程时使用寄存器 ...

  6. video 的使用

    video ui给了默认的暂停图片 利用video自身的属性很难达到效果  这里自己写了个 简单记录下 <div class="cg-container video-img" ...

  7. Dubbo中的监控和管理

    一.Dubbo中的监控 1.原理 原理:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心. 2.搭建监控服务 3.修改配置文件 修改注册中心的地址: 注意:这个 ...

  8. kafka启动报错&问题解决

    kafka启动报错&问题解决 一早上班,就收到运维同事通知说有一台物理机宕机,导致虚拟机挂了.只得重启kafka服务器. 1.启动 启动zookeeper bin/zkServer.sh st ...

  9. NSLocale

      1.创建本地化对象 // 根据本地标识符创建本地化对象 NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier"e ...

  10. ES6新数据类型map与set

    一.map,简单的键值对映射,具有很快的查找速度 1. 初始化map,map的键名可以使用其他数据类型,对象的属性名只能使用字符串或symbol 使用二维数组 var m = new Map([['n ...