太蠢了……$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. Azure 进阶攻略 | 关于Java 和事件中心的那不得不说的事

    物联网技术辣么火,虽然之前有说过不少,但今天,仍有一个憋在我心里已久,不得不说的话题:基于Azure 的物联网平台必不可少,你可能已经在使用,但也许并没有意识到的服务:Azure 事件中心. 啊?事件 ...

  2. Scroller 界面滑动

    Scroller 滑动之后滑动器子标签里面的控件,其自身是不动的.这里点在下面的进阶会体现出来.  1. 继承LinearLayout, 相对布局也可以. public class MyLinearL ...

  3. Robot Framework(十二) 执行测试用例——配置执行

    3.4配置执行 本节介绍可用于配置测试执行或后处理输出的不同命令行选项.与生成的输出文件相关的选项将在下一节中讨论. 3.4.1选择测试用例 通过测试套件和测试用例名称 按标签名称 当没有测试匹配选择 ...

  4. SSIS 通过 WINscp 从SFTP下载文件

    1.通过SSIS的process task调用 winscp :C:\Program Files (x86)\WinSCP\WinSCP.exe /script="C:\SFTPFile\T ...

  5. POI转换word doc文件为(html,xml,txt)

    在POI中还存在有针对于word doc文件进行格式转换的功能.我们可以将word的内容转换为对应的Html文件,也可以把它转换为底层用来描述doc文档的xml文件,还可以把它转换为底层用来描述doc ...

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

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

  7. 破解点触码的识别之第三方平台超级鹰的SDK(python3版本)

    import requestsfrom hashlib import md5 class Chaojiying(object): def __init__(self, username, passwo ...

  8. Zookeeper 集群 BindException: Cannot assign requested address 解决方案

    前言 经历: 最近在搭建zookeeper集群,基础是3台机器(尝试过ubuntu 17 和 Centos 7). 一开始选择的是3台腾讯云服务器,每台机器在java环境配置正确的情况下,单机的情况都 ...

  9. UNIX环境C语言进程通信

    一.信号管理 1.函数signal signal函数是UNIX系统信号机制最简单的接口 #include <signal.h> typedef void (*sighandler_t)(i ...

  10. Re:从零开始的Linux之路(杂谈)

    决定认真从零开始写一个Linux的学习过程,像我这么偷懒的人能写文字记录已经很不容易了,希望不要半途而废吧(拖走) 用多了Linux其实发现,要是哪天Linux和Windows能结合下就好了,简单粗暴 ...