太蠢了……$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. Linux中grep、sed、awk使用介绍

    linux文件操作命令介绍1)grepgrep 用于在文件中查找符合条件的记录grep 参数 过滤条件 文件过滤的条件中可使用正则表达式-c 显示符合的行数-i 忽略大小写-n 显示符合要求的记录,包 ...

  2. threadLocal遇上线程池导致局部变量变化

    这两天一直在查无线app一个诡异的问题,表象是stg的接口返回数据,和线上接口的返回数据不一致. 1.初步判断:有缓存,查看代码后发现缓存时间直邮6分钟,而且同一个接口,其他调用方的返回数据,stg和 ...

  3. fluent_python1

    Magic Method python中有些跟对象本身有关的方法, 以两个下划线开始,两个下划线结束, 一般称为魔法方法(magic method). 比如 obj[key] 的背后就是 __geti ...

  4. JAVASCRIPT闭包以及原型链

    方法内部还有个方法,实例化父方法后,再次调用父方法,可以运行父方法内部的子方法,这样的程序就叫做闭包 DEMO如下: //function outerFn() { // var outerVar = ...

  5. httpmodule初识

    .net的请求流程: HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE- ...

  6. UVA 10003 cuting sticks 切木棍 (区间dp)

    区间dp,切割dp[i][j]的花费和切法无关(无后效性) dp[i][j]表示区间i,j的花费,于是只要枚举切割方法就行了,区间就划分成更小的区间了.O(n^3) 四边形不等式尚待学习 #inclu ...

  7. webStorm Ctrl+s 自动格式化 然后 保存 用宏命令

    使用WebStorm的Macros宏指令,实现保存的同时格式化代码,并跳至行尾 https://blog.csdn.net/gyz718/article/details/70556188

  8. ucosii(2.89)mutex 应用要点

    mutex 的创建在于共享资源打交道是可以可以保证满足互斥条件:1,必须保证继承优先级要高于可能与相应共享资源打交道的任务中优先级最高的优先级.2,不要将占有Mutex的任务挂起,也不要让占有mute ...

  9. 激活 IDEA, PyCharm

    1. 到网站 http://idea.lanyus.com/ 获取注册码. 2.填入下面的license server: http://intellij.mandroid.cn/ http://ide ...

  10. Xcode及Mac快捷键

    1. 文件 CMD + N: 新文件CMD + SHIFT + N: 新项目CMD + O: 打开CMD + S: 保存CMD + SHIFT + S: 另存为CMD + W: 关闭窗口CMD + S ...